第一种方式:Statement 特点:一次装入然后处理 ,但是可以批处理各种不同的sql语句 注意点:如果一次批处理数据很大,会造成溢出
思路:
1.加载
2.获取链接
3.获取Statement (如果存在手动提交,这需要设置为conn.setAutoCommit(false);)
4.装入addBatch(sql)
5.执行(如果设置为手动提交,这里需要conn.commit();)如果存在异常,异常中需要回滚:conn.rollback();
6.关闭各种连接
第二种方式:PreparedStatement 特点:可以预处理,分批装入,处理相同的sql语句,可以传递不同的参数 注意点:sql语句是否相同
思路:
1.加载
2。获取连接
3.获取PreparedStatement
4.预处理sql语句(如果存在手动提交,这需要设置为conn.setAutoCommit(false);)
5.制造循环实现批处理
5.执行(中途可以设置装入的数量用来防止第一种方式的溢出)(如果设置为手动提交,这里需要conn.commit();)如果存在异常,异常中需要回滚:conn.rollback();
6.关闭各种连接
大致代码:
第一种:
private boolean insertModel(List<Stats> list) { StringBuilder sql=new StringBuilder("insert into statsinfo " + "(serNo,a,b,c)" + " values(seq_statsInfo.nextval,"); //,g,h,i,j ,?,?,?,? Connection conn=DataBaseUtil.getConnForInsert(); Statement stem=DataBaseUtil.getStmt(conn); try { conn.setAutoCommit(false); for(int i=0;i<list.size();i++){ Stats s=list.get(i); sql.append(s.getA()); sql.append(" , "); sql.append(s.getB()); sql.append(" , "); sql.append(new java.sql.Date(s.getMakedate().getTime()));//util转sql date的方法 sql.append(" , "); sql.append(new java.sql.Date(s.getModifytime().getTime())); sql.append(" , "); sql.append(s.getOperator()); sql.append(" ) "); stem.addBatch(sql.toString()); } stem.executeBatch(); conn.commit(); return true; } catch (SQLException e) { try { conn.rollback(); } catch (SQLException e1) { System.out.println("数据异常回滚"+e1.getMessage()); } System.out.println("selectModel执行失败"+e.getMessage()); }finally{ DataBaseUtil.closeStmt(stem); DataBaseUtil.closeConn(conn); } return false; }
private void insertBatchModel(List<Stats> list){ //定义sql语句 String sql="insert into statsinfo " + "(serNo,a,c)" + " values(seq_statsInfo.nextval,?,?,?)";//语句是错的 Connection conn=DataBaseUtil.getConnForInsert(); PreparedStatement ps=DataBaseUtil.getPstmt(conn, sql); try { conn.setAutoCommit(false); //创建语句对象 for(int i=0;i<list.size();i++){ Stats s=list.get(i); //为字段赋值 ps.setString(1,s.getA()); ps.setString(2,s.getC()); ps.setString(3,s.getC()); ps.setString(4,s.getC()); ps.setDate(10,new java.sql.Date(s.getModifytime().getTime()));//就这样搞参数这里不全 ps.setString(11,s.getOperator()); //添加进批 ps.addBatch(); //设置条件当i对10取余为0时,先执行一次批语句,然后将批清除 if(i%10==0){ ps.executeBatch(); ps.clearBatch(); } } //将批中剩余的语句执行完毕 ps.executeBatch(); conn.commit(); } catch (SQLException e) { e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { System.out.println("批处理发生异常"+ e.getMessage()); } }finally{ DataBaseUtil.closeConn(conn); DataBaseUtil.closePstmt(ps); } }