美文网首页
数据库(四)2018-08-27

数据库(四)2018-08-27

作者: 迷人的酋长 | 来源:发表于2018-08-29 01:24 被阅读0次
    1. JDBC操作事务
    Connection接口:
        public void setAutoCommit(boolean autoCommit);  //设置是否开启事务的自动提交功能
        public void commit();                           //提交事务
        public void rollback();                         //事务回滚
        public void setTransactionIsolation(int level); //设置事务的隔离级别.
        /*
            四大权限修饰符对应的数字分别是: 1,2,4,8
            
            Connection接口额外定义了一个常量: NONE(表示不支持事务): 值是0
        */
        
    案例: 模拟转账
        步骤:
            try{
                //关闭事务的自动提交功能
                账户1 - 1000
                账户2 + 1000
                //提交事务
                //开启事务的自动提交功能
            }catch(Exception e) {
                //事务回滚
                e.printStackTrace();
            }finally{
                
            }
    
    2. JDBC进行批处理
    Statement接口:
        public void addBatch(String sql);   //添加批处理
        public int[] executeBatch();        //执行批处理, 返回值是各个SQL语句的结果集的组合.
        public void clearBatch();           //清空批处理.
        
    记忆: 
        批处理操作是针对于: 更新语句的. 针对于查询语句无效.
        executeBatch()底层其实依赖的是(调用的是): executeUpdate(String sql);
    
    3. DBCP的简介:

    概述: DataBase Connection Pool, 数据库连接池.

    实际开发中, 我们需要频繁操作数据库, 这就意味着我们要创建大量的连接对象, 而我们目前用的连接对象是用完就释放, 系统频繁创建大量生命周期短的连接对象是非常消耗资源的. 针对这种情况, 我们可以创建一个池子出来, 里边放一些连接对象, 用的时候从里边拿, 用完之后再放回去. 这个池子就是: 数据库连接池.
    这样做的好处是: 节约资源, 提高效率.

    作用:
    主要是用来优化"获取连接对象和销毁连接对象"这步动作的,
    将连接对象从销毁变为自动归还.
    这样做的好处是: 节约资源, 提高效率.

    分类:
    @.采用第三方的 jar包(用别人做好的 数据库连接池) //Spring
    1.....DBCP: 属于Apache公司的, 不会自动回收空闲连接.
    2.....C3P0: 属于Apache公司的, 会自动回收空闲连接.
    目前JavaWeb的三大核心框架(SSH)的底层涉及到的数据库的部分 用到的就是C3P0.
    3.....Druid: 属于阿里巴巴的. 采用"分布式事务的思路"实现的.

    @自定义数据库连接池:

    案例:
        使用C3P0数据库连接池操作数据:
            版本1: 手动设置参数.
            版本2: 结合配置文件使用.      
            版本3: 抽取工具类.             
            
        
        使用Druid数据库连接池操作数据:
            版本1: 手动设置参数.
            版本2: 结合配置文件使用.
            版本3: 抽取工具类.
    
    1. DBCP的原理


      数据库连接池的原理.png
    1. Druid数据库连接池的使用
      // 所有的数据库连接池的根接口都是: DataSource
      版本1: 手动设置参数.
      版本2: 结合配置文件使用.
      版本3: 抽取工具类.
    1. C3P0数据库连接池的使用
      // 所有的数据库连接池的根接口都是: DataSource
      版本1: 手动设置参数.
      版本2: 结合配置文件使用.
      版本3: 抽取工具类.
    7. DBUtils简介:
    概述: 用来优化"JDBC核心操作步骤的", 将其从7步操作变为3步操作.
    
    步骤:
        1) 创建数据库连接池对象.
        2) 创建可以执行SQL语句的对象(QueryRunner).
            //将其(数据库连接池对象)作为参数传入QueryRunner类的构造方法, 创建QueryRunner类的对象.
        3) 执行SQL语句, 获取结果集.
        4) 操作结果集.
    
    QueryRunner类:
        //可以用来执行SQL语句.
        
        构造方法:
            public QueryRunner();
            public QueryRunner(DataSource ds);
        
        成员方法:
            int update(String sql,Object... obj);       //执行更新语句.
            *** query(String sql,ResultSetHandler rsh,Object... obj);   //执行查询语句.
                //ResultSetHandler是一个接口, 表示对结果集的处理方式. 
                //传入的子类不同, 结果集的类型也不同.
        
        //记忆: 可变参数的底层其实是一个: 数组.
        ResultSetHandler接口的子类:
            ArrayHandler        将结果集第一行转成对象数组       Object[]
            ArrayListHandler                                    List<Object[]>
                    将结果集中的每一行数据都转成一个对象数组,再将转成的多个对象数组存放到List中
    
            BeanHandler         将结果集第一行数据封装到一个对应的业务类实例中
                                //  new BeanHandler<业务类的类型>(业务类的字节码文件对象);
                                //  new BeanHandler<Ledger>(Ledger.class);
            BeanListHandler     
                    将结果集中的每一行数据都封装到一个对应的业务类实例中,再将多个业务类实例对象存放到List里。
                    //  new BeanListHandler<业务类的类型>(业务类的字节码文件对象);
                    //  new BeanListHandler<Ledger>(Ledger.class);
            MapHandler          将结果集中的第一行数据封装到一个Map中,key是列名 String ,value是对应的值 Object 
            MapListHandler      将结果集中的每一行数据都封装到一个Map里,然后再将多个Map存放到List
    
            ColumnListHandler   将结果集中的指定列的数据存储到List集合
                   //new ColumnListHandler<该列的类型_写的是引用类型>(列名);
                   //new ColumnListHandler<Double>("money");
            ScalarHandler       进行单值查询,如:select count(*) from   //一行一列
                //new ScalarHandler<该列的类型_写的是引用类型>(列名);
                //new ScalarHandler<Long>("counts");   求满足条件的数据共有多少行
            KeyedHandler        将结果集中的每一行数据都封装为一个Map(Map<String,Object>),
                                再将这些Map再存到一个Map里,其key为KeyedHandler指定的列,
                                如果没有指定则使用第一个查询的字段。
                /*
                            1       2                                                           3       4   
                    Map <String,Map<String,Object>> map= qr.query(conn, sql, new KeyedHandler<String>("lid"));
    
                    1:代表的是 传入的指定的列名(要求不能重复,一般传的是主键)
                    2:代表的是 数据库表中的每一行数据(列名做键,具体的数据做值)
                    3:代表的是 传入的指定的列的 数据类型
                    4:代表的是 传入的指定的列
                
                */
    

    相关文章

      网友评论

          本文标题:数据库(四)2018-08-27

          本文链接:https://www.haomeiwen.com/subject/bmgcwftx.html