【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&useSSL=false&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)">; }
}