jdbc基础 (四) 批处理
批处理,就是字面上的意思,一次性处理一批sql语句。
直接看例子吧:
1 package com.cream.ice.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 8 import org.junit.Test; 9 10 /** 11 * 12 * 假设已经存在表test: 13 * create table test( 14 * id int primary key, 15 * name varchar(20) 16 * ); 17 * 18 * @author ice 19 * 20 */ 21 22 public class Batch { 23 private Connection connection; 24 private Statement statement; 25 private PreparedStatement preStatement; 26 private ResultSet resultSet; 27 28 /** 29 * 向ttest中插入2条记录,删除掉第1条 30 * 由于批处理的多条语句不同,所以使用Statement进行批处理 31 */ 32 @Test 33 public void testBatch1() { 34 try { 35 connection = JdbcUtils.getConnection(); 36 statement = connection.createStatement(); 37 38 String sql1 = "insert into test (id,name) values(1,'Tom')"; 39 String sql2 = "insert into test (id,name) values(2,'Jack')"; 40 String sql3 = "delete from test where id=1"; 41 42 // 内部维护了一个List,将sql语句加到List中 43 statement.addBatch(sql1); 44 statement.addBatch(sql2); 45 statement.addBatch(sql3); 46 47 // 执行批处理 48 int num[] = statement.executeBatch(); 49 50 // i为每条语句影响到的行数 51 for (int i : num) 52 System.out.print(i + " "); 53 54 } catch (Exception e) { 55 e.printStackTrace(); 56 } finally { 57 JdbcUtils.releaseResources(null, statement, connection); 58 } 59 } 60 61 /** 62 * 向test中插入100条记录 63 * 由于语句完全相同,只是参数不同,使用PreparedStatement 64 */ 65 @Test 66 public void testBatch2() { 67 try { 68 connection = JdbcUtils.getConnection(); 69 70 String sql = "insert into test (id,name) values(?,?)"; 71 72 preStatement = connection.prepareStatement(sql); 73 74 // 要插入100条记录 75 for (int i = 0; i < 100; i++) { 76 preStatement.setInt(1, i + 1); 77 preStatement.setString(2, "No." + (i + 1)); 78 preStatement.addBatch(); 79 } 80 81 // 执行批处理语句 82 preStatement.executeBatch(); 83 84 statement=connection.createStatement(); 85 resultSet=statement.executeQuery("select * from test"); 86 87 //将插入记录打印到控制台上 88 while(resultSet.next()){ 89 System.out.print("id:"+resultSet.getInt("id")+" "); 90 System.out.println("name:"+resultSet.getString("name")); 91 } 92 93 } catch (Exception e) { 94 e.printStackTrace(); 95 } finally { 96 JdbcUtils.releaseResources(null, preStatement, connection); 97 JdbcUtils.releaseResources(resultSet, statement, connection); 98 } 99 } 100 }
代码里使用了工具类JdbcUtils,可参阅jdbc基础 (二) 通过properties配置文件连接数据库中的实现。
第一个例子中由于批处理的多条语句不同,所以使用Statement进行批处理。
第二个例子中由于语句完全相同,只是参数不同,使用PreparedStatement来处理。
这里值得注意的是,在第二个例子中,如果批处理语句数量不是100,而是达到几十万或上百万条,则在mysql中是极为耗时的,需要若干小时才可处理完,但如果换成oracle数据库,只需几十秒便可完成。