需求:使用c3p0 连接池 完成curd 操作
分析:之前写了一个工具类(注册驱动,获取连接,释放资源)------(没有连接池的时候)
现在写一个升级版的连接池(获取连接池,获取连接,释放资源—(使用C3p0 连接池)
要使用
关于使用:自己写了这样一个工具类,可以像之前使用jdbc 的工具类那样,单纯的使用他的静态方法。补充一点:dbuntils 是apeach 组织的一个工具类,一个框架(封装了各种方法,方便我们的使用)是代码更加的简单,要想这样使用就要导入jar 包,使用queryrunneryong 类
dbutils 的使用步骤:
先写一个工具类(完成从连接池中获取连接,关闭资源等操作)
package web_database_demo.C3P0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.ConnectionPoolDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//工具类
public class DataSource_utils {
private static ComboPooledDataSource ds = new ComboPooledDataSource();//读取配置文件,使用默认配置
//获取连接池
public static javax.sql.DataSource getDataSource() {
return ds;
}
//获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//释放资源
public static void closeResource(Connection conn, Statement st, ResultSet rs) {
//先创建的后释放
closeResult(rs);
closeStatement(st);
closeConn(conn);
}
/**
* 释放连接资源
*
* @param conn
*/
public static void closeConn(Connection conn) {
if (conn != null) {//在释放资源的时候都要考虑到资源对象为空的情况
try {//关闭会出现异常
conn.close();
} catch (Exception e) {
}
conn = null;//无论是否关闭成功都将conn 设置为null 空对象会被Java的垃圾回收机制,快速的回收处理
}
}
/**
* 释放执行者资源
*
* @param st
*/
public static void closeStatement(Statement st) {
if (st != null) {//关闭会出现异常
try {
st.close();
} catch (Exception e) {
}
st = null;//无论是否关闭成功都将conn 设置为null 空对象会被Java的垃圾回收机制,快速的回收处理
}
}
/**
* 释放结果集资源
*
* @param rs
*/
public static void closeResult(ResultSet rs) {
if (rs != null) {//关闭会出现异常
try {
rs.close();
} catch (Exception e) {
}
rs = null;//无论是否关闭成功都将conn 设置为null 空对象会被Java的垃圾回收机制,快速的回收处理
}
}
}
使用dbutils 框架
1.导入jar 包(commnos-dbutils- .jar)
2.创建一个queryrunner 类的对象:操作sql 语句(这是dbutils 框架中封装的类)
new QueryRunner(DataSource ds); 传入一个连接池
3.编写sql 语句’
4.执行sql
a.query(…) : 执行r 查找操作
b. update(…) : 执行cud 操作
代码:
*@使用dbutils 实现curd
*/
@Test
public void Insert() throws SQLException {
//创建一个QueryRunner
QueryRunner qr = new QueryRunner(dbutils.getDataSource());//
//编写sql语句
String sql = "insert into st values(?,?)";
//执行sql语句
qr.update(sql,"S_1005","毒药");
}
}
/
核心类或者是接口:
1.QueryRunner:操作sql 语句
new QueryRunner(DataSource ds);
注意:底层会帮我们创建连接,创建语句执行者,释放资源
常用方法:query(…) update(…)
2.DbUtils:释放资源,控制事务
3.ResultSetHandlder :封装结果集(查询) 是一个接口
有九个结果集:
ArrayHandler 将查询到的结果的第一条记录封装成数组
ArrayListhandler 将查询结果的每一条记录封装成数组,将每一个数组放入List 中返回
!! BeanHandler 将查询的结果的第一条记录封装成指定 对象,返回
!!BeanListHandler 将查询结果的每一条记录封装成指定对象,将每一个bean 对象放入List 集合中
ColumListHandler 将查询结果的指定一列放入list 中返回
MapHandler 将查询结果的第一条记录封装成map 字段名为 key 值value 返回
!!MapListHandler 将查询结果的每一条记录封装成Map集合再存储到List 集合中
!!ScalarHandler 针对于聚合函数 例如:count() 返回的是long 值
///
使用dbutils 工具类(框架),配置文件,c3p0 连接池
QueryRunner qr = new QueryRunner(dbutils.getDataSource());
这一句的底层:
1.在dbutils 工具类中有 new CombopooledDataSource() 会自动读取配置文件
/
**
关于JDBC的总结:
**
JDBC 总结:
jdbc:
java 语言操作数据库
jdbc是oracle 公司指定的一套规范
驱动:jdbc的实现类,有数据库厂商提供
jdbc 操作步骤:
1.导入jar 包
2.注册驱动
3.获取连接
4.编写sql 语句
5.获取语句执行者
PreparedStatement st = conn.prepareStatement(sql);
6.设置参数
st.setxxx(int 第几个问号,object 实参)
7.执行sql
int i = st.executeUpdate();
ResultSet rs = st.executeQuery();
8.处理结果
ResultSet:
while(rs.next()){
rs.getXXX(int|String)
}
9.释放资源
///
写自己的工具类完成注册驱动,获取连接,释放资源
使用配置文件:
获取src 目录下的properties 格式的配置文件
ResourceBundle bundle = ResourceBundle.getBundle(“不带后缀名的文件名”)
String value = bundle.getString(“key”);
/
自定义连接池:
增强函数的方法:
1.继承
2.装饰者模式
3.动态模式
//
装饰者模式(静态代理)
1.装饰着和被装饰者有继承或者是实现同一个类或者是接口
2.在装饰者中要有被装饰者的引用
3.对需要增强的方法进行加强,不需要加强的方法调用原来的方法
将自定义的连接池加上装饰者模式(将close 方法进行加强)就是优化的连接池
/
常见的连接池:
dbcp:了解
C3P0:重点掌握
使用配置文件:
文件名:c3p0.properties 或者是 c3p0-config.xml 文件的内容书写也是有要求的
文件的位置:src 目录下
使用方法:
1.直接 new CombopooledDataSource();
在设置四个参数:driverClass url user password
2.getConnection 获取连接
3.编写sql语句
4.获取执行者 PreparedStatement pr = conn.preparedStatement();
///要掌握使用的
dbutils :工具类,封装类jdbc 的操作
是对数据的操作更加的简单,之前的那些方法都是一些原理,使用dbutils 才是我们会使用的方法
使用步骤:
1.导入jar 包
2.创建queryRunner 类
3.编写sql 语句
4.执行sql 语句
QueryRunner :操作sql语句
构造器:new queryRunner(DataSource ds);//传入一个连接池
底层为我们获取连接,创建语句执行者,释放资源
配合使用的是dbutils 工具类
常用方法:
query(…)
update(…)
ResultSetHandler:封装结果集
BeanHandler
BeanListHandler
MapListhandler
Scalarhandler
///
学习总结:
一:JDBC
Java语言操作数据库,是一套规范(全是接口)
使用jdbc 不能直接使用这套规范,
驱动:jdbc 实现类
使用要先导入jar包
二:连接池
必须要实现javax.sql.DataSource 接口
获取连接 getConnection 归还连接 conn.close
常见连接池:C3p0
三:dbutils 工具类 (框架)