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,留下一个疑问,大家分析下,后面会讲。