zoukankan      html  css  js  c++  java
  • JDBC连接池与工具类

    1.连接池概述

    用池来管理Connection,这样可以重复使用Connection,有了池,所以我们就不用自己来创建Connection,
    而是通过池来获取Connection对象,当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,
    而是把Connection归还给池,池就可以再利用这个Connection对象了

    2.C3P0

    public class Demo1 {
        @Test
        public void test() throws Exception {
            //获得连接池
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            //设置连接池与数据库的基本项
            dataSource.setDriverClass("com.mysql.jdbc.Driver");
            dataSource.setJdbcUrl("jdbc:mysql:///demo");
            dataSource.setUser("root");
            dataSource.setPassword("root");
            
            //初始化连接数目
            dataSource.setInitialPoolSize(10);
            //最小连接个数
            dataSource.setMinPoolSize(2);
            //最大连接个数
            dataSource.setMaxPoolSize(20);
            
            //获得连接
            Connection connection = dataSource.getConnection();
            System.out.println(connection);
        }
    }

    3.常见的配置项

    属性 描述
    user 用户名
    password 密码
    driverClass 驱动(mysql驱动:com.mysql.jdbc.Driver)
    jdbcUrl jdbc:mysql:///数据库
    acquireIncrement:连接池无空闲连接可用时,一次性创建的新连接数 默认3
    initialPoolSize :连接池初始化时创建的连接数 默认3
    maxPoolSize :连接池中拥有的最大的连接数
    minPoolSize :连接池保持的最小的连接数


    4.c3p0配置文件使用

        

    配置文件名字:c3p0-config.xml
    配置文件位置:src
    配置文件内容:命名配置

    <c3p0-config>
        <!-- 命名的配置 -->
        <named-config name="itheima">
            <!-- 连接数据库的4项基本参数 -->
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql:///demo</property>
            <property name="user">root</property>
            <property name="password">root</property>
            <!-- 如果池中数据连接不够时一次增长多少个 -->
            <property name="acquireIncrement">5</property>
            <!-- 初始化连接数 -->
            <property name="initialPoolSize">20</property>
            <!-- 最小连接受 -->
            <property name="minPoolSize">10</property>
            <!-- 最大连接数 -->
            <property name="maxPoolSize">40</property>
            <!-- -JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量 -->
            <property name="maxStatements">0</property>
            <!-- 连接池内单个连接所拥有的最大缓存statements数 -->
            <property name="maxStatementsPerConnection">5</property>
        </named-config>
    </c3p0-config>

    5.c3p0工具类

      

    public class Demo2 {
        //连接池
        private static ComboPooledDataSource dataSource = new ComboPooledDataSource("datebase");
        //获得数据源
        public static DataSource getDataSource() {
            return dataSource;
        }
        
        //获得连接
        public static Connection getConnection () throws SQLException {
            return dataSource.getConnection();
        }
    }

    6.dbcp连接池

    常见属性配置项
    属性 描述

    username 用户名
    password 密码
    driverClassName 驱动(mysql驱动:com.mysql.jdbc.Driver)
    url jdbc:mysql:///数据库
    maxActive :连接池中拥有的最大的连接数
    minldle :最小空闲连接
    maxldle :最大空闲连接
    initialSize :初始化连接

    public class Demo3 {
        @Test
        public void test() throws SQLException {
            //获得连接池
            BasicDataSource dataSource = new BasicDataSource();
            //设置基本项
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///demo");
            dataSource.setUsername("root");
            dataSource.setPassword("root");
            // * 初始化连接池中连个的个数
            dataSource.setInitialSize(5);
            // * 最大活动数
            dataSource.setMaxActive(10);
            //2获得连接
            Connection conn = dataSource.getConnection();
    
        }
    }


    7.dbcp连接池配置文件使用

      配置文件名称:*.properties
      配置文件位置:建议src


    #连接设置
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/webdb_4
    username=root
    password=root

    initialSize=10

    maxActive=50

    maxIdle=20

    minIdle=5

    8.dbcp工具类

    public class Demo4 {
        //创建连接池
        private static DataSource dataSource;
        //加载配置文件,创建连接池
        static{
            try {
                InputStream is = Demo4.class.getClassLoader().getResourceAsStream("dbcp.properties");
                Properties pro = new Properties();
                pro.load(is);
                dataSource = BasicDataSourceFactory.createDataSource(pro);
            }  catch (Exception e) {
                e.printStackTrace();
            }
        }
        //获得连接池
        public static DataSource getDataSource() {
            return dataSource;
        }
        
        //获得数据库
        
        public static Connection getConnection() throws SQLException {
            return dataSource.getConnection();
        }
    }

    9.DBUtils工具类

    它是java编程中的数据库操作实用工具
    封装了JDBC的操作,简化了JDBC
    三个核心功能:
    QueryRunner中提供对sql语句操作的API
    ResultHandler接口,用于定义select操作后,怎样封装结果集
    DbUtils类,定义了关闭资源与实务处理的方法
    QueryRunner核心类介绍

    QueryRunner(DataSource)创建核心类,并提供数据源,内部自己维护connection
    update(String sql,Object...params)执行DML语句
    query(String sql,ResultSetHandler,Object..params)执行DQL语句,并将查询结果封装到对象中

    10.QueryRunner结果处理类

    ArrayHandler 将结果集中的第一条记录封装到一个Object[]数组中,数组中的每一个元素就是这条记录中的每一个字段的值
    ArrayListHandler 将结果集中的每一条记录都封装到一个Object[]数组中,将这些数组在封装到List集合中。
    BeanHandler 将结果集中第一条记录封装到一个指定的javaBean中。
    BeanListHandler 将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
    ColumnListHandler 将结果集中指定的列的字段值,封装到一个List集合中
    KeyedHandler 将结果集中每一条记录封装到Map<String,Object>,在将这个map集合做为另一个Map的value,另一个Map集合的key是指定的字段的值。
    MapHandler 将结果集中第一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值

    MapListHandler 将结果集中每一条记录封装到了Map<String,Object>集合中,key就是字段名称,value就是字段值,在将这些Map封装到List集合中。
    ScalarHandler 它是用于单数据。例如select count(*) from 表操作。


    11.JavaBean

    1. 需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
    2. 提供私有字段:private 类型 字段名;
    3. 提供getter/setter方法:
    4. 提供无参构造


    特别补充:
    ScalarHandler

    /*
         * 查询数据表结果集处理其中一种方式:
         *    ScalarHandler处理方式
         *     处理单值查询结果,执行的select语句后,结果集只有1个
         */
    @Test 
    public void demo01() throws SQLException{
        // ScalarHandler : 用于处理聚合函数执行结果(一行一列)
        // * 查询总记录数
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        String sql = "select count(*) from product";
        
        Long obj = queryRunner.query(sql, new ScalarHandler<Long>());
        
        //System.out.println(obj.getClass());
        System.out.println(obj);
        
    }

    MapHandler

    /*
         * 查询数据表结果集处理其中一种方式:
         *   MapHandler处理方式
         *     将数据表结果集的第一行数据,封装成Map集合
         *   键: 数据表中的列
         *   值: 这个列中的数据
         *   
         *   处理方式的Map集合,是LinkedHashMap的子类
         */
    @Test 
    public void demo02() throws SQLException{
        // MapHandler : 将查询到的一条记录,封装到Map中,map.key=字段名,map.value=值
        // * 主要用途:多表操作、将数据转换json 等
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        String sql = "select * from product where id = ?";
        Object[] params = {6};
        Map<String,Object> map = queryRunner.query(sql, new MapHandler(), params);
        
        System.out.println(map);
        // 将Map数据封装到指定JavaBean
        
    }

    MapListHandler

    /*
         * 查询数据表结果集其中一种处理方式:
         *   MapListHandler处理方式
         *     将数据表的结果集的每一行封装成Map集合
         *     数据表多行数据,出现多个Map集合,存储List集合
         */
    @Test 
    public void demo03() throws SQLException{
        // MapListHandler : 查询所有数据,将每一条记录封装到Map中,然后将Map添加到List中,最后返回List
        // * 主要用途:多表操作 等
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        String sql = "select * from product";
        List<Map<String,Object>> list = queryRunner.query(sql, new MapListHandler());
        
        for(Map<String,Object> map : list){
            System.out.println(map);
        }
        
    }

    KeyHandler

    @Test 
    public void demo04() throws SQLException{
        // KeyedHandler : new KeyedHandler("字段名称"),查询所有,将查询结果封装到Map中
        // * map.key=为指定“字段名称”对应的值
        // * map.value=为当前整条记录所有的值,数据为Map<字段名,值>
        // 类型  Map<String , Map<String,Object> >
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        String sql = "select * from product";
        Map<String,Map<String,Object>> map = queryRunner.query(sql, new KeyedHandler<String>("name"));
    
        for(Map.Entry<String, Map<String,Object>> entry : map.entrySet()){
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
        
    }

    ColumnListHandler

    /*
         * 查询数据表结果集处理其中一种方式:
         *   ColumnListHandler处理方式
         *     将查询数据表结果集中的某一列数据,存储到List集合
         *     哪个列不清楚,数据类型也不清楚, List<Object>
         *  ColumnListHandler构造方法
         *    空参数: 获取就是数据表的第一列
         *    int参数: 传递列的顺序编号
         *    String参数: 传递列名
         *    
         *  创建对象,可以加入泛型,但是加入的数据类型,要和查询的列类型一致
         */
    @Test 
    public void demo05() throws SQLException{
        // ColumnListHandler : 查询指定一列数据
        QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
        String sql = "select * from product";
        List<String> list = queryRunner.query(sql, new ColumnListHandler<String>("name"));
    
        System.out.println(list);
    }
  • 相关阅读:
    Pascal's Triangle II
    Pascal's Triangle
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Populating Next Right Pointers in Each Node
    path sum II
    Path Sum
    [转载]小波时频图
    [转载]小波时频图
    [转载]Hilbert变换及谱分析
  • 原文地址:https://www.cnblogs.com/learnjfm/p/6916749.html
Copyright © 2011-2022 走看看