Java批量数据库操作核心是用PreparedStatement的addBatch()和executeBatch()配合预编译防注入并提效;必须先setAutoCommit(false),再复用同一PreparedStatement设参、分批(如每1000条)executeBatch()后commit,异常时rollback,并注意clearBatch()防内存溢出。

Java 中批量数据库操作结合 PreparedStatement,核心是用 addBatch() 和 executeBatch() 配合预编译语句,既能防 SQL 注入,又能显著提升插入/更新性能。
开启批处理前的关键准备
必须关闭自动提交(auto-commit),否则每条 executeBatch() 都会隐式提交,失去批处理意义:
- 调用
connection.setAutoCommit(false) - 执行完
executeBatch()后手动commit() - 发生异常时及时
rollback() - 注意连接池(如 HikariCP)中 auto-commit 默认常为 true,需显式配置或代码中设置
正确使用 addBatch 绑定参数
每次循环中,不能新建 PreparedStatement,而应复用同一个实例,仅重新设参数后调用 addBatch():
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 错误写法:循环内反复
connection.prepareStatement(sql)→ 失去预编译优势,还可能触发数据库游标泄漏 - 正确写法:一次 prepare,循环中
ps.setString(1, name); ps.setInt(2, age); ps.addBatch(); - 参数设置必须在
addBatch()前完成,且每次都要设全(即使某字段为 null,也要调用setNull())
控制批大小避免内存或超时问题
不建议一次性把几万条全加进 batch,容易 OOM 或触发数据库超时。推荐分批次提交:
立即学习“Java免费学习笔记(深入)”;
- 每 1000 条左右执行一次
executeBatch(),清空批次:ps.clearBatch() - 示例:循环中
if (i % 1000 == 0) { ps.executeBatch(); connection.commit(); } - 最后别忘了处理剩余未提交的记录:
if (count % 1000 != 0) ps.executeBatch(); - 具体数值根据数据行大小、JVM 内存和数据库配置调整(如 MySQL 的
max_allowed_packet)
异常处理与返回结果处理
executeBatch() 返回 int[],每个元素对应一条语句的受影响行数(成功为 ≥0,失败为 Statement.EXECUTE_FAILED):
- 若启用
rewriteBatchedStatements=true(MySQL JDBC 驱动特有优化),实际发送的是单条多值 INSERT,返回数组长度通常为 1,值为总影响行数 - 捕获
BatchUpdateException,可通过e.getUpdateCounts()获取已执行语句的结果,定位哪条出错 - 不要忽略返回值——它能帮你确认是否真的写入成功,尤其在部分失败场景下

















