概述
使用jdbc的时候,每操作一次都需要获取连接,用完之后把连接释放掉了
为了管理数据库的连接,提高项目的性能。就在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可。所有的连接池必须实现一个接口 javax.sql.DataSource接口。获取连接的方法调用Connection getConnection(), 归还连接的方法就是以前的释放资源的方法,调用connection.close();
常用连接池:
DBCP(没有自动回收空闲连接的功能):apache组织
使用步骤:
1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
a.硬编码 new BasicDataSource()v
b.配置文件
C3P0(有自动回收空闲连接功能):
hibernate和spring使用
有自动回收空闲连接的功能
使用步骤:
1.导入jar包(c3p0-0.9.1.2.jar)
2.使用api
a.硬编码 new ComboPooledDataSource()
ComboPooledDataSource ds=new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/day07");
ds.setUser("root");
ds.setPassword("123456");
Connection coon=ds.getConnection();
String sql="insert into categroy values(?,?)";
PreparedStatement st=coon.prepareStatement(sql);
st.setString(1,"c007");
st.setString(2,"duyao");
int i=st.executeUpdate();
System.out.println(i);
JdbcUntils_.closeResource(coon,st,null);
b.配置文件
配置文件的名称:c3p0.properties或者c3p0-config.xml
配置文件的路径: src下
编码只需要一句话:
new ComboPooledDataSource()
其余同上。
增强方法:
1.继承
2.修饰这模式(静态代理)
3.动态代理
package com.wzh.datasource;
import com.wzh.untils.JdbcUntils_;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;
//简易的连接池
public class MyDataSource {
static LinkedList<Connection> pool=new LinkedList<>();
static {
//初始化的时候需要放入3个连接
for (int i=0;i<3;i++){
try {
Connection conn= JdbcUntils_.getConnection();
pool.addLast(conn);
}catch (SQLException e){
e.printStackTrace();
}
}
}
//从连接池中获取连接
public static Connection getConnection(){
//获取连接的时候,需要判断List是否为空
if(pool.isEmpty()){
//添加2个连接进去
for (int i=0;i<3;i++){
try {
Connection conn= JdbcUntils_.getConnection();
pool.addLast(conn);
}catch (SQLException e){
e.printStackTrace();
}
}
}
System.out.println("从池中获取一个链接");
return pool.removeFirst();
}
//归还连接的方法
public static void addBack(Connection conn){
//将conn放入到list的最后面即可
pool.addLast(conn);
System.out.println("连接已归还");
}
}
package com.wzh.datasource;
import java.sql.Connection;
public class TestDs {
public static void main(String[] args){
//创建连接
MyDataSource ds=new MyDataSource();
Connection conn=ds.getConnection();
System.out.println(conn);
//归还连接
ds.addBack(conn);
}
}
装饰者模式
https://mp.csdn.net/postedit/102727621
使用步骤:
1.装饰者和被装饰者实现同一个接口或者同一个类
2.装饰者中要有被装饰者的引用
3.对需要的增强方法进行加强
4.对不需要加强的方法
使用dbutils完成curd操作
dubutils是apache公司的一个工具类,jdbc的框架,更方便我们使用
使用步骤:
1.倒入jar包(commons-dbutils-1.4.jar)
2.创建一个queryrunner类
queryrunner作用:操作sql语句
构造方法:
new QueryRunner(Datasource ds);
3.编写sql
4.执行sql
query(..):执行r操作
update(...):执行cud操作
连接池的工具类
package com.wzh.untils;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DataSourceUtils {
private static ComboPooledDataSource ds=new ComboPooledDataSource();
//获取数据源
public static DataSource getDataSource(){
ComboPooledDataSource ds = DataSourceUtils.ds;
return ds;
}
//获取连接
public static Connection getConnection()throws SQLException{
return ds.getConnection();
}
//释放资源
public static void closeResource(Connection conn, Statement st, ResultSet rs) {
closeResultSet(rs); //连接
closeStatement(st); //语句执行者
closeConn(conn); //结果集
}
//释放连接
public static void closeConn(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
//释放预计执行者
public static void closeStatement(Statement st) {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
st = null;
}
}
//释放结果集
public static void closeResultSet(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
}
}
使用连接池进行跟新数据
public class curd {
@Test
public void insert()throws SQLException {
//1.创建queryrunner类
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
//2.编写sql
String sql="insert into categroy values(?,?)";
//3.执行sql
qr.update(sql,"c201","chufangdianqi");
}
}
核心类或接口
QueryRunner:类名
作用:操作sql语句
构造器:
new QueryRunner(Datasource ds);
注意:
底层帮我们创建连接,创建语句执行者,释放资源
常用方法:
query(..);
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from categroy";
Object[] query=qr.query(sql,new ArrayHandler());
System.out.println(Arrays.toString(query));
update(..);
DdUtils:释放资源,控制事务
closeQuietly(conn);//内部处理异常
commitAndClose(Connection conn);//提交事务并释放连接
ResultSetHandler:封装结果集 接口(查询的时候用到)
9个实现类:
- ArrayHandler:将查询结果的第一条封装成数组,返回
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from categroy";
Object[] query=qr.query(sql,new ArrayHandler());
System.out.println(Arrays.toString(query));
- ArrayListHandler:将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from categroy";
List<Object[]> list=qr.query(sql,new ArrayListHandler());
for (Object[] objects:list){
System.out.println(Arrays.toString(objects));
}
- BeanHandler:将查询结果的第一条记录封装成指定的bean对象,返回
- BeanListHandler:将查询结果的第一条记录封装成指定的bean对象,将每一个bean对象放入list集合中,返回
- ColumnListHandler:将查询结果的指定一列放入list中返回
- MapHandler:将查询结果的第一条记录封装成map,字段名那个作为key,值为value,返回
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from categroy";
Map<String,Object>map =qr.query(sql,new MapHandler());
System.out.println(map);
- MapListHandler:将查询结果的第一条记录封装成指定的map对象,将每一个map对象放入list集合中,返回
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from categroy";
List<Map<String,Object>>list =qr.query(sql,new MapListHandler());
for (Map<String,Object>map : list){
System.out.println(map);
}
- ScalarHandler:针对于聚合函数 例如:count(),返回值是一个Long值