欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDBC连接池与DBUtils工具类

程序员文章站 2022-05-24 12:31:00
...

连接池

    实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池

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

 规范
    Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
常见的连接池:DBCP、C3P0。

C3P0

导入的jar包
JDBC连接池与DBUtils工具类
根目录配置文件c3p0-config.xml

<c3p0-config>
	<!-- 默认配置,如果没有指定则使用这个配置 -->
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/teach</property>
		<property name="user">root</property>
		<property name="password">123456</property>
		<property name="checkoutTimeout">30000</property>
		<property name="idleConnectionTestPeriod">30</property>
		<property name="initialPoolSize">10</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">100</property>
		<property name="minPoolSize">10</property>
		<property name="maxStatements">200</property>
		<user-overrides user="test-user">
			<property name="maxPoolSize">10</property>
			<property name="minPoolSize">1</property>
			<property name="maxStatements">0</property>
		</user-overrides>
	</default-config> 
	
	<!-- 命名的配置 -->
	<named-config name="test">
		<!-- 连接数据库的4项基本参数 -->
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/db</property>
		<property name="user">root</property>
		<property name="password">1234</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>

获取连接

public void c3p0DataSource() throws SQLException {
    //1.获取c3p0连接池核心类对象
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    //2.设置c3p0的配置文件,放在源代码的根目录(src)
    //实例化的时候不指定参数使用默认配置,如果指定参数,使用名称为参数的配置
    //默认使用源代码目录下的配置文件
    //3.获取连接
    Connection conn = dataSource.getConnection();
	//下面使用连接进行数据库操作
}

DBCP

导入的jar包
JDBC连接池与DBUtils工具类
配置文件dbcp-config.properties

#基本配置内容
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/teach
username=root
password=123456

initialSize=10

maxActive=50

maxIdle=20

minIdle=5

maxWait=60000

connectionProperties=useUnicode=true;characterEncoding=UTF-8

defaultAutoCommit=true

defaultReadOnly=NONE

defaultTransactionIsolation=READ_UNCOMMITTED

获取连接

public void dbcpDataSource() throws Exception {
    //1.获取dbcp的配置文件 properties
    Properties prop = new Properties();
    //利用类的 appClassLoader应用类加载器默认路劲是源代码的根目录
    //使用类加载器的getResourceAsStream读取文件的输入流
    prop.load(DataSourceDemo.class.getClassLoader().getResourceAsStream("dbcp-config.properties"));
    //2.获取连接池数据源的核心类对象
    DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);
    //3.获取链接
    Connection conn = dataSource.getConnection();
}

Druid

导入jar包
JDBC连接池与DBUtils工具类

配置文件与dbcp类似

获取连接

public void druidDataSource() throws Exception {
    //1.获取dbcp的配置文件 properties
    Properties prop = new Properties();
    //利用类的 appClassLoader应用类加载器默认路劲是源代码的根目录
    //使用类加载器的getResourceAsStream读取文件的输入流
    prop.load(DataSourceDemo.class.getClassLoader().getResourceAsStream("dbcp-config.properties"));
    //2.获取连接池数据源的核心类对象
    DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
    //3.获取链接
    Connection conn = dataSource.getConnection();
}

若使用监控等功能还需对项目配置文件进行配置

将连接池封装成工具类

public class DBCPUtil {
    private static DataSource dataSource =null;
    private static Properties prop = new Properties();
    static {
        //1.获取dbcp的配置文件 properties
        //利用类的 appClassLoader应用类加载器默认路劲是源代码的根目录
        //使用类加载器的getResourceAsStream读取文件的输入流
        try {
            prop.load(DataSourceDemo.class.getClassLoader().getResourceAsStream("dbcp-config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    //获取或者设置数据源
    public static DataSource getDataSource(String name){
        //C3P0
//      if(name!=null && !name.equals("")){
//          dataSource = new ComboPooledDataSource(name);
//      }else{
//          dataSource = new ComboPooledDataSource();
//      }
        //DBCP
        try{
            dataSource = BasicDataSourceFactory.createDataSource(prop);
        }catch (Exception e){
            e.printStackTrace();
        }

        return  dataSource;
    }

    //获得连接方法
    public static Connection getConn() {
        Connection conn = null;
        try {
            if(dataSource==null){
                getDataSource(null);
            }
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  conn;
    }

    //关闭资源的方法
    public static void close(Connection conn, Statement st, ResultSet set){
        try {
            if(set!=null){
                set.close();
            }
            if(st!=null){
                st.close();
            }
            if(conn!=null){
                conn.close();
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

DBUtils

  DBUtils是java编程中的数据库操作实用工具,小巧简单实用,封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
  Dbutils三个核心功能介绍:

  1. QueryRunner中提供对sql语句操作的API.
  2. ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
  3. DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

QueryRunner使用

public void static void main(String[] args) throws SQLException {
    //映射(OR) Mybatis ,Hibernate ,jdbcTemplate等等
    //1.得到核心类
    QueryRunner qr = new QueryRunner(ConnectionUtil.getDataSource(null));
    //2.编写sql语句
    //使用防注入sql语句写法
    String sql ="INSERT INTO course VALUES(?,?,?);";
    //3.设置参数
    Object[] params = {"6-104","大数据",5};
    //4.执行语句
    //a.DML update()  b.DQL query()
    int i = qr.update(sql, params);
    System.out.println(i);
}

使用ResultSetHandler接口将结果集封装

public void static void main(String[] args) throws SQLException {
    QueryRunner qr = new QueryRunner(ConnectionUtil.getDataSource(null));
    String sql1 = "SELECT * FROM student WHERE name=? AND password=? ";
    String sql2 = "SELECT * FROM student WHERE  password=? ";
    String sql3 = "SELECT count(0) FROM student WHERE sex1='男' ";
    Object[] param1= {"刘晨","123456"};
    //ResultSetHandler 结果集模板 ==>(时间模板 yyyy-MM-dd HH:mm:ss)
    //1.BeanHandler 要求结果一定要是一条,直接帮你映射bean
    //注意:表中的字段要和java中的字段完全一样(缺陷),
    //匹配的是javabean中get和set方法
    Student c =qr.query(sql1, new BeanHandler<>(Student.class), param1);
    System.out.println(c);
    //2.BeanListHandler 支持查询结果是多条数据
    List<Student> list = qr.query(sql2, new BeanListHandler<>(Student.class), "123456");
    //System.out.println(list);
    //qr.query(sql, ,param);
    //3.ScalarHandler 类型无法确定 先转成String 再转成你需要的类型
    //如果你要指定返回类型,要在泛型中指定
    Object o = qr.query(sql3, new ScalarHandler<>());
    String s = o.toString();
    int num = Integer.parseInt(s);
    System.out.println(num);
    //4.MapHandler : 将查询到的一条记录,封装到Map中,map.key=字段名,map.value=值
	//主要用途:多表操作、将数据转换json 等
	Map<String,Object> map = queryRunner.query(sql2, new MapHandler(), "123456");	
	System.out.println(map);
	//还有MapListHandler、ArrayHandler、ArrayListHandler、KeyedHandler、ColumnListHandler用法类似
}