在 Java 中“批量插入 SQL”通常指 一次向数据库插入多条数据,而不是一条一条执行 INSERT,以提升性能。常见做法有以下几种:
addBatch() + executeBatch()(最基础、最通用)String sql = "INSERT INTO user(name, age) VALUES (?, ?)";
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
conn.setAutoCommit(false); // 关闭自动提交
for (User user : userList) {
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
ps.addBatch(); // 添加到批处理
}
ps.executeBatch(); // 批量执行
conn.commit(); // 提交事务
}
rewriteBatchedStatements=true(MySQL 很重要)jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
foreach 拼接 SQL(简单,但 SQL 长度有限)<insert id="batchInsert">
INSERT INTO user(name, age) VALUES
<foreach collection="list" item="u" separator=",">
(#{u.name}, #{u.age})
</foreach>
</insert>
mapper.batchInsert(userList);
⚠️ 数据量很大时可能超出 SQL 长度限制
try (SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
UserMapper mapper = session.getMapper(UserMapper.class);
for (User u : userList) {
mapper.insert(u);
}
session.commit();
}
String sql = "INSERT INTO user(name, age) VALUES (?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setString(1, userList.get(i).getName());
ps.setInt(2, userList.get(i).getAge());
}
@Override
public int getBatchSize() {
return userList.size();
}
});
entityManager.unwrap(Session.class)
.setJdbcBatchSize(50);
for (int i = 0; i < list.size(); i++) {
entityManager.persist(list.get(i));
if (i % 50 == 0) {
entityManager.flush();
entityManager.clear();
}
}
✅ 关闭自动提交
✅ 每批 500~1000 条
✅ MySQL 加 rewriteBatchedStatements=true
✅ 大批量用文件导入(LOAD DATA / COPY)更快
LOAD DATA INFILECOPYSQL*Loader如果你能告诉我:
我可以给你最合适的批量插入方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。