【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);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            // 关闭数据库连接 
            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 {
    
    private String uid;
    
    private String username;
    
    private String password;
    
    public String getUid() {
        return uid;
    }
    public void setUid(String uid) {
        this.uid = uid;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "DbUser [uid=" + uid + ", username=" + username + ", password=" + password + "]";
    } 
}

 

posted @ 2021-10-02 15:41  时念  阅读(205)  评论(0编辑  收藏  举报
Live2D