JDBC连接池
1.把对所有Dao类的操作——抽取一个父类
抽取:公共的属性、获取连接对象、增删改操作
把Dao类中的所有公共内容抽取到一个父类
package com.zmq.dao;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
* @program: JDBC02
* @description:
* @author: 赵梦倩
* @create: 2024-04-29 08:52
**/
public class BaseDao {
protected Connection con=null;
protected PreparedStatement ps=null;
protected ResultSet rs=null;
private String driverName="com.mysql.cj.jdbc.Driver";
private String url="jdbc:mysql://localhost:3306/zmq";
private String name="root";
private String password="123456";
//连接方法
public void getCon() throws Exception {
//加载驱动
Class.forName(driverName);
//获取连接对象
con=DriverManager.getConnection(url,user,password);
}
//关闭所有资源
public void closeAll(){
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
//增删改
public int edit(String sql,Object... obj){
int row=0;
try {
getCon();
ps=con.prepareStatement(sql);
//为占位符赋值
for(int i=0;i< obj.length;i++){
ps.setObject(i+1,obj[i]);
}
row = ps.executeUpdate();
return row;
} catch (Exception e) {
e.printStackTrace();
}finally {
closeAll();
}
return 0;
}
}
2.把数据源信息放入属性文件中
数据源:即连接池,以key=value的形式存储固定常量,便于客户根据需求修改连接数据库的相关数据
创建一个属性文件x x x. properties
必须放在src目录下
# 里面的内容格式:key=value
driverName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/zmq
username=root
password=123456
父类中相关属性变为静态的
private static String driverName="";
private static String driverName="";
private static String url="";
private static String user="";
private static String password="";
在抽取的父类中读取属性文件中的内容——使用静态代码块
//静态代码块: 随着类的加载而被加载,而且只会加载一次。
static{
try {
//读取属性文件封装了一个类Properties
Properties properties=new Properties();
//加载属性文件
// InputStream is=BaseDao.class.getResourceAsStream("db.properties");
InputStream is=BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(is);
//读取相应key的值
driverName=properties.getProperty("driverName");
url=properties.getProperty("url");
name=properties.getProperty("username");
password=properties.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
}
3. 引用数据源——连接池
连接池:该池子中存储的是连接对象。预先存放一些连接对象,当想获取连接对象时,只需要从连接池中获取,使用完毕后归还到池子中。
种类:druid(阿里巴巴的德鲁伊)
C3P0:这是一个开放源代码的JDBC连接池,与Hibernate一起发布,支持jdbc3和jdbc2扩展规范。 DBCP(Database Connection Pool):依赖于Jakarta Commons Pool对象池机制的数据库连接池,可以直接在应用程序中使用。 Proxool:提供了一个Java SQL Driver驱动程序,可以透明地为现存的JDBC驱动程序增加连接池功能。 BoneCP:一个快速、开源的数据库连接池,旨在帮助用户管理数据连接,使应用程序能更快速地访问数据库。 Druid:是一个高效、功能全面的数据库连接池,广泛应用于大数据和互联网车辆应用中。 DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager:这些连接池各有特色,如DDConnectionBroker简单轻量级,DBPool高效易配置,XAPool为XA数据库连接池,Primrose支持动态池管理,SmartPool解决连接泄漏问题,MiniConnectionPoolManager轻量级且无需依赖第三方包。
步骤:
- 引入bruid的jar包到lib目录下
- 放入工程,将jar包添加库——解压
- 属性文件.properties——key的名称不能改变
#里面的内容格式key=value
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/qy174
username=root
password=root
#最大的活跃数
maxActive=10
#初始的大小
initialSize=5
#最大的等待时间
maxWait=5000
# key的名称必须是如上
-
使用
-
定义属性,数据源静态私有,其他保护
public:公共,该工程下任何位置都可以访问到
protected:本包以及不同包下的子类可以访问到
default:本包下的类可以访问到
private:只允许本类访问
-
-
静态代码块
- 创建属性文件对象
- 创建输入流读取属性文件
- 读取属性文件
- 创建连接池对象,默认读取名称key的值
-
获取连接对象的方法
- 从连接池中获取连接对象
-
关闭所有的资源
-
增删改公共方法
- 调用获取连接对象方法
- 预编译执行sql语句
- 通过普通for循环为占位符赋值
- 返回值
public class BaseDao {
//public: 公共 该工程下任何位置都可以访问到 protected:本包以及不同包下的子类访问到 默认:本包下的类访问到 private:本类访问
protected Connection conn = null;
protected PreparedStatement ps = null;
protected ResultSet rs = null;
private static DataSource dataSource;
static {
try {
Properties properties = new Properties();
InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
properties.load(is);
//创建连接池对象---默认读取名称DriverClassName url username password的值
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接对象的方法
public void getConn() throws Exception {
//从连接池中获取连接对象
conn = dataSource.getConnection();
}
//关闭所有的资源
public void closeAll() {
if (rs != null) {
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
//增删改公共方法
public int edit(String sql, Object... params) {
int row = 0;
try {
getConn();
ps = conn.prepareStatement(sql);
//为占位符赋值。
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
row = ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeAll();
}
return row;
}
}