JDBC03

1 JDBC高级编程
    1)事务:数据库中保证交易可靠的机制,JDBC支持数据库中的事务概念。
    事务特性:
      原子性:事务必须是原子工作单元,对其数据修改,要么全执行,要么全不执行。
      一致性:事务在完成时,必须使所有数据都保持一致状态。
      隔离性:由并发事务所作的修改必须与其他任何并发事务所作的修改隔离
      持久性:事务完成后,他对系统的影响是永久的。
    事务是数据库概念,jdbc支持事务,本质还是在数据库中实现。
    2)jdbc中和事务相关的api:
        Connection.getAutoCommit() 获取当前事务的提交方式,默认true
        Connection.setAutoCommit() 设置事务提交方式,true:自动提交;false:不自动提交
        Connection.commit():提交事务
        Connection.rollback():回滚事务
    3)jdbc标准事务编程模式
try{
// 1.定义用于在事务中执行的SQL语句
String sql1 = "update account set amount = amount - " + amount + " where id = '" + from + "'";
String sql2 = "update account set amount = amount + " + amount + " where id = '" + to + "'";
autoCommit = con.getAutoCommit(); // 2.获得自动提交状态
con.setAutoCommit(false); // 3.关闭自动提交
stmt.executeUpdate(sql1); // 4.执行SQL语句
stmt.executeUpdate(sql2);
con.commit(); // 5.提交
con.setAutoCommit(autoCommit); // 6.将自动提交功能恢复到原来的状态
//其他语句;
}catch(SQLException e){
    conn.rollback();//异常时回滚
}
    4)批处理:发送到数据库作为一个单元执行的一组更新语句。批处理降低了应用程序和数据库之间的网络调用,相比单个SQL语句的处理,批处理更为有效。
       防止OutOfMemory:
        for (int i = 0; i< 1000; i++) {
        sql = “insert into emp(empno, ename) values(emp_seq.nextval, 'name" + i + "'")";
        //将SQL语句加入到Batch中
        stmt.addBatch(sql);
        //根据需要设置及时处理的条件
        if (i % 500 == 0) {
        stmt.executeBatch();  //及时处理
        stmt.clearBatch();  //清空列表
        }
        }
        // 最后一次列表不足500条,处理
        stmt.executeBatch();
     5)返回自动主键API
        利用PreparedStatement的getGeneratedKeys方法获取自增类型的数据,性能良好,只要一次SQL交互。
        //1.插入主表SQL,使用序列作为主键
        sql = "insert into dept (deptno, dname, loc) values(dept_seq.nextval,?,?)";
        //2.定义stmt时,第二个参数是GeneratedKeys的主键的字段名列表,类型是字符串数组
        stmt = con.prepareStatement(sql, new String[] { "deptno" });
        //3.将占位符赋值
        stmt.setString(1, “Research”);
        stmt.setString(2, “beijing”);
        //4.执行插入主表的insert语句
        stmt.executeUpdate();
        //5.获得主键值
        rs = stmt.getGeneratedKeys();
        while(rs.next()){
            int deptno = rs.getInt(1);
        }
        
        //6.将刚刚得到的主表主键值,作为外键插入到从表中。
        String sql2 = “insert into emp(empno, ename, deptno)  values(?,?,?)”;
     6)分页查询
         String sql = 
         "select * from 
             (select rownum rn, empno, ename, 
              job,mgr, hiredate, sal, comm, deptno from 
                 (select * from emp order by empno) ) 
              where rn between ? and ?";
          int begin = (page - 1) * pageSize + 1;
          int end = begin + pageSize - 1;    
          
          stmt = con.prepareStatement(sql);
          stmt.setInt(1, begin);
          stmt.setInt(2, end);
          rs = stmt.executeQuery();
2 DAO
    1)什么是DAO
        DAO(Data Access Object):数据访问对象,是建立在数据库和业务层之间,封装所有对数据库的访问 
        目的:数据访问逻辑和业务逻辑分开。   
        为了建立一个健壮的java应用,需将所有对数据源的访问操作抽象封装在一个公共API中,需要:
            ·建立一个接口,接口中定义了应用程序中将用到的所有事务方法。
            ·建立接口的实现类,实现接口对应的所有方法,和数据库直接交互
        DAO通常包括
        a.一个DAO工厂类;
        b.一个DAO接口
        c.一个实现DAO接口的具体类
        d.数据传递对象(实体对象(Entity)或值对象(Value Object))
    2)实体对象
        对象关系映射:
            表和类对应
            表中的字段和类的属性对应
            记录和对象对应
    3)编写DAO举例(实现类中的查询方法)
    public Account findById(Integer id) throws SQLExeption{
        Connection conn = null;
            try{
                conn = DBUtil.getConnection();
                String sql = SELECT_BY_ID
                PreparedStatement ps = conn.prepareStatement(sql);
                ps.setInt(1,id);
                ResultSet rs = ps.executeQuery();
                Account account = null;
                while(rs.next()){
                    account = new Account();
                    account.setId(rs.getInt("ACCOUNT_ID"));                
                }
                return account;
            }catch(SQLExeption e){
                throw e
            }finally{
                conn.close;
            }        
    } 
    4)异常处理原则
    多层系统的异常处理原则:
    ·谁抛出的异常,谁捕捉处理,因为只有抛出异常者,知道怎样捕捉处理异常
    ·尽量在当前层中捕捉处理抛出的异常,尽量不要抛出到上层接口
    ·尽量在每层中封装每层的异常类,这样可准确定位异常抛出的层
    ·如异常无法捕捉处理,则向上层接口抛出,直至抛给JVM,尽量避免







转载于:https://my.oschina.net/u/1393072/blog/509821

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值