【NEW12】数据库连接池与DBUtils工具
文章目录
-
第一部分基于BasicDataSource类无需配置地生成数据源对象实例
-
第二部分主要介绍C3P0框架中用于构建数据库连接的数据源实例
-
具体包括两种实现方式:
- 一种是基于ComboPooledDataSource()构建工具类提供的方法生成新实例
- 另一种是通过解析配置文件内容来获取数据库连接参数并初始化一个新实例
-
第三章 DBUtils 工具包
- 3.2 QueryRunner 类别
- 3.3 ResultSetHandler 接口
- 3.4 ResultSetHandler 实现类
- 3.2 QueryRunner 类别
一、通过BasicDataSource类直接创建数据源对象
当使用BasicDataSource类初始化数据源对象时,必须人工配置其属性值之后即可获取数据库的连接信息.
(1)使用Eclipse工具创建名为chapter10的Web项目,在项目根目录中添加mysql-connector-java-5.0.8-bin.jar、commons-dbcp-1.4.jar以及commons-pool-1.6.jar这三个JAR库文件,并将它们部署至类路径下;随后将包cn.itcast.chapter10.example迁移到项目src目录,并在此目录中建立Example01.java文件;该类通过手动方法获取数据库连接信息及数据源初始化配置。

package cn.iticast.chapter10.example;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class example01 {
public static DataSource ds=null;
static {
//获取dbcp数据源实现类对象
BasicDataSource bds = new BasicDataSource();
//书上287页那张续表
// 设置连接数据库需要的配置信息
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost:3306/jdbc");
bds.setUsername("root");
bds.setPassword("123456");
// 设置连接池的参数
bds.setInitialSize(5);
bds.setMaxActive(10);
ds = bds;
}
public static void main(String[] args) throws SQLException {
// 获取数据库连接对象
Connection conn = ds.getConnection();
//获取数据库连接信息
DatabaseMetaData metaData = conn.getMetaData();
System.out.println(metaData.getURL());
System.out.println(metaData.getUserName());
System.out.println(metaData.getDriverName());
}
}
(2)运行main( ) 方法后,程序的运行结果如图:

2.通过读取配置文件创建数据源对象
除了手动创建数据源对象之外,在线部署系统还允许通过BasicDataSourceFactory工厂类从配置文件中读取信息并生成数据源实例。下面让我们详细说明一下操作流程:以一个实例展示具体的步骤。
(1) 在chapter10项目的src目录下创dbcpconfig.properties
文件,该文件用于设置数据库的连接信息和数据源的初始化信息,如下:

(2)根据需求,在cn.itcast.chapter10目录下的example包中创建一个Example2类;
该类通过配置文件获取了数据库连接信息以及数据源初始化信息的方式实现功能,
如图所示:

