13.7.3 Java 8增强的批量更新

13.7.3 Java 8增强的批量更新

JDBC还提供了一个批量更新的功能,使用批量更新时,多条SQL语句将被作为一批操作被同时收集,并同时提交。
提示
批量更新必须得到底层数据库的支持,可以通过调用DatabaseMetaDatasupportsBatchUpdates()方法来查看底层数据库是否支持批量更新.
使用批量更新也需要先创建一个Statement对象,然后利用该对象的add Batcho方法将多条SQL语句同时收集起来,最后调用Java 8Statement对象新增的executeLargeBatch()(或原有的executeBatch())方法同时执行这些SQL语句。只要批量操作中任何一条SQL语句影响的记录条数可能超过Integer.MAX_VALUE,就应该使用executeLargeBatch()方法,而不是executeBatch()方法。
如下代码片段示范了如何执行批量更新。

1
2
3
4
5
6
7
8
Statement stmt=conn.createStatement();
//使用Statement同时收集多条SQL语句
stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt. addBatch(sql3);
...
//同时执行所有的SQL语句
stmt.executeLargeBatch();

执行executeLargeBatch()方法将返回一个long数组,因为使用Statement执行DDLDML语句都将返回一个long值,而执行多条DDLDML语句将会返回多个long值,多个long值就组成了这个long数组。

如果在批量更新的addBatch()方法中添加了select査询语句,程序将直接出现错误

编程要点

为了让批量操作可以正确地处理错误,必须把批量执行的操作视为单个事务,如果批量更新在执行过程中失败,则让事务回滚到批量操作开始之前的状态。
为了达到这种效果,程序应该在开始批量操作之前先关闭自动提交,然后开始收集更新语句,当批量操作执行结束后,提交事务,并恢复之前的自动提交模式。如下代码片段所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//1.保存当前的自动的提交模式
boolean autoCommit= conn.getAutoCommit();
//2.关闭自动提交
conn.setAutoCommit(false);
//3.使用 Statement同时收集多条SQL语句
stmt.addBatch(sql1);
stmt.addBatch(sql2);
stmt.addBatch(sql3);
...
//4.同时提交所有的SQL语句
stmt.executeLargeBatch();
//5.提交修改
conn.commit();
//6.恢复原有的自动提交模式
conn.setAutoCommit(autoCommit);

注意
MySQL的最新驱动程序依然不支持executeLargeBatch()方法,对于数据库驱动不支持executeLargeBatch()的情形,则只能依然使用传统的executeBatch()方法