批处理指的是一次操作中执行多条SQL语句,相比于一次一次执行效率会提高很多
- 批处理主要是分两步:
- 将要执行的SQL语句保存
- 执行SQL语句
Statement和PreparedStatement都支持批处理操作,PreparedStatement的批处理方式:
- 方法:
- void addBatch():将要执行的SQL先保存起来,先不执行,这个方法在设置完所有的占位符之后调用
- int[] executeBatch():这个方法用来执行SQL语句,这个方法会将批处理中所有SQL语句执行
mysql默认批处理是关闭的,所以还需要去打开mysql的批处理:
rewriteBatchedStatements=true
需要将以上的参数添加到mysql的url地址中,不加的话,也能执行,但并不是真正的批处理,很慢。
注意:低版本的mysql-jdbc驱动也不支持批处理,一般都是在修改的时候使用批处理,查询的时候不使用!(mysql-connector-java-5.1.7-bin.jar不支持,mysql-connector-java-5.1.42.jar支持)
1、创建一张新的数据表
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(50)
)
2、引入批处理
1 @Test//测试批处理
2 public void testBatch(){
3 //向student表中插入10000条数据
4 //准备两个变量
5 Connection connection = null;
6 PreparedStatement ps = null;
7 try {
8 conn = DBUtil.getConn();//获取数据库连接
9 String sql = "INSERT INTO student(NAME) VALUES(?)";//准备SQL模板
10 ps = conn.prepareStatement(sql);//获取PrepareStatement
11 //创建一个for循环,来设置占位符
12 for(int i = 0; i < 1000 ;i++){
13 ps.setString(1,"stu"+i);//填充占位符
14 ps.addBatch();//添加到批处理方法中,调用无参的方法,有参的是Statement来调用的!
15 }
16
17 long start = System.currentTimeMillis();//获取一个时间戳
18 ps.executeBatch();//执行批处理
19 long end = System.currentTimeMillis();//获取一个时间戳
20 System.out.println("用时:"+(end-start));
21 } catch (SQLException e) {
22 e.printStackTrace();
23 }
24 }
批处理执行效率高,资源利用率好!
插入1000条数据(没有开启批处理):13120ms
插入1000条数据(开启批处理):517ms
DBUtil工具类 --->资源目录--->工具类--->数据库操作工具类
mysql-connector-java-5.1.42.jar --->资源目录--->jar包资源--->mysqlConnection jar包
本文介绍SQL批处理的概念及实现方法,通过对比开启与未开启批处理的效率差异,展示批处理在大量数据插入时的优势,并提供具体的代码示例。
793

被折叠的 条评论
为什么被折叠?



