java中jdbc批处理获取每条语句影响行数,需用preparedstatement.addbatch()和executebatch(),返回int[]数组;仅dml语句有效,需驱动支持,注意异常处理与事务控制。

Java 中用 JDBC 执行批处理并获取每条语句的影响行数,核心在于使用 PreparedStatement.addBatch() 提交多条语句,再调用 executeBatch() 执行,并通过返回的 int[] 数组获取各条语句影响的行数。但要注意:只有 DML 语句(INSERT/UPDATE/DELETE)能返回有效行数,DDL(如 CREATE)或 SELECT 不适用;且需数据库驱动支持批量返回行数(主流驱动如 MySQL Connector/J、PostgreSQL JDBC 都支持)。
启用批处理并添加语句
使用 PreparedStatement(不能用 Statement),确保 SQL 是参数化模板,然后反复设置参数并调用 addBatch():
- 连接需开启批量支持(多数驱动默认支持,无需额外配置)
- SQL 必须是同一结构(例如都是 INSERT INTO t VALUES (?, ?)),否则可能抛出异常或结果不可靠
- 避免在循环中频繁调用
addBatch()后立即executeBatch(),应积攒一定数量(如 1000 条)再执行,提升效率
执行并获取影响行数数组
调用 executeBatch() 返回 int[],每个元素对应一次 addBatch() 的影响行数:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 成功执行时,值为非负整数(如 1 表示插入 1 行,0 表示 UPDATE 无匹配行)
- 若某条语句失败,默认会抛出
BatchUpdateException,此时可通过getUpdateCounts()获取已执行语句的结果(未执行的为Statement.EXECUTE_FAILED) - 注意:MySQL 默认开启
rewriteBatchedStatements=true可将多条 INSERT 合并为一条,大幅提升性能并保证行数准确;PostgreSQL 则依赖服务器端批量协议(JDBC 4.2+ 支持)
处理 BatchUpdateException 获取部分结果
当批处理中某条语句失败,JDBC 通常中断执行,但可捕获异常并读取已成功执行的部分结果:
- 调用
exception.getUpdateCounts()得到int[],其中成功项为实际行数,失败项为Statement.EXECUTE_FAILED(值为 -3) - 可通过遍历该数组判断哪些语句成功、哪些失败,再决定是否重试或记录日志
- 不建议忽略异常直接吞掉错误,应明确处理失败场景(如回滚事务、告警、补偿等)
完整示例(含事务与异常处理)
以下是一个安全执行批处理并打印每条语句影响行数的典型写法:
Connection conn = dataSource.getConnection();
conn.setAutoCommit(false); // 开启事务
PreparedStatement ps = conn.prepareStatement("INSERT INTO user(name, age) VALUES (?, ?)");
try {
for (User u : users) {
ps.setString(1, u.getName());
ps.setInt(2, u.getAge());
ps.addBatch();
}
int[] rows = ps.executeBatch(); // 执行全部
for (int i = 0; i
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










