使用dbcp和pool进行数据库的数据源单例模式设计实现
BasicDataSource类实现了DataSource接口,可以用于DBCP连接池的简单使用。
BasicDataSource Configuration 配置参数
参数 | 描述 |
---|---|
url | 建立连接的url |
username | 用来建立jdbc连接的用户名 |
password | 用来建立jdbc连接的密码 |
driverClassName | jdbc driver className |
username | 用来建立jdbc连接的用户名 |
QueryRunner
QueryRunner中一共有6种方法:
方法 | 描述 |
---|---|
execute | 执行SQL语句 |
batch | 批量处理语句 |
insert | 执行INSERT语句 |
insertBatch | 批量处理INSERT语句 |
query | SQL中 SELECT 语句 |
update | SQL中 INSERT, UPDATE, 或 DELETE 语句 |
DBCPDataSource.java
package nuc.edu.dao;
import org.apache.commons.dbcp2.BasicDataSource;
import javax.sql.DataSource;
/**
* 数据源一般是单例模式
*/
public class DBCPDataSource {
// 1 单例模式类的静态实例变量
private static DataSource dataSource;// = new BasicDataSource(); // 饿汉方式 -- 线程安全的
// 静态语句块进行初始
static { // 线程安全的,和饿汉方式是一样,只不过形式不一样
BasicDataSource basicDataSource = new BasicDataSource();
// 设置数据源的数据库连接属性
// 数据库jdbc连接属性信息
// uri mysql5和mysql8 连接串不一样,8要求有时区属性
// localhost - 数据库服务器主机名,或者ip地址, 127.0.0.1 表示本机
// 注意: 如果连接串解析是被,要注意可能是因为 & 引起的,因为有时需要 使用 & 的html转移符号 &
String strUri5 = "jdbc:mysql://localhost:3306/nuc202105?useUnicode=true&characterEncoding=utf8";
String strUri8 = "jdbc:mysql://localhost:3306/nuc202105?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true";
// drivername的名字 mysql5和mysql8 不一样
String strDriverName5 = "com.mysql.jdbc.Driver";
String strDriverName8 = "com.mysql.cj.jdbc.Driver";
String strUserName = "root";
String strUserPsw = "root";
// 给数据源对象设置相关数据库连接属性
basicDataSource.setUrl(strUri8);
basicDataSource.setDriverClassName(strDriverName8);
basicDataSource.setUsername(strUserName);
basicDataSource.setPassword(strUserPsw);
// 还可以继续set设置dbcp数据源的其他的属性值【参考官网或其他资料设置,一般根据项目运行时的状态由dba进行调试,此处,采用默认值】
basicDataSource.setInitialSize(3); // 连接池初始化的数量
// 多态,父类指代子类
dataSource = basicDataSource;
}
// 2 构造方法私有化
private DBCPDataSource() {
}
// 3 提供一个全局的访问方法入口
public static DataSource getDataSource() {
return dataSource;
}
}
TestDrive.java
import com.yuw.bean.UserInfoBean;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import javax.sql.DataSource;
import java.sql.*;
import java.util.List;
import java.util.Map;
public class TestDriver {
public static void main(String[] args) {
// 原生jdbc连接数据库
//testDataSource();
//testDBUtils();
testDBUtils2();
}
/**
* 使用dbutils进行数据库操作
*/
public static void testDBUtils2() {
try {
// 1 获取数据源对象 - dbcp数据源
DataSource dataSource = DBCPDataSource.getDataSource();
// 2 获取查询器 - dbutils使用 queryrunner作为数据库操作的查询器
QueryRunner queryRunner = new QueryRunner(dataSource);
// 3 准备sql语句
String strSql = "SELECT * FROM userinfo";
// 4 获取查询结果集
List<UserInfoBean> lstRusultSet =
(List<UserInfoBean>) queryRunner.query(strSql, new BeanListHandler(UserInfoBean.class));
// 5 遍历结果集,进行业务逻辑处理
System.out.println("转储结果:");
System.out.println(lstRusultSet);
// Huoqu某一行数据
System.out.println("第一行数据的用户名:");
System.out.println(lstRusultSet.get(0).getUserName());
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
// 也可以在这里回收资源
}
}
/**
* java使用dbutuils进行查询操作
*/
public static void testDBUtils() {
try {
// 1 获取数据源对象 - dbcp数据源
DataSource dataSource = DBCPDataSource.getDataSource();
// 2 获取查询器 - dbutils使用 queryrunner作为数据库操作的查询器
QueryRunner queryRunner = new QueryRunner(dataSource);
// 3 准备sql语句
String strSql = "SELECT * FROM userinfo";
// 4 获取查询结果集
List<Map<String, Object>> lstRusultSet = queryRunner.query(strSql, new MapListHandler());
// 5 遍历结果集,进行业务逻辑处理
System.out.println("转储结果:");
System.out.println(lstRusultSet);
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
// 也可以在这里回收资源
}
}
}