业务场景:
当需要向数据库发送一批
SQL
语句执行时,应避免向数据库一条条的发送执行,而应采用
JDBC
的批处理机制,以提升执行效率。
实现批处理的第一种方式
采用如下方法:
Statement.addBatch(sql)
执行批处理
SQL
语句
executeBatch()
方法:执行批处理命令
clearBatch()方法:清除批处理命令
优点:
可以向数据库发送多条不同的SQL语句。
缺点:
SQL
语句没有预编译。
当向数据库发送多条语句相同,但仅参数不同的
SQL
语句时,需重复写上很多条
SQL
语句。例如:
Insert into user(name,password) values(
‘
aa
’
,
’
111
’
);
Insert into user(name,password) values(
‘
bb
’
,
’
222
’
);
Insert into user(name,password) values(
‘
cc
’
,
’
333
’
);
Insert into user(name,password) values(
‘
dd
’
,
’
444
’
);
实现批处理的第二种方式
采用
PreparedStatement.addBatch()
方法执行。
优点:
可以通过占位符预编译,简化了重复属性多条格式相同的语句。
缺点:
执行批处理的时候只能执行同一格式类型的语句,不能混合其他语句同时执行
下面写了个一个demo关于如何批量操作的演示:
package demo4; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import utils.JdbcUtils; public class BatchTest { public static void main(String[] args) { //testStatement(); testPreparedStatement(); } //方式1 private static void testStatement() { Connection conn = JdbcUtils.getConnection(); Statement stmt = null; if (null != conn) { try { stmt = conn.createStatement(); //1.定义sql语句 String sql1 = "create table if not exists book(id int primary key auto_increment," + "name varchar(20)," + "price double);"; String sql2 = "insert into book values(null,'三国演义2',50);"; String sql3 = "insert into book values(null,'红楼梦2',52);"; //2.添加要执行的任意类型的sql语句到批处理 stmt.addBatch(sql1); stmt.addBatch(sql2); stmt.addBatch(sql3); //3.执行批处理 stmt.executeBatch(); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.release(null, stmt, conn); } } } //方式2 private static void testPreparedStatement() { Connection conn = JdbcUtils.getConnection(); PreparedStatement stmt = null; if (null != conn) { try { stmt = conn.prepareStatement("insert into book values(null,?,?)"); // 1.通过stmt替换占位符 for (int i = 1; i <= 120; i++) { stmt.setString(1, "新书" + i); stmt.setDouble(2, 50 + i); // 2.添加到batch中 stmt.addBatch(); // 3.执行批处理 if (i % 50 == 0) { // 提高执行效率 stmt.executeBatch(); stmt.clearBatch(); } } // 4.剩下的数据也需要执行批处理 stmt.executeBatch(); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtils.release(null, stmt, conn); } } } }JdbcUtils详情在这里的demo2