数据库(四)2018-08-27

2018-08-29  本文已影响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:代表的是 传入的指定的列
            
            */
上一篇下一篇

猜你喜欢

热点阅读