数据库批处理
批处理(batch)指的是一次操作中执行多条SQL语句,批处理相比于一次一次执行效率会提高很多。
批处理操作数据库的过程主要是分两步:
- 将要执行的SQL语句保存
- 执行保存的SQL语句
如何实现批处理
Statement和PreparedStatement都支持批处理操作,这里我们只说明PreparedStatement的批处理方式:
-
void addBatch()
将要执行的SQL先保存起来,先不执行
这个方法需要在在设置完所有的占位符之后调用 -
int[] executeBatch()
这个方法用来执行SQL语句,这个方法会将批处理中所有SQL语句执行 -
mysql默认批处理是关闭的,所以还需要去打开mysql的批处理:
需要在mysql的url地址中加入一下参数:
rewriteBatchedStatements=true
例如:URL = “jdbc:mysql://127.0.0.1:3306/test?rewriteBatchedStatements=true”;
Demo
1.创建一张新的数据表
//向test表中插入10000条数据
@Test//测试批处理
public void testBatch(){
//向test表中插入10000条数据
Connection connection = null;
PreparedStatement ps = null;
try {
/*
*获取数据库连接 数据库链接操作在此不进行赘述
*原生数据库操作可参考:http://www.cnblogs.com/Mr-Dawei/p/7455324.html
*/
connection=XXXX;
//sql语句编写
String sql = "INSERT INTO test(uname) VALUES(?)";
//获取PrepareStatement
ps = connection.prepareStatement(sql);
//创建一个for循环,来设置占位符参数数
for(int i = 0; i < 10000 ;i++){
ps.setString(1,"test"+i);
//添加到批处理方法中,调用无参的,有参的是Statement来调用的!
ps.addBatch();
}
//获取一个时间戳 可以测试执行效率
long start = System.currentTimeMillis();
//统一执行执行批处理
ps.executeBatch();
//获取一个时间戳
long end = System.currentTimeMillis();
System.out.println("共花费了:"+(end-start));
} catch (SQLException e) {
e.printStackTrace();
} finally{
//逆序关闭资源
}
}
参考文章:
https://www.cnblogs.com/Mr-Dawei/p/7455496.html