Java中PreparedStatement批量执行SQL需先addBatch()累积参数再executeBatch()提交,关键在开启批处理、固定SQL模板、合理设批次大小;MySQL需URL加rewriteBatchedStatements=true优化INSERT性能。

Java 中使用 PreparedStatement 批量执行 SQL,核心是调用 addBatch() 累积参数,再用 executeBatch() 一次性提交。关键在于开启批处理、正确绑定参数、控制批次大小,避免内存溢出或事务过长。
开启批处理并预编译语句
创建 PreparedStatement 时,SQL 模板需固定(不能拼接列名或表名),占位符 ? 用于动态值:
String sql = "INSERT INTO user(name, age) VALUES(?, ?)"; PreparedStatement ps = connection.prepareStatement(sql);
注意:MySQL 默认不启用重写批处理,如需提升性能,连接 URL 可加参数:
?rewriteBatchedStatements=true(仅对 INSERT 有效,且要求驱动版本 ≥5.1.13)。
逐条添加参数并累积到批处理
每次调用 setXxx() 设置当前行参数后,必须立即调用 addBatch(),否则该行不会进入批次:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
ps.setString(1, "Alice");ps.setInt(2, 25);ps.addBatch(); // 必须调用,才把这组参数加入批次- 重复上述三步,添加多行数据
执行批处理并处理结果
调用 executeBatch() 返回 int[] 数组,每个元素表示对应 SQL 的影响行数(成功为 ≥0,失败为 Statement.EXECUTE_FAILED):
立即学习“Java免费学习笔记(深入)”;
int[] results = ps.executeBatch(); // 检查是否全部成功 boolean allSuccess = Arrays.stream(results).allMatch(r -> r >= 0);
若某条失败且未设 continueBatchOnError=false(MySQL 默认 true),整个批次会中断;建议捕获 BatchUpdateException 并检查 getUpdateCounts() 定位错误位置。
手动分批 + 显式事务控制(推荐生产用)
大数据量时,避免单次 batch 过大导致 OOM 或锁表太久。常见做法是每 1000 条提交一次,并配合事务:
- 调用
connection.setAutoCommit(false)关闭自动提交 - 循环中每累积
N条(如 1000)就调用ps.executeBatch()和connection.commit() - 最后处理剩余不足 N 条的数据
- 发生异常时调用
connection.rollback()

















