更新时间:2023-05-23 来源:黑马程序员 浏览量:
在实际开发中,经常需要向数据库发送多条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语句。