JDBC连接池与DBUtils工具类

连接池

    实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池

 概念
    用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

 规范
    Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
常见的连接池:DBCP、C3P0。

C3P0

导入的jar包

根目录配置文件c3p0-config.xml

<c3p0-config>
	<!-- 默认配置,如果没有指定则使用这个配置 -->
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/teach</property>
		<property name="user">root</property>
		<property name="password">123456</property>
		<property name="checkoutTimeout">30000</property>
		<property name="idleConnectionTestPeriod">30</property>
		<property name="initialPoolSize">10</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">100</property>
		<property name="minPoolSize">10</property>
		<property name="maxStatements">200</property>
		<user-overrides user="test-user">
			<property name="maxPoolSize">10</property>
			<property name="minPoolSize">1</property>
			<property name="maxStatements">0</property>
		</user-overrides>
	</default-config> 
	
	<!-- 命名的配置 -->
	<named-config name="test">
		<!-- 连接数据库的4项基本参数 -->
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/db</property>
		<property name="user">root</property>
		<property name="password">1234</property>
		<!-- 如果池中数据连接不够时一次增长多少个 -->
		<property name="acquireIncrement">5</property>
		<!-- 初始化连接数 -->
		<property name="initialPoolSize">20</property>
		<!-- 最小连接受 -->
		<property name="minPoolSize">10</property>
		<!-- 最大连接数 -->
		<property name="maxPoolSize">40</property>
		<!-- -JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量 -->
		<property name="maxStatements">0</property>
		<!-- 连接池内单个连接所拥有的最大缓存statements数 -->
		<property name="maxStatementsPerConnection">5</property>
	</named-config>
</c3p0-config>

获取连接

public void c3p0DataSource() throws SQLException {
    //1.获取c3p0连接池核心类对象
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    //2.设置c3p0的配置文件,放在源代码的根目录(src)
    //实例化的时候不指定参数使用默认配置,如果指定参数,使用名称为参数的配置
    //默认使用源代码目录下的配置文件
    //3.获取连接
    Connection conn = dataSource.getConnection();
	//下面使用连接进行数据库操作
}

DBCP

导入的jar包
在这里插入图片描述
配置文件dbcp-config.properties

#基本配置内容
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/teach
username=root
password=123456

initialSize=10

maxActive=50

maxIdle=20

minIdle=5

maxWait=60000

connectionProperties=useUnicode=true;characterEncoding=UTF-8

defaultAutoCommit=true

defaultReadOnly=NONE

defaultTransactionIsolation=READ_UNCOMMITTED

获取连接

public void dbcpDataSource() throws Exception {
    //1.获取dbcp的配置文件 properties
    Properties prop = new Properties();
    //利用类的 appClassLoader应用类加载器默认路劲是源代码的根目录
    //使用类加载器的getResourceAsStream读取文件的输入流
    prop.load(DataSourceDemo.class.getClassLoader().getResourceAsStream("dbcp-config.properties"));
    //2.获取连接池数据源的核心类对象
    DataSource dataSource = BasicDataSourceFactory.createDataSource(prop);
    //3.获取链接
    Connection conn = dataSource.getConnection();
}

Druid

导入jar包
在这里插入图片描述

配置文件与dbcp类似

获取连接

public void druidDataSource() throws Exception {
    //1.获取dbcp的配置文件 properties
    Properties prop = new Properties();
    //利用类的 appClassLoader应用类加载器默认路劲是源代码的根目录
    //使用类加载器的getResourceAsStream读取文件的输入流
    prop.load(DataSourceDemo.class.getClassLoader().getResourceAsStream("dbcp-config.properties"));
    //2.获取连接池数据源的核心类对象
    DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
    //3.获取链接
    Connection conn = dataSource.getConnection();
}

若使用监控等功能还需对项目配置文件进行配置

将连接池封装成工具类

