jdbc中2种批处理方式+事务回滚

第一种方式: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);
			
       }
	}

反正我在测试的时候第一种方式直接溢出了。



你可能感兴趣的:(jdbc,事务,回滚)