PreparedStatement批处理
当向同一个数据表中批量更新数据时,如果使用Statement,需要书写很多SQL语句,这时,为了避免重复代码的书写,可以使用PreparedStatement 实现批处理。与Statement相比,PreparedStatement 灵活许多,它既可以使用完整的SQL,也可以使用带参数的不完整SQL。但是,对于不完整的SQL,其具体的内容是采用“?”占位符形式出现的,设置时要按照“?”顺序设置具体的内容。
为了帮助大家更好地学习如何使用PreparedStatement 实现批处理,接下来,通过一个案例来演示,如例1所示。
例1 Example11.java
1 package cn.itcast.jdbc.example;
2 import java.sql.Connection;
3 import java.sql.Date;
4 import java.sql.PreparedStatement ;
5 import cn.itcast.jdbc.example.utils.JDBCUtils;
6 public class Example11 {
7 public static void main(String[] args) {
8 Connection conn = null;
9 PreparedStatement preStmt = null;
10 try {
11 // 加载并注册数据库驱动
12 conn=JDBCUtils.getConnection();
13 String sql = "INSERT INTO users(name,password,email,birthday)"
14 + "VALUES(?,?,?,?)";
15 preStmt = conn.prepareStatement(sql);
16 for (int i = 0; i < 5; i++) {
17 preStmt.setString(1, "name" + i);
18 preStmt.setString(2, "password" + i);
19 preStmt.setString(3, "email" + i + "@itcast.cn");
20 preStmt.setDate(4, Date.valueOf("1989-02-19"));
21 preStmt.addBatch();
22 }
23 preStmt.executeBatch();
24 } catch (Exception e) {
25 e.printStackTrace();
26 } finally { // 释放资源
27 JDBCUtils.release(null, preStmt, conn);
28 }
29 }
30 }
程序运行后,users表中会同时添加五条数据。为了查看数据添加是否成功,进入MySQL,使用SELECT语句查看users表,结果如下所示:
mysql> select * from users;
+----+--------+-----------+------------------+------------+
| id | name | password | email | birthday |
+----+--------+-----------+------------------+------------+
| 1 | zs | 123456 | zs@sina.com | 1980-12-04 |
| 2 | lisi | 123456 | lisi@sina.com | 1981-12-04 |
| 3 | wangwu | 123456 | wangwu@sina.com | 1979-12-04 |
| 5 | hl | 123 | hl@sina.com | 2015-04-18 |
| 6 | name0 | password0 | email0@itcast.cn | 1989-02-19 |
| 7 | name1 | password1 | email1@itcast.cn | 1989-02-19 |
| 8 | name2 | password2 | email2@itcast.cn | 1989-02-19 |
| 9 | name3 | password3 | email3@itcast.cn | 1989-02-19 |
| 10 | name4 | password4 | email4@itcast.cn | 1989-02-19 |
+----+--------+-----------+------------------+------------+
9 rows in set (0.00 sec)
从上述结果可以看出,Example11批量添加了5条数据。由此可见,当向同一个表中批量添加或者更新数据的时候,使用PreparedStatement比较方便。
注意:
批处理执行SELECT语句会报错。因为Statement和PreparedStatement 的executeBatch()方法的返回值都是int[]类型,所以,能够进行批处理的SQL语句必须是INSERT、UPDATE、DELETE等返回值为int类型的SQL语句。