批处理,就是字面上的意思,一次性处理一批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数据库,只需几十秒便可完成。