使用dbcp和pool进行数据库的数据源单例模式设计实现

使用dbcp和pool进行数据库的数据源单例模式设计实现


BasicDataSource类实现了DataSource接口,可以用于DBCP连接池的简单使用。
BasicDataSource Configuration 配置参数

参数描述
url建立连接的url
username用来建立jdbc连接的用户名
password用来建立jdbc连接的密码
driverClassNamejdbc driver className
username用来建立jdbc连接的用户名

QueryRunner
QueryRunner中一共有6种方法:

方法描述
execute执行SQL语句
batch批量处理语句
insert执行INSERT语句
insertBatch批量处理INSERT语句
querySQL中 SELECT 语句
updateSQL中 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 {
            // 也可以在这里回收资源
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值