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);
}
时间: 2024-10-14 10:04:14

JDBC连接池与工具类的相关文章

使用C3P0连接池的工具类

package util; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DataSourceUtils { private static

Java Redis 连接池 Jedis 工具类

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.io.IOException; import java.io.InputStream; import java.util.Prop

JDBC连接池C3P0

连接池 1)传统方式找DriverManager要连接,数目是有限的. 2)传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行 3)项目中,对于Connection不说,不会直接使用DriverManager取得,而使用连接池方式. 4)DBCP和C3P0,都是Java开源的,都必须直接或间接实现javax.sql.DataSource接口 5)DBCP连接池需要dbcp.properties文件,同时需加入3个对应的j

数据层优化-jdbc连接池简述、druid简介

终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化去写,本篇是一个开始.本文会介绍连接池技术并对比目前比较流行的java连接池技术,之后,会把druid整合到项目中来,将技术方案落地,实际整合到项目中,让技术能为我所用. 使用连接池的原因 jdbc的demo //第一步,注册驱动程序 //com.MySQL.jdbc.Driver Class.fo

JDBC连接池概述

Reference Source:https://www.progress.com/tutorials/jdbc/jdbc-jdbc-connection-pooling 介绍 本文档提供的信息旨在帮助开发人员为必须处理连接池的应用程序提供连接池策略. 首先, 本文档提供 jdbc 3.0 规范指定的 jdbc 连接池概述. 接下来, 它提供了一些示例, 说明如何使用 DataDirect 连接池管理器 (它随 DataDirect Connect?用于jdbc 和 DataDirect Seq

Spring boot (11) tomcat jdbc连接池

默认连接池 tomcat jdbc是从tomcat7开始推出的一个连接池,相比老的dbcp连接池要优秀很多,spring boot将tomcat jdbc作为默认的连接池,只要在pom.xml中引入了spring boot的jdbc组件,就会自动引入tomcat jdbc连接池. 默认参数 以下是org.apache.tomcat.jdbc.pool.PoolProperties源码,这是tomcat jdbc连接池的默认初始参数.这个类实现了一个接口PoolConfiguration,查看这个

号称性能最好的JDBC连接池:HikariCP

HikariCP号称是现在性能最好的JDBC连接池组件,具体的性能到底如何,我也没有仔细的测试过,不过从它现在的发展来看,其可能确实如它宣传的那样其性能高过目前所有的连接池组件.之前对连接池的记忆一直都是C3P0.DBCP.BoneCP,这三者中BoneCP的性能是最好的,C3P0的性能在现在来说确实是非常差的了,好像C3P0很久都没有更新了,所以我们应该杜绝在项目中使用C3P0,至于是否要使用HikariCP,我觉得可以尝试.HikariCP毕竟是才出来不久,其性能到底如何,也需要实践的检验,

JDBC连接池的简单实现

先说明一下,我本身是做android开发的,java web是我的弱项,只是近来京东云免费,于是去折腾了几下,有了些许经验,特作分享.如果文章中内容有误,还请各高手指正. 我在web端,需要连接数据库进行查询插入等操作,但是每次进行操作都先获取连接用完后就断开的话,未免效率太低.以前知道tomcat中可以配置,但是京东云引擎的tomcat并不能由自己配置.因为我折腾的东西较小,所以也不考虑使用框架,于是就想自己写一个. 我写的连接池很简单,在初始化时创建5个连接,并放在一个列表当中.如果要获取连

使用了Tomcat JDBC连接池不能重连的问题

在项目中用到了tomcat 的jdbc连接池,发现一个问题是,当数据库重启时,服务没有重新的去连接数据库,需要将部署的项目重新启动才能连接到数据库.经过测试对配置做一下修改: 在配置dataSource的地方加入两个配置属性: <property name="testOnBorrow" value="true"/> <!--在连接返回给调用者前用于校验连接是否有效的SQL语句,如果指定了SQL语句,则必须为一个SELECT语句,且至少有一行结果--