Java批量插入结合PreparedStatement的核心是调用addBatch()和executeBatch(),通过预编译语句、开启数据库批处理支持(如MySQL需rewriteBatchedStatements=true)、逐条设参并加批、事务控制及异常处理来提升性能与安全性。

Java 中批量插入结合 PreparedStatement 的核心是调用 addBatch() 和 executeBatch(),而不是反复执行 executeUpdate()。这样能显著减少网络往返、提升性能,并避免 SQL 注入。
开启批处理并预编译语句
先创建带占位符的 SQL 语句,再通过 Connection.prepareStatement() 获取 PreparedStatement 对象。注意:需确保数据库驱动和连接 URL 支持批处理(如 MySQL 要加 rewriteBatchedStatements=true 参数才能真正合并为多值 INSERT)。
- MySQL 示例连接 URL:
jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true - PostgreSQL 默认支持批处理,无需额外参数
- Oracle 需启用
setExecuteBatch(100)或使用addBatch()+executeBatch()
逐条设置参数并加入批次
对每组数据,调用 setXxx() 方法绑定参数,再调用 addBatch() 将当前参数组合加入批次队列。不执行、不提交,只是缓存。
ps.setString(1, "Alice"); ps.setInt(2, 25); ps.addBatch();ps.setString(1, "Bob"); ps.setInt(2, 30); ps.addBatch();- 重复直到所有数据添加完毕
一次性执行并处理结果
调用 executeBatch() 提交整个批次。它返回一个 int[],每个元素对应一条语句影响的行数(正常为 1;若失败则抛 BatchUpdateException)。
立即学习“Java免费学习笔记(深入)”;
- 建议包裹在
try-catch中捕获BatchUpdateException - 可通过
ex.getUpdateCounts()获取已成功执行的条数 - 执行后记得调用
clearBatch()(虽然executeBatch()通常会自动清空,但显式调用更安全)
配合事务提升一致性与性能
批量插入应在事务中进行:关闭自动提交 → 批量执行 → 成功则 commit,失败则 rollback。
conn.setAutoCommit(false);- 执行
executeBatch() - 成功后
conn.commit();,异常时conn.rollback(); - 最后别忘了恢复
setAutoCommit(true)或统一管理连接生命周期


















