1.使用连接池重写工具类
1.1 连接池概念、原理及其使用
1.11 什么是连接池
数据库连接池是负责分配、管理、和释放数据库连接的;
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。
1.12 连接池的原理
1.13 连接池的使用
-
为什么要用连接池
数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出。
目的:解决建立数据库连接耗费资源和时间很多的问题,提高性能。 -
如何使用连接池
建一个类,实现接口 定义三个方法
init()初始化资源,
获取连接getConnection
关闭资源(关闭连接)
1.14 影响连接池性能的因素
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。
无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。
连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
最小连接数
是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
最大连接数
是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
最小连接数与最大连接数差距
最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
1.2 编写标准的数据源(规范)
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
常见的连接池:DBCP、C3P0。
接下来,我们就详细的学习连接池,我们将先完成自定义标准连接池的编写。
自定义数据库连接池要实现javax.sql.DataSource接口,一般都叫数据源。
1.3 编写数据源时遇到的问题及解决办法
1.3.1 装饰者设计模式
1.4 常用的数据源配置
1.4.1 DBCP连接池
DBCP:Apache推出的Database Connection Pool
使用步骤:
添加jar包 commons-dbcp-1.4.jar commons-pool-1.5.6.jar
添加属性资源文件
编写数据源工具类
1.4.2 C3P0连接池(常用且重要)
C3P0开源免费的连接池!目前使用它的开源项目有:Spring、Hibernate等。使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件 c3p0-config.xml
使用步骤:
1、添加jar包
2、编写配置文件
c3p0-config.xml,放在src中(注:文件名一定不要写错)
3、编写工具类:
2.使用DBUtils 增删改查的操作
2.1 案例分析
简化JDBC代码开发,本案例我们将采用apache commons组件一个成员:DBUtils。
DBUtils就是JDBC的简化开发工具包。需要使用技术:连接池(获得连接)、SQL语句都没有少。
2.2 案例相关知识
2.2.1 JavaBean组件
JavaBean就是一个类,在开发中常用于封装数据。具有如下特性
1.需要实现接口:java.io.Serializable ,通常偷懒省略了。
2.提供私有字段:private 类型 字段名;
3.提供getter/setter方法:
4.提供无参构造
public class Category {
private String cid;
private String cname;
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
…toString….
}
2.3 DBUtils完成CRUD
2.3.1 概述
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。
DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
Dbutils三个核心功能介绍
- QueryRunner中提供对sql语句操作的API.
- ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
- DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
2.3.2 QueryRunner核心类
- QueryRunner(DataSource ds) ,提供数据源(连接池),DBUtils底层自动维护连接connection
- update(String sql, Object… params) ,执行更新数据 insert update delete
- query(String sql, ResultSetHandler rsh, Object… params) ,执行查询 select
2.3.3 ResultSetHandler结果集处理类
2.3.4 实现
开发步骤:
1、创建项目,并导入jar包
2、创建连接池
3、编写测试类
2.3.4.1 添加
@Test
public void testInsert() {
try {
//1 核心类
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
//2 sql
String sql = "insert into category(cid,cname) values('c001','家电')";
//3 参数
Object[] params = {"c006","家电"};
//4执行
queryRunner.update(sql, params);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
2.3.4.2 更新
@Test
public void testUpdate() throws Exception{
try {
//1 核心类
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
//2 sql
String sql = "update category set cname=? where cid = ?";
//3 参数
Object[] params = {"家电","c006"};
//4执行
queryRunner.update(sql, params);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
2.3.4.3 删除
@Test
public void testDelete() throws Exception{
try {
//1 核心类
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
//2 sql
String sql = "delete from category where cid = ?";
//3 参数
Object[] params = {"c006"};
//4执行
queryRunner.update(sql, params);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
2.3.4.4 通过id查询
这里是引用`@Test
public void testFindById() throws Exception{
try {
//1 核心类
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
//2 sql
String sql = "select * from category where cid=?";
//3 参数
Object[] params = {"c003"};
//4执行
Category category = queryRunner.query(sql, new BeanHandler<Category>(Category.class), params);
System.out.println(category);
} catch (Exception e) {
throw new RuntimeException(e);
}
}`
2.3.4.5 查询所有
@Test
public void testFindAll() throws Exception{
try {
//1 核心类
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
//2 sql
String sql = "select * from category";
//3 参数
Object[] params = {};
//4执行
List<Category> allCategory = queryRunner.query(sql, new BeanListHandler<Category>(Category.class), params);
for (Category category : allCategory) {
System.out.println(category);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
2.3.4.6总记录数
@Test
public void testCount() throws Exception{
try {
//1 核心类
QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
//2 sql
String sql = "select count(*) from category";
//3 参数
Object[] params = {};
//4执行
Long numLong = (Long) queryRunner.query(sql, new ScalarHandler(), params);
int num = numLong.intValue();
System.out.println(num);
} catch (Exception e) {
throw new RuntimeException(e);
}
}