JDBC BatchUpdate 通过 PreparedStatement.addBatch() 和 executeBatch() 批量执行SQL,需参数化语句、关闭自动提交、合理设置批次大小,并用try-with-resources确保资源释放。

Java 中使用 JDBC 的 BatchUpdate 机制,核心是通过 PreparedStatement.addBatch() 累积多条 SQL,再用 executeBatch() 一次性提交给数据库,显著减少网络往返、提升批量插入/更新性能。
准备支持批处理的 PreparedStatement
必须使用 PreparedStatement(不能用 Statement),且推荐显式关闭自动提交(connection.setAutoCommit(false))以控制事务边界:
- SQL 模板需参数化(如
INSERT INTO user(name, age) VALUES(?, ?)),确保所有批次语句结构一致 - 获取
PreparedStatement时,建议传入ResultSet.TYPE_FORWARD_ONLY和ResultSet.CONCUR_READ_ONLY以减少资源开销 - 若数据库驱动支持(如 MySQL 8.0+、PostgreSQL),可在连接 URL 中添加
rewriteBatchedStatements=true(MySQL)或启用reWriteBatchInserts=true(PostgreSQL),让驱动底层重写为更高效的多值 INSERT
逐条添加参数并累积批次
对每组参数调用 setXxx() 设置占位符,再调用 addBatch() 入队:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 不要在循环中反复创建
PreparedStatement,应在循环外创建一次 - 可设定批次大小(如 1000 条),避免内存溢出;达到阈值后立即
executeBatch()并clearBatch() - 示例逻辑:ps.setString(1, "Alice"); ps.setInt(2, 25); ps.addBatch();
执行并处理返回结果
调用 executeBatch() 返回 int[] 数组,每个元素表示对应 SQL 的影响行数(成功为非负值,失败为 Statement.EXECUTE_FAILED):
立即学习“Java免费学习笔记(深入)”;
- 若未开启事务,每批执行后自动提交;开启事务后,需手动
connection.commit()或rollback() - 捕获
BatchUpdateException:可通过e.getUpdateCounts()获取已执行成功的部分结果,并检查哪些条目失败 - 注意:某些数据库(如 Oracle)默认不返回每条语句的行数,需配置驱动参数或改用
getGeneratedKeys()配合主键回填
释放资源与异常安全收尾
无论成功或失败,都必须显式关闭 PreparedStatement 和 Connection:
- 推荐使用 try-with-resources(JDK 7+)自动管理
PreparedStatement和Connection - 若发生异常且事务未提交,应主动
connection.rollback()避免脏数据残留 - 批量结束后调用
ps.clearBatch()是良好习惯,但非必需(下次addBatch()会自动清空)

















