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);
    }
  • 相关阅读:
    html中的背景图片不能充满整个浏览器 .
    linux系统安装Memcache
    linux下如何查看某软件是否已安装
    Redis监控之redisstat安装与详解
    memcached出现:Fatal error: Call to undefined method Memcached::connect()
    PHP多进程开发与Redis结合实践
    关于大型asp.net应用系统的架构架构的选择(转载)
    浅谈https\ssl\数字证书
    利用Lucene.net对附件做搜索(转载)
    Mic's blog iis下ISAPI_Rewrite配置及 iis rewrite 规则书写
  • 原文地址:https://www.cnblogs.com/learnjfm/p/6916749.html
Copyright © 2011-2022 走看看