天天看点

13.7.3 Java 8增强的批量更新13.7.3 Java 8增强的批量更新

  • 13.7.3 Java 8增强的批量更新
    • 编程要点

13.7.3 Java 8增强的批量更新

JDBC

还提供了一个批量更新的功能,使用批量更新时,多条

SQL

语句将被作为一批操作被同时收集,并同时提交。

提示

批量更新必须得到底层数据库的支持,可以通过调用

DatabaseMetaData

supportsBatchUpdates()

方法来查看底层数据库是否支持批量更新.

使用批量更新也需要先创建一个

Statement

对象,然后利用该对象的

add Batcho

方法将多条

SQL

语句同时收集起来,最后调用

Java 8

Statement

对象新增的

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

执行

DDL

DML

语句都将返回一个

long

值,而执行多条

DDL

DML

语句将会返回多个

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()

方法

原文链接: 13.7.3 Java 8增强的批量更新