首页技术文章正文

JDBC怎样实现批处理?【案例演示】

更新时间:2023-05-23 来源:黑马程序员 浏览量:

IT培训班

在实际开发中,经常需要向数据库发送多条SQL语句,这时,如果逐条执行这些SQL语句,效率会很低。为此,JDBC提供了批处理机制,即同时执行多条SQL语句。Statement和PreparedStatement都实现了批处理,本节将针对它们的批处理方式进行详细的讲解。

1.Statement批处理

当向数据库发送多条不同的SQL语句时,可以使用Statement实现批处理。Statement通过addBatch()方法添加一条SQL语句,通过executeBatch()方法批量执行SQL语句。为了帮助读者更好地学习如何使用Statement实现批处理,下面通过一个案例来演示。

package cn.itcast.jdbc.example;
import java.sql.Connection;
import java.sgl.Statement;
import cn.itcast.jdbc.example.utils.JDBCUtils;
public class Example10 {
     public static void main (String[] args) {
     connection conn=null:
     statement stmt=null;
     try {
       //加载数据库驱动
       conn= JDBCUtils.getConnection():
       stmt*conn.createStatement();
       //SQL语句
     String sql1="DROP TABLE IF EXISTS school";
     String sq12="CREATE TABLE school (id int,name varchar(20))";
     String sql3="INSERT INTO school VALUES(2,'传智播客')";
     String sql4="UPDATE school SET id=1";
       //Statement 批处理 SQL语句
       stmt.addBatch(aql1);
       stmt.addBatch (sql2):
       stmt.addBatch(sql3);
       stmt.addBatch (sq14);
       stmt.executeBatch();
    } catch (Exception e) {
       e.printStackTrace();
    } finally{                        //释放资源
        JDBCUtils.release (null,stmt,conn);
    }
  }
}

程序运行过程中,Statement会将4条SQL语句提交给数据库一起执行。为了验证例1-13中的SQL语句是否执行成功,进入MySQL,使用SELECT语句查看school表,JhmSQI嘉句的执行结果如下所示。

mysql>select · from school;
+------+--------------+
|  id  |  name        |
+------+--------------+
|   1  |  传智播客    |
+------+--------------+
1 row in set (0.00 sec)

从上述结果可以看出,school表存在,并且向表中添加了一条数据,该数据的id被成功修改成了1。

2. PreparedStatement 批处理

当向同一个数据表中批量更新数据时,如果使用Sratement,需要书写很多SQL语句,这时,为了避免重复代码的书写,可以使用PreparedStatement 实现批处理。与Statement相比,PreparedStatement灵活许多,它既可以使用完整的SQL,也可以使用带参数的不完整SQL。但是,对于不完整的SQL,其具体的内容是采用“?”占位符形式出现的,设置时要按照“?”顺序设置具体的内容。

为了帮助读者更好地学习如何使用PreparedStatement实现批处理,下面通过一个案例来演示。

package cn.itcast.jdbc.example;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement ;
import  cn.itcast.jdbc.example.utils.JDBCUtils;
public class Exanple11 {
    public static void main (String[] args) {
        Connection conn=null;
        PreparedStatement preStmt=null;
        try {
            //加载并注册数据库驱动
             conn=JDBCUtils.getConnection():
            String sql="INSERT INTO users(name,password,email,birthday)"
                   +"VALUES(?,?,?,?)";
            preStmt=conn.prepareStatement(sq1);
            for (int i=0;i<5;i++)(
                preStmt.setString(1, "name"+i);
                preStmt.setString(2,"password"+i);
                preStmt.setString(3,"email"+i+"9itcast.cn");
                preStmt.setDate(4, Date.valueOf("1989-02-19"));
                preStmt.addBatch();
             }
             preStmt.executeBatch():
        } catch (Exception e) {
            e.printStackTrace();

        } finally{                //释放资源
            JDBCUtils.release (null, preStmt, conn);
        }
    }
}

程序运行后,users表中会同时添加5条数据。为了查看数据添加是否成功,进入MySQL,使用SELECT语句查看 users表,结果如下所示。

mysql>select * from users;
+-----+-----------+------------+--------------------+--------------+
|id   |  name     |  password  |  email             |  birthday    |
+-----+-----------+------------+--------------------+--------------+
|  1  |  za       |  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)

从上述结果可以看出,Examplel1批量添加了5条数据。由此可见,当向同一个表中批量添加或者更新数据的时候,使用PreparedStatement比较方便。

注意:批处理执行SELECT语句会报错。因为Statement和 PreparedStatement的executeBatch()方法的返回值都是int[]类型,所以,能够进行批处理的SQL语句必须是INSERT、UPDATE、DELETE等返回值为int类型的SQL语句。


分享到:
在线咨询 我要报名
和我们在线交谈!