一、什么是批处理
- 批处理(batch) 操作数据库
- 批处理指的是一次操作中执行多条SQL语句,批处理相比于一次一次执行效率会提高很多。
- 当向数据库中添加大量的数据时,需要用到批处理。
- 举例: 送货员的工作:
- 未使用批处理的时候,送货员每次只能运送 一件货物给商家;
- 使用批处理,则是送货员将所有要运送的货物, 都用车带到发放处派
二、实现批处理
-
Statement和PreparedStatement都支持批处理操作,这里我们介绍一下PreparedStatement的批处理方式:给客户。
方法 说明 void addBatch() 将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。
通过调用方法 executeBatch 可以批量执行此列表中的命令。int[] executeBatch() 每次提交一批命令到数据库中执行,如果所有的命令都成功执行了,
那么返回一个数组,这个数组是说明每条命令所影响的行数 -
mysql 批处理是默认关闭的,所以需要加一个参数才打开mysql 数据库批处理,在url中添加
rewriteBatchedStatements=true
例如: url=jdbc:mysql://127.0.0.1:3306/db5?characterEncoding=UTF-8&rewriteBatchedStatements=true
示例
测试向表中插入 1万条数据
测试表:
CREATE TABLE testBatch (
id INT PRIMARY KEY AUTO_INCREMENT,
uname VARCHAR(50)
)
测试代码
import com.cyh.utils.DruidUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class BatchInsert {
//使用批处理向表中添加10000条数据
public static void main(String[] args) throws SQLException {
//获取连接
Connection con = DruidUtils.getConnection();
//2.获取预处理对象
PreparedStatement preparedStatement = con.prepareStatement("insert into testBatch(uname) values(?)");
//执行批量操作
for (int i = 0; i < 10000; i++) {
preparedStatement.setString(1,"小强"+i);
//将SQL添加到批处理列表
preparedStatement.addBatch();
}
long start= System. currentTimeMillis();
//统一执行批量插入操作
preparedStatement.executeBatch();
long end = System. currentTimeMillis();
//关闭流
DruidUtils.close(con,preparedStatement);
System.out.println("一共消耗了:" + (end - start) + "毫秒");
}
}