java中preparedstatement批量插入需复用sql模板、循环setxxx()设参并addbatch(),再分批executebatch()提交;mysql需url加rewritebatchedstatements=true优化。

Java 中用 PreparedStatement 实现批量插入,核心是复用同一 SQL 语句、分批设置参数并调用 addBatch(),最后统一执行 executeBatch()。关键在于避免逐条 executeUpdate(),否则失去批量意义。
准备带占位符的 SQL 和 PreparedStatement
SQL 中只写一条模板(如插入单行),所有参数用 ? 占位,不能拼接字段名或表名:
String sql = "INSERT INTO user (name, age, email) VALUES (?, ?, ?)"; PreparedStatement ps = connection.prepareStatement(sql);
注意:不同数据库对批量插入支持略有差异(如 MySQL 默认关闭 rewriteBatchedStatements,开启后性能显著提升)。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
循环设置每行参数并添加到批处理
对每一组数据,按顺序调用 setXxx(index, value) 设置参数,再调用 addBatch():
for (User user : userList) {
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
ps.setString(3, user.getEmail());
ps.addBatch(); // 不执行,只暂存
}
- 索引从 1 开始,对应 SQL 中第几个
? - 每次
addBatch()前必须确保参数已设全,否则会使用上一次的旧值 - 大批量数据建议分批提交(如每 1000 条
executeBatch()一次),防止内存溢出或事务过长
执行批量并处理结果
调用 executeBatch() 执行全部累积的语句,返回每条语句影响的行数数组:
int[] rows = ps.executeBatch();
System.out.println("共插入 " + rows.length + " 条记录");
// 可选:检查每条是否成功(-2 表示未报告,0 或正数为影响行数)
- 执行后批处理清空,如需再插,要重新
addBatch() - 遇到异常时,部分语句可能已执行(取决于数据库和驱动),建议在事务中操作并捕获
BatchUpdateException - MySQL 驱动需显式启用批量优化:
?rewriteBatchedStatements=true加在 JDBC URL 后
完整示例(含事务与异常处理)
实际使用中应包裹在事务里,并正确释放资源:
Connection conn = null;
PreparedStatement ps = null;
try {
conn = dataSource.getConnection();
conn.setAutoCommit(false); // 关闭自动提交
String sql = "INSERT INTO user (name, age, email) VALUES (?, ?, ?)";
ps = conn.prepareStatement(sql);
for (User user : userList) {
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
ps.setString(3, user.getEmail());
ps.addBatch();
// 每 1000 条执行一次,防内存压力
if (userList.indexOf(user) % 1000 == 999) {
ps.executeBatch();
ps.clearBatch();
}
}
ps.executeBatch(); // 提交剩余
conn.commit();
} catch (SQLException e) {
if (conn != null) conn.rollback();
throw e;
} finally {
if (ps != null) ps.close();
if (conn != null) conn.close();
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