public class DBCPUtil {
    private static DataSource dataSource =null;
    private static Properties prop = new Properties();
    static {
        //1.获取dbcp的配置文件 properties
        //利用类的 appClassLoader应用类加载器默认路劲是源代码的根目录
        //使用类加载器的getResourceAsStream读取文件的输入流
        try {
            prop.load(DataSourceDemo.class.getClassLoader().getResourceAsStream("dbcp-config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    //获取或者设置数据源
    public static DataSource getDataSource(String name){
        //C3P0
//      if(name!=null && !name.equals("")){
//          dataSource = new ComboPooledDataSource(name);
//      }else{
//          dataSource = new ComboPooledDataSource();
//      }
        //DBCP
        try{
            dataSource = BasicDataSourceFactory.createDataSource(prop);
        }catch (Exception e){
            e.printStackTrace();
        }

        return  dataSource;
    }

    //获得连接方法
    public static Connection getConn() {
        Connection conn = null;
        try {
            if(dataSource==null){
                getDataSource(null);
            }
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return  conn;
    }

    //关闭资源的方法
    public static void close(Connection conn, Statement st, ResultSet set){
        try {
            if(set!=null){
                set.close();
            }
            if(st!=null){
                st.close();
            }
            if(conn!=null){
                conn.close();
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

DBUtils

  DBUtils是java编程中的数据库操作实用工具,小巧简单实用,封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
  Dbutils三个核心功能介绍:

  1. QueryRunner中提供对sql语句操作的API.
  2. ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
  3. DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法

QueryRunner使用

public void static void main(String[] args) throws SQLException {
    //映射(OR) Mybatis ,Hibernate ,jdbcTemplate等等
    //1.得到核心类
    QueryRunner qr = new QueryRunner(ConnectionUtil.getDataSource(null));
    //2.编写sql语句
    //使用防注入sql语句写法
    String sql ="INSERT INTO course VALUES(?,?,?);";
    //3.设置参数
    Object[] params = {"6-104","大数据",5};
    //4.执行语句
    //a.DML update()  b.DQL query()
    int i = qr.update(sql, params);
    System.out.println(i);
}

使用ResultSetHandler接口将结果集封装

public void static void main(String[] args) throws SQLException {
    QueryRunner qr = new QueryRunner(ConnectionUtil.getDataSource(null));
    String sql1 = "SELECT * FROM student WHERE name=? AND password=? ";
    String sql2 = "SELECT * FROM student WHERE  password=? ";
    String sql3 = "SELECT count(0) FROM student WHERE sex1='男' ";
    Object[] param1= {"刘晨","123456"};
    //ResultSetHandler 结果集模板 ==>(时间模板 yyyy-MM-dd HH:mm:ss)
    //1.BeanHandler 要求结果一定要是一条,直接帮你映射bean
    //注意:表中的字段要和java中的字段完全一样(缺陷),
    //匹配的是javabean中get和set方法
    Student c =qr.query(sql1, new BeanHandler<>(Student.class), param1);
    System.out.println(c);
    //2.BeanListHandler 支持查询结果是多条数据
    List<Student> list = qr.query(sql2, new BeanListHandler<>(Student.class), "123456");
    //System.out.println(list);
    //qr.query(sql, ,param);
    //3.ScalarHandler 类型无法确定 先转成String 再转成你需要的类型
    //如果你要指定返回类型,要在泛型中指定
    Object o = qr.query(sql3, new ScalarHandler<>());
    String s = o.toString();
    int num = Integer.parseInt(s);
    System.out.println(num);
    //4.MapHandler : 将查询到的一条记录,封装到Map中,map.key=字段名,map.value=值
	//主要用途:多表操作、将数据转换json 等
	Map<String,Object> map = queryRunner.query(sql2, new MapHandler(), "123456");	
	System.out.println(map);
	//还有MapListHandler、ArrayHandler、ArrayListHandler、KeyedHandler、ColumnListHandler用法类似
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值