Java中批量删除需用PreparedStatement复用预编译语句、参数绑定和executeBatch,禁用自动提交并手动事务控制,单批建议500~1000条,避免IN动态参数与内存溢出。

Java 中使用 PreparedStatement 执行批量删除,核心是复用预编译语句 + 参数绑定 + 批量提交,避免逐条执行的性能损耗和 SQL 注入风险。
准备带参数的 DELETE 语句
DELETE 语句必须包含参数占位符(?),不能拼接字符串。常见模式是按主键或唯一条件批量删:
- 按 ID 列表删除:
DELETE FROM user WHERE id = ? - 按业务码删除:
DELETE FROM order WHERE order_no = ? - 不支持
IN (?, ?, ?)动态变长参数 —— 必须为每个待删记录单独 addBatch()
设置自动提交为 false 并复用 PreparedStatement
开启事务控制,显式 commit,避免每条都提交;同一个 PreparedStatement 实例反复 setParameter + addBatch:
String sql = "DELETE FROM user WHERE id = ?";
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
<pre class="brush:php;toolbar:false;">conn.setAutoCommit(false); // 关键:关闭自动提交
for (Long id : idList) {
ps.setLong(1, id);
ps.addBatch(); // 不执行,只入队
}
int[] results = ps.executeBatch(); // 一次性触发所有 DELETE
conn.commit(); // 提交事务
}
处理批量执行结果与异常
executeBatch() 返回 int[],每个元素对应一次 addBatch 的影响行数(成功为 ≥0,失败为 Statement.EXECUTE_FAILED):
- 检查返回值可确认是否真删了数据(例如
results[i] == 0表示该 ID 不存在) - 发生异常时需 rollback,并捕获
BatchUpdateException获取部分失败信息 - 建议限制单批数量(如 500~1000 条),防止内存溢出或数据库锁表过久
替代方案:分页 + 批量(适合超大数据量)
若待删记录达十万级以上,不建议一次性加载全部 ID 到内存。可改用“子查询+分页删除”:
executeUpdate()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











