PreparedStatement的批量处理的使用:
对于大量相同操作的数据处理可以使用PreparedStatement。
下面通过简单实例演示如何使用
1.创建测试使用的数据库表 emp_cheri及序列emps_seq
create table emp_cheri (
empno number(8) primary key,
ename varchar(20),
job varchar(20),
mgr number(8),
hiredate date,
sal number(11,2),
comm number(11,2),
deptno number(8)
);
create sequence emps_seq;
2.编写测试程序
public class TestDay03 {
/**
* 批量添加员工
* PreparedStatement的批量处理
*/
@Test
public void test3(){
Connection conn = null;
try {
conn = DBUtil.getConnection();
conn.setAutoCommit(false);
//批量发送数据的前提是他们的SQL一样
String sql = "insert into emp_cheri values ("
+"emps_seq.nextval,?,?,?,?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
for(int i=1;i<=108;i++){
ps.setString(1, "好汉"+i);
ps.setString(2, "打劫");
ps.setInt(3, 0);
ps.setDate(4, null);
ps.setDouble(5, 1000.0);
ps.setDouble(6, 8000.0);
ps.setInt(7, 3);
//将本条数据暂存到ps内
ps.addBatch();
//每隔n次批量发送一次数据
if(i%30==0){
ps.executeBatch();
//清除缓存的数据
ps.clearBatch();
}
}
//对于余下的数据单独发送一次
ps.executeBatch();
conn.commit();
} catch (SQLException e) {
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
throw new RuntimeException("批量添加员工失败!");
}finally{
DBUtil.close(conn);
}
}
}
使用Junit方式运行程序后,查看数据库中数据变化,可以看到数据都已成功插入到对应数据表中
备注:这里有个疑问,观察上面的数据,你发现没有,序列中没有生成 1,留下一个疑问,大家分析下,后面会讲。