当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。
实现方式一:Statement.addBatch(sql):此方法调用后就加到一个list集合中
executeBatch()方法:执行批处理命令
clearBatch()方法:清除批处理命令
例:public void test1() throws SQLException{
Connection conn = null;
Statement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection();
String sql1 = "insert into testbatch(id,name) values('1','aaa')";
String sql2 = "update testbatch set name='bbb' where id='1'";
st = conn.createStatement();
//加入List集合中
st.addBatch(sql1);
st.addBatch(sql2);
//返回数组存储影响数据库几行的数值
st.executeBatch();
st.clearBatch();
}finally{
JdbcUtils.release(conn, st, rs);
}
}
实现方式二:PreparedStatement.addBatch()
优点:发送的是预编译后的SQL语句,执行效率高。适合做批量插入与更新。
缺点:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个 表中批量插入数据,或批量更新表的数据。
例:public void test2() throws SQLException{
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try{
conn = JdbcUtils.getConnection();
String sql = "insert into testbatch(id,name) values(?,?)";
st = conn.prepareStatement(sql);
//由于加入的数据很多,所以要分段加入已增加效率
for(int i=1;i<=10000006;i++){
//补全一个全新的SQL后就加入List集合中
st.setString(1, i+"");
st.setString(2, "aa" + i);
st.addBatch();
//当数据为1000时执行一次
if(i%1000==0){
st.executeBatch();
st.clearBatch();
}
}
st.executeBatch();
}finally{
JdbcUtils.release(conn, st, rs);
}
}