Java中PreparedStatement批处理需先addBatch()累积操作、再executeBatch()提交,必须用PreparedStatement而非Statement,配合事务控制与分批提交以提升性能并保障一致性。

Java 中使用 PreparedStatement 进行批处理(batch processing),核心是调用 addBatch() 累积 SQL 操作,再用 executeBatch() 一次性提交。这种方式比逐条执行更高效,尤其适合插入、更新大量数据。
准备带参数的 PreparedStatement
必须使用预编译语句(PreparedStatement),不能用 Statement,因为只有 PreparedStatement 支持参数化批处理。
- SQL 语句中用
?占位,每次循环前用setXxx()设置参数 - 确保连接未关闭、事务未提前提交
- 推荐显式关闭自动提交:
connection.setAutoCommit(false),便于统一控制提交或回滚
循环中调用 addBatch() 添加批次
每次设置完参数后,立即调用 addBatch(),它不会执行 SQL,只是把当前参数组合存入内部队列。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不要在循环里调用
executeUpdate()或executeQuery() - 可按固定数量(如每 1000 条)分批提交,避免内存占用过高
- 示例片段:
String sql = "INSERT INTO user(name, age) VALUES(?, ?)";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
for (User u : users) {
ps.setString(1, u.getName());
ps.setInt(2, u.getAge());
ps.addBatch(); // 只添加,不执行
if (i % 1000 == 0) {
ps.executeBatch(); // 每 1000 条执行一次
ps.clearBatch(); // 清空已执行批次,避免重复提交
}
}
ps.executeBatch(); // 提交剩余
}
执行 executeBatch() 并处理结果
executeBatch() 返回 int[],每个元素对应一条 SQL 的影响行数(如 INSERT 返回 1,UPDATE 返回匹配并修改的行数);若某条失败,默认抛出 BatchUpdateException。
立即学习“Java免费学习笔记(深入)”;
- 捕获
BatchUpdateException可获取部分成功结果:getUpdateCounts()返回已执行语句的结果数组 - 注意:默认 JDBC 驱动遇到错误会中断整个批次(“全有或全无”),MySQL 需加
continueBatchOnError=false参数才支持部分失败继续 - 执行后建议调用
clearBatch(),尤其复用同一 PreparedStatement 时,防止旧批次残留
事务控制与资源释放
批处理通常涉及大量数据,必须配合事务管理,否则可能造成数据不一致。
- 开启事务:
conn.setAutoCommit(false) - 成功后调用
conn.commit();失败则conn.rollback() - 务必在
finally或 try-with-resources 中关闭PreparedStatement和Connection - 某些数据库(如 Oracle)对 batch size 敏感,过大可能触发 ORA-01000(游标超限),建议控制单批 1000~5000 行

















