阅读本文需要的先修知识:
- 最基本的SQL语句
- 最基本的JDBC操作(如插入单条记录)
如急需使用请直接看最后一段代码。
在JDBC中,插入记录最简单的方法是使用executeUpdate()方法,但该方法中的参数只能是单条SQL语句,其实对于需要INSERT或者UPDATE多条记录的情况,JDBC也提供了批量更新的机制。
1.事务
批量更新基于事务处理,JDBC提供了两个方法void commit()和void rollback(),这两个函数的用法正如大部分SQL数据库中提供的事务处理语句一样,commit()方法用来提交多条语句,rollback()方法用来回滚至执行本次事务之前的状态。
请看如下代码:
public static void main(String[] args) { Connection conn; Statement stmt; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection(DB_URL, USER, PASS); //DB_URL,USER,PASS均为事先定义好的字符串,分别代表数据库地址,登录用户名,密码 stmt = conn.createStatement(); conn.setAutoCommit(false); stmt.executeUpdate("INSERT INTO test(id, name, tel) VALUES(1, 'Chandler', '1111111')"); stmt.executeUpdate("INSERT INTO test(id, name, tel) VALUES(2, 'Joey', '2222222')"); stmt.executeUpdate("INSERT INTO test(id, name, tel) VALUES(3, 'Rachel', '3333333')"); conn.commit(); stmt.executeUpdate("INSERT INTO test(id, name, tel) VALUES(4, 'Monica', '4444444')"); stmt.executeUpdate("INSERT INTO test(id, name, tel) VALUES(5, 'Ross', '5555555')"); stmt.executeUpdate("INSERT INTO test(id, name, tel) VALUES(6, 'Phoebe', '666666')"); stmt.close(); conn.close(); } catch (SQLException se) { se.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }在执行命令之前,我们首先调用了一个参数为false的setAutoCommit()方法,这个方法的作用是使得在其之后执行的命令不会立即被提交给数据库,而是等到下一次调用commit()方法时,才一次性全部提交。
在上面的代码中,我们首先执行了3条插入语句,然后进行了一次提交,之后又执行了3条插入语句,不同的是这3条插入语句执行后没有进行提交。执行这个程序之后,结果是这样的。
mysql> select * from test; +----+----------+---------+ | id | name | tel | +----+----------+---------+ | 1 | Chandler | 1111111 | | 2 | Joey | 2222222 | | 3 | Rachel | 3333333 | +----+----------+---------+ 3 rows in set (0.00 sec)可见后面3条插入命令因为还没有commit,所以是没有生效的。就这个结果来看,利用这样的方法,我们就可以先执行多条插入语句,再进行一次commit,达到一次插入多条记录的效果。但事实上,这样和不使用事务没有太大的区别,性能也没有什么提高,真正要实现批量插入,我们还需要借助JDBC的批量更新机制。
2.批量更新
在这里我们主要需要使用两个方法,分别是void addBatch(String command)和int[] executeBatch()。我们通过对上面的代码做一些改动来探究这两个方法的用法。
public static void main(String[] args) { Connection conn; Statement stmt; try { Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection(DB_URL, USER, PASS); //DB_URL,USER,PASS均为事先定义好的字符串,分别代表数据库地址,登录用户名,密码 stmt = conn.createStatement(); conn.setAutoCommit(false); stmt.addBatch("INSERT INTO test(id, name, tel) VALUES(1, 'Chandler',
