【java学习笔记】数据库连接池与操作工具类

相比较原始的数据库操作而言,使用连接池技术及数据库操作工具类,往往可以更高效、更简洁,本文主要介绍连接池工具 c3po 包以及数据库操作工具类 commons-dbutils。

一、原始的数据库操作方式

原始的数据库操作方式如下,建立一个数据库对象流程较为复杂,IP、端口、账号、密码需要在代码中定义,每次执行都需要建立连接,关闭连接。

        try {
            //获取数据库驱动 
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取数据库连接对象
            conn = DriverManager.getConnection(
                    "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC", "root", "123456");
            //定义 sql
            String sql = "select * from User_test";
            //通过数据库连接对象获取数据库执行对象
            Statement statment = conn.createStatement();
            //执行 sql, 将返回值存放在 ResultSet 中
            ResultSet res_set = statment.executeQuery(sql);
            //遍历 ResultSet 对象
            while(res_set.next()){
                String id_str = res_set.getString("id");
                String username = res_set.getString("username");
                String password = res_set.getString("password");
                String newline = id_str+","+username+","+password+"\n";
                System.out.println(newline);
                FileUtils.write(file, newline, "utf8", true);}
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        e.printStackTrace();
    }
    </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭数据库连接 </span>

conn.close();
}

 

二、数据库连接池(c3po)

数据库连接池就是一个容器,存放数据库连接的容器,当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

相比较原始的连接方式,数据库连接池技术具有节约资源、用户访问高效的优势。常见的连接池技术有 c3po、Druid,本文描述的是 c3po 的实现过程。

以 maven 项目为例

1. 在 pom 文件中添加对应依赖

<dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
</dependency>

2、定义配置文件

名称及路径 : src/main/resources/c3p0-config.xml 

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置,只可以出现一次 -->
<!--根据 name 获取对应配置的配置 <named-config name="mysql"> -->
    <default-config>
        <!-- 配置 JDBC 四个基本属性 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <!--当连接池中的连接耗尽的时候 c3p0 一次同时获取的连接数。Default: 3 -->
        <property name="acquireIncrement">3</property>
        <!-- 初始化数据库连接池时连接的数量 -->
        <property name="initialPoolSize">5</property>
        <!-- 数据库连接池中的最小的数据库连接数 -->
        <property name="minPoolSize">2</property>
        <!-- 数据库连接池中的最大的数据库连接数 -->
        <property name="maxPoolSize">10</property>
    </default-config>
</c3p0-config>

3、创建数据库连接池对象 ComboPooledDataSource 以及获取数据库连接 getConnection

// 获得 c3p0 连接池对象
private static ComboPooledDataSource ds = new ComboPooledDataSource("mysql");

// 获得数据库连接对象
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}

// 获得 c3p0 连接池对象
public static DataSource getDataSource() {
return ds;
}

数据库连接池工具只管理数据库连接对象,不会影响后续的操作,后续操作的简化可以借助数据库操作工具类来实现,比如 commons-dbutils。

三、数据库操作工具类(commons-dbutils)

commons-dbutils 是一个开源 JDBC 工具类库,它是对 JDBC 的简单封装,学习成本极低,并且使用 dbutils 能极大简化 JDBC 编码的工作量,同时也不会影响程序的性能。

添加 pom 文件依赖

<dependency>
    <groupId>commons-dbutils</groupId>
    <artifactId>commons-dbutils</artifactId>
    <version>1.7</version>
</dependency>

基本操作

// commons-dbutils 核心 api, 构造时候需要传入数据库连接对象 (可以为上文中连接池中获取的连接对象)
QueryRunner runner = new QueryRunner(JDBCUtils.getDataSource());

// 定义 sql
String sql = "select * from user_test";

// 执行 sql,返回 DbUser 类构成的列表对象 (注意这里需要定义与数据库一模一样的数据库 model 类,才可以将查询结果一一对应)
List list = (List)runner.query(sql, new BeanListHandler(DbUser.class));

DbUser 对象
package com.lxs.db2excel;

public class DbUser2 {

</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String uid;

</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String username;

</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String password;

</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getUid() {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> uid;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setUid(String uid) {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.uid =<span style="color: rgba(0, 0, 0, 1)"> uid;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getUsername() {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> username;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setUsername(String username) {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.username =<span style="color: rgba(0, 0, 0, 1)"> username;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String getPassword() {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> password;
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> setPassword(String password) {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.password =<span style="color: rgba(0, 0, 0, 1)"> password;
}
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String toString() {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> "DbUser [uid=" + uid + ", username=" + username + ", password=" + password + "]"<span style="color: rgba(0, 0, 0, 1)">;
} 

}