如果不使用批处理的话,就要创建n个PreparedStatement对象,每执行一次增删改操作都要向数据库服务器发送一次数据,包括sql语句和参数,数据库收到sql和参数后会解析并执行。如果使用批处理,就只要想数据库服务器一次性发送一次数据,包括一条sql语句个n列参数,数据库服务器也只要解析一次sql语句,会大大提升效率。
//使用批处理插入若干数据
private static void tc2(){
Connection conn = null;
PreparedStatement pstmt = null;
try {
long startTime = new Date().getTime();
conn = DbUtils.getConnection();
//JDBC默认使用自动提交模式
conn.setAutoCommit(false);//关闭自动提交
String sql = "insert into employee(eno,ename,salary,dname) values(?,?,?,?)";
pstmt = conn.prepareStatement(sql);
for (int i=200000;i<300000;i++){
pstmt.setInt(1, i);
pstmt.setString(2, "员工" + i);
pstmt.setFloat(3, 4000f);
pstmt.setString(4, "市场部");
pstmt.addBatch();//将参数加入批处理任务
// pstmt.executeUpdate();
}
pstmt.executeBatch();//执行批处理任务
conn.commit();//提交数据
long endTime = new Date().getTime();
System.out.println("tc2()执行时长:" + (endTime-startTime));
} catch (Exception e) {
e.printStackTrace();
try {
if(conn != null && !conn.isClosed()) {
conn.rollback();//回滚数据
}
}catch (SQLException ex){
ex.printStackTrace();
}
} finally {
DbUtils.closeConnection(null, pstmt, conn);
}
}
这里我们也可以看出来,PreparedStatement执行execute相关方法时,才会向套接字内写数据发送给数据库。