【mysql】DbUtils和数据库连接池

DbUtils和数据库连接池

1. 轻量级ORM框架使用DbUtils

1.1 DbUtils介绍
	Apache组织孵化一个轻量级ORM数据库框架,提供了一系列针对于数据库操作的方法,可以返回多种数据类型,满足多种开发情况,操作较为简单!!
	第三方Jar
		1. 官网
		2. Maven仓库
			https://mvnrepository.com/
			commons-dbutils-1.7.jar
1.2 DbUtils常用处理Handler
BeanHandler<T>(Class<T> cls)
	根据用户指定的Class类型,返回符合JavaBeans规范的类对象,可以处理单个数据。
	
BeanListHandler<T>(Class<T> cls)
	可以将数据行内容处理成用户指定的符合JavaBeans规范对象的List集合
	
ArrayHandler
	是将一个查询结果集数据行所有数据,按照Object类型数组存储返回数据的顺序和查询
	使用的SQL语句相关。

ArrayListHandler
	是将整个ResultSet结果集中是所有数据库内容,全部处理成对应的Object数组。
	所有的Object数组存储于一个List集合中,方便管理和处理
	
MapHandler
	将数据行内容,字段对应Key,为String类型
	数据对应Value,因为数据类型多样,采用的Map存储方式为Object类型
	返回数据是整个数据行的键值对表示方式。
	JSON和XML文件 ==> Map Object数组 List集合相互转化

MapListHandler
	所有的数据行,字段为Key,数据为Value转化为Map双边队列
	Map双边队列存储在一个List集合中
	List<Map<String, Object>>

2. 数据库连接池

2.1 数据库连接池需求
目前问题:
	1. 数据库的打开关闭次数过多,倒是效率极低,并且对于项目的运行体验较差
	2. 资源浪费

数据库连接池需要考虑的问题:
	1. 使用的便捷程度。
		熟知的方法,不能发生太大的改变
		getConnection() close(AutoCloseable... source);
	2. 数据库连接池在使用开始阶段,应该准备好对应的数据库连接对象。 INIT
	3. 可以设置数据库连接对象Connection最大个数 MAX
	4. 存在对于数据库Connection连接对象使用超时情况 Time Out
	5. 数据库连接对象Connection必要资源一定要有!!!
		DriverClass JdbcUrl user password
2.2 常见数据库连接池对比
C3P0
	Hibernate 数据库框架内置数据库连接池,效率低
	XML文件

DBCP
	我没有用过,操作复杂

Druid
	来着中国 阿里巴巴!!!
	properties属性文件
2.3 C3P0操作使用
2.3.1 C3P0配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<!-- 默认配置,只可以出现一次 -->
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/javaee2005?useSSL=true</property>
		<property name="user">root</property>
		<property name="password">123456</property>

		<!-- 连接超时设置30秒 --> 
		<property name="checkoutTimeout">3000</property>
		<!-- 30秒检查一次connection的空闲 -->
		<property name="idleConnectionTestPeriod">30</property>
		<!--初始化的池大小 --> 
		<property name="initialPoolSize">2</property>
		<!-- 最多的一个connection空闲时间 -->  
		<property name="maxIdleTime">30</property>
		<!-- 最多可以有多少个连接connection -->
		<property name="maxPoolSize">5</property>
		<!-- 最少的池中有几个连接 -->
		<property name="minPoolSize">2</property>
		<!-- 批处理的语句
		 -->
		<property name="maxStatements">50</property>
		<!-- 每次增长几个连接 -->
		<property name="acquireIncrement">3</property>

	</default-config> 
</c3p0-config> 
2.3.2 修改JdbcUtil,数据库连接采用数据库连接池管理方式
/*
直接在JdbcUtil工具类中创建ComboPooledDataSource类对象,返回值类型
可以认为是DataSource 数据库连接池对象
ComboPooledDataSource对象创建过程中,会自动加载在src目录下的c3p0-config.xml文件内容
*/

private static DataSource dataSource = new ComboPooledDataSource();
2.4 Druid操作使用
2.4.1 配置文件
# 文件名 druid.properties 存储在src目录下
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/javaee2005?useSSL=false
username=root
password=123456

# 初始化数据库连接池容量
initialSize=10

# 最大容量
maxActive=30

# TimeOut 等待超时时间
maxWait=2000
2.4.2 修改JdbcUti文件内容
package util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.*;
import java.util.Properties;

/**
 * JdbcUtil功能简述
 *      1. 程序预处理驱动问题和连接所需数据
 *      2. 获取数据库连接对象
 *      3. 关闭数据库操作所使用资源
 *
 * @author Anonymous
 */
public class JdbcUtil {
    /*
    定义一个DataSource数据库连接池静态成员变量
     */
    private static DataSource dataSource = null;

    static {

        try {
            /*
            加载druid.properties文件
             */
            Properties properties = new Properties();
            /*
            JdbcUtil.class.getClassLoader() 获取类加载器
            在类加载位置检索 "druid.properties" 文件,创建对应文件的InputStream 字节输入流对象
             */
            properties.load(JdbcUtil.class.getClassLoader().getResourceAsStream("druid.properties"));

            /*
            DruidDataSourceFactory.createDataSource(properties);
            通过DruidDataSourceFactory Druid数据库连接池工厂类,创建新的数据库连接对象
             */
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 	// 以下未动
}

3. 使用DbUtils优化BeanDao操作

package util;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.*;

import java.sql.SQLException;
import java.util.List;
import java.util.Map;

public class BaseDao {
    /**
     * 当前BaseDao中使用的DbUtils核心类 QueryRunner对象,并且使用
     * 静态成员变量处理方式在类文件加载阶段完成对象的创建过程,简化
     * 后期代码逻辑
     */
    private static QueryRunner queryRunner = new QueryRunner(JdbcUtil.getDataSource());

    /**
     * 通用查询操作方法,处理insert,delete,update 对应SQL语句
     *
     * @param sql        String SQL语句
     * @param parameters SQL语句对应的参数列表,不定长参数
     * @return 当前SQL语句操作对应当前数据库的受到影响的行数
     * @throws SQLException SQL异常
     */
    public int update(String sql, Object... parameters) throws SQLException {
        return queryRunner.update(sql, parameters);
    }

    public <T> T queryBean(String sql, Class<T> cls, Object... parameters) throws SQLException {
        return queryRunner.query(sql, new BeanHandler<>(cls), parameters);
    }

    public <T> List<T> queryBeanList(String sql, Class<T> cls, Object... parameters) throws SQLException {
        return queryRunner.query(sql, new BeanListHandler<>(cls), parameters);
    }

    public Object[] queryArray(String sql, Object... parameters) throws SQLException {
        return queryRunner.query(sql, new ArrayHandler(), parameters);
    }

    public List<Object[]> queryArrayList(String sql, Object... parameters) throws SQLException {
        return queryRunner.query(sql, new ArrayListHandler(), parameters);
    }

    public Map<String, Object> queryMap(String sql, Object... parameters) throws SQLException {
        return queryRunner.query(sql, new MapHandler(), parameters);
    }

    public List<Map<String, Object>> queryMapList(String sql, Object... parameters) throws SQLException {
        return queryRunner.query(sql, new MapListHandler(), parameters);
    }
}


版权声明:本文为qq_43410878原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。