文章目录
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版权协议,转载请附上原文出处链接和本声明。