连接池
使用的是dbcp连接池,需要导入的依赖jar包:common-dbcp-1.4.jar,commons-pool-1.6.jar
通过配置文件的方式配置dbcp连接池并加载驱动,配置文件dbcpconfig.properties:
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库的名称?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
username=数据库登录用户名
password=数据库登录密码
initialSize=10
maxTotal=50
maxIdle=20
minIdle=5
maxWaitMillis=5000
接着加载配置文件的代码如下:
BasicDataSource bs = null;
Properties properties = new Properties();
//通过反射来加载配置文件来得到一个inputStream对象
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("/dbcpconfig.properties");
properties.load(is);
//获得连接池对象dataSource
bs = (BasicDataSource) BasicDataSourceFactory.createDataSource(properties);
单例模式
设置工具类为单例模式,DBUtil单例模式(私有的属性、私有的构造、公开的对外方法),全程只创建一次实例,只加载一次配置文件;获取实例的方式是通过公开的静态方法getInstance
采用懒汉模式: DCL双检查锁机制(volatile防止重排序)
public class DBUtil {
private static volatile DBUtil instance = null;
static BasicDataSource bs = null;
// 私有的构造
private DBUtil() {
}
// 加载配置文件,静态加载只会进行一次
static {
try {
Properties properties = new Properties();
//通过反射来加载配置文件来得到一个inputStream对象
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("/dbcpconfig.properties");
properties.load(is);
//获得连接池对象dataSource
bs = (BasicDataSource) BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DBUtil getInstance() {
if(instance == null){//第一次检查
synchronized (DBUtil.class) {//加锁
if(instance == null){//第二次检查
instance = new DBUtil();
}
}
}
return instance;
}
}
完整代码
除了导入上面两个jar包还需要导入mysql-connector-java-8.0.1.jar
package com.util;
import org.apache.commons.dbcp.*;
import org.apache.commons.dbcp.BasicDataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.*;
/**
* JDBC数据库工具类(使用连接池)
* 需要的依赖jar包(/lib下)有:
* common-dbcp-1.4.jar,,commons-pool-1.6.jar,
* mysql-connector-java-8.0.1.jar
* **/
public class DBUtil {
// 设置DBUtil单例模式(私有的属性、私有的构造、公开的对外方法),全程只创建一次实例,只加载一次配置文件
// 采用懒汉模式: DCL双检查锁机制(volatile防止重排序)
private static volatile DBUtil instance = null;
static BasicDataSource bs = null;
// 私有的构造
private DBUtil() {
}
// 加载配置文件,静态加载只会进行一次
static {
try {
Properties properties = new Properties();
//通过反射来加载配置文件来得到一个inputStream对象
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("/dbcpconfig.properties");
properties.load(is);
//获得连接池对象dataSource
bs = (BasicDataSource) BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取工具类实例的方法
public static DBUtil getInstance() {
if(instance == null){//第一次检查
synchronized (DBUtil.class) {//加锁
if(instance == null){//第二次检查
instance = new DBUtil();
}
}
}
return instance;
}
// 获取连接的方法(从连接池中获取)
public Connection getConnection () {
try {
return bs.getConnection();
} catch (SQLException e) {
System.out.println("获取连接失败");
e.printStackTrace();
}
return null;
}
// 释放资源
public void closeAll(ResultSet rs, Statement stmt, Connection conn){
try {
if(rs!=null){
rs.close();
}
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
// 查询 query (Object... params 个数/类型任意的参数列表)
public List<Map<String,Object>> query(String sql,Object... params){
PreparedStatement pstmt = null; //预编译
Connection conn = null; //连接
List<Map<String,Object>> list = null; //结果集转化为List列表返回
try{
conn = getConnection();
pstmt = conn.prepareStatement(sql);//sql预编译
//将参数填入pstmt
if(params!=null){
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i+1, params[i]);
}
}
//执行预编译的sql后获得结果集
ResultSet rs = pstmt.executeQuery();
//获得表的键Keys(即列的名称)
ResultSetMetaData rd = rs.getMetaData();
//定义字符串列表用于装键,rd.getColumnCount()获取键的数目
String[] keys = new String[rd.getColumnCount()];
//将rd中的键值装入keys列表
for(int i=1;i<=rd.getColumnCount();++i){
keys[i-1] = rd.getColumnLabel(i);
}
//定义一个新的列表,列表中的单个元素代表表中的一行,一行由若干键值对<key,value>组成
list = new ArrayList<Map<String,Object>>();
while(rs.next()){
Map<String,Object> RowData = new HashMap<String,Object>();
for(int i=0;i<keys.length;++i){
RowData.put(keys[i],rs.getObject(keys[i]));
}
list.add(RowData);
}
}catch (Exception e){
e.printStackTrace();
} finally {
closeAll(null,pstmt,conn);
}
return list;
}
// 增删改 insert/delete/update
public int executeUpdate(String sql,Object... params) {
int ar = 0;
PreparedStatement pstmt = null;
Connection conn = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i+1, params[i]);
}
ar = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(null,pstmt,conn);
}
return ar;
}
}