【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&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 { 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 + "]"; } }