package cn.iticast.chapter10.example;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class example02 {
//1.3
public static DataSource ds = null;
static {
// 新建一个配置文件对象
Properties prop = new Properties();
try {
// 通过类加载器找到文件路径,读配置文件
InputStream in = new example02().getClass().getClassLoader()
.getResourceAsStream("dbcpconfig.properties");
// 把文件以输入流的形式加载到配置对象中
prop.load(in);
// 创建数据源对象
ds = BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static void main(String[] args) throws SQLException {
// 获取数据库连接对象
Connection conn = ds.getConnection();
//获取数据库连接信息
DatabaseMetaData metaData = conn.getMetaData();
//打印数据库连接信息
System.out.println(metaData.getURL());
System.out.println(metaData.getUserName());
System.out.println(metaData.getDriverName());
}
}
二、C3P0数据源
目前最受欢迎的开源数据库连接池之一是C3PO。该工具实现了 popular DataSource 接口,并遵循 JDBC 2 和 JDBC 3 的标准规范。具有良好的扩展性和高性能能力的C3PO易于部署并提供卓越性能,在实践应用中得到了广泛认可。知名开源框架Hibernate及Spring对此进行了支持,在它们的基础上构建出高效的业务逻辑架构。当采用 C3PO 数据源进行开发时,请掌握其 DataSource 接口中的 ComboPooledDataSource 类的相关功能。
2.1 通过ComboPooledDataSource()构造方法创建数据源对象
采用ComboPooledDataSource()构建方法来生成数据源对象时,默认情况下会返回一个单实例的数据源引用实体。为了实现特定的数据源引用配置需求,在调用该构造函数之前必须手动为数据源对象配置相应的属性值,并在后续操作中将能够访问数据库的连接对象作为工作集参数传递给相关组件服务组件或其他依赖项组件。具体的实现步骤如下:
(1)在项目中导入jar包,然后在包下创建一个类,该类采用C3P0数据源手动代码的方式获取Connection对象,如下图:

(2)运行结果

2.2 通过读取配置文件创建数据源对象
该系统采用ComboPooledDataSource ( String configName )构造方法从c3p0-config.xml 配置文件中获取所需参数,并进而生成相应的数据源对象实例。随后系统会根据这些参数设置与数据库的连接关系。以下将详细展示如何通过案例操作完成整个配置流程的具体步骤。
在src根目录中建立一个命名为c3p0-config.xml的XML文件, 旨在配置数据库连接参数及数据初始化流程

<?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/jdbc
</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="checkoutTimeout">30000</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>
</default-config>
<named-config name="dashuju">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">
jdbc:mysql://localhost:3306/jdbc
</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">15</property>
</named-config>
</c3p0-config>
在位于cn.itcast.chapter10.example包中的Example04类中通过使用C3P0数据源从配置文件中获取Connection对象。

package cn.iticast.chapter10.example;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class example04 {
public static DataSource ds = null;
// 初始化C3P0数据源
static {
// 使用c3p0-config.xml配置文件中的named-config节点中name属性的值
ComboPooledDataSource cpds = new ComboPooledDataSource("dashuju");
ds = cpds;
}
public static void main(String[] args) throws SQLException {
Connection conn = ds.getConnection();
DatabaseMetaData metadata = conn.getMetaData();
System.out.println(metadata.getURL());
System.out.println(metadata.getUserName());
System.out.println(metadata.getDriverName());
}
(3)运行结果

三、DBUtils工具
为此, Apache组织提供了一个名为DBUtis的工具.该工具作为数据库的一个组件被提供,实现了对JDBC的一种简便封装方案.它可以在不牺牲性能的前提下显著降低JDBC编程复杂度. DBUtis工具可以通过链接"tp:.mmo.h apache orpromons-oduisindex htm"下载,其最新版本为Apache Commons DbUtils 1.6.
3.2QueryRunner 类
该类通过优化处理SQL语句来减少编码量;集成使用后可实现主要部分的数据库操作;显著降低了编码工作量。
QueryRunner类支持一个带有javax salv.DataSource类型参数的构造函数,并将该输入作为QueryRunner实例来获取相应的Connection对象
3.3 ResultSetHandler 接口
该接口负责管理ResultSets,并将其转换为不同形式的数据。该ResultSetsHandler能够将数据转换成多种格式。基于不同数据类型的需要,请问您想要哪种类型的处理?
BeanHandler用于将结果集中的第一条数据映射到对应的一个JavaBean实例中。
BeanListHandler负责将每一条数据分别映射为一个JavaBean对象,并存入指定列表中。
ScalarHandler则用于在某个记录的一条特定字段上存储对应的Object对象。此外,在ResultSetHandler接口中提供了一个独立的方法handle(java.sql.ResultSet rs),若需要功能扩展,则建议自定义一个实现该接口的类,并重写handle()方法以完成所需的数据处理逻辑。
3.4 ResultSetHandler 实现类
(1) 为了在以dbc命名为jdbc的数据库中生成一个名为user的数据表,请参考以下create语句。
(2)请将以下数据录入到表格中。

(2)导入jar包

(3)创建BaseDao的类

package cn.iticast.chapter10.example;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.dbutils.ResultSetHandler;
public class BaseDao {
// 优化查询
public static Object query(String sql, ResultSetHandler<?> rsh,
Object... params) throws SQLException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 获得连接
conn = JDBCUtils.getConnection();
// 预编译sql
pstmt = conn.prepareStatement(sql);
// 将参数设置进去
for (int i = 0; params != null && i < params.length; i++)
{
pstmt.setObject(i + 1, params[i]);
}
// 发送sql
rs = pstmt.executeQuery();
Object obj = rsh.handle(rs);
return obj;
} catch (Exception e) {
e.printStackTrace();
}finally {
// 释放资源
JDBCUtils.release(rs, pstmt, conn);
}
return rs;
}
}
(4)在此包下创建User实体类,来封装User对象

package cn.iticast.chapter10.example;
public class User {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
(5)在此包中创建类来 演示BeanHandle类对结果集的处理

(6)运行结果

(7)演示类

