Apache—dbutils开源JDBC工具类库简介

一、前言

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

  API介绍:
  ①org.apache.commons.dbutils.QueryRunner
  ②org.apache.commons.dbutils.ResultSetHandler

  工具类:org.apache.commons.dbutils.DbUtils

二、DbUtils类

  DbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:

  ①public static void close(…) throws java.sql.SQLException: 
  DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。

  ②public static void closeQuietly(…):

  这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能
隐藏一些在程序中抛出的SQLEeception。

  ③public static void commitAndCloseQuietly(Connection conn):
  用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。

  ④public static boolean loadDriver(java.lang.String driverClassName):

  这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。

三、QueryRunner类

  该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

  QueryRunner类提供了两个构造方法:
  ①默认的构造方法
  ②需要一个 javax.sql.DataSource 来作参数的构造方法。

  QueryRunner类的主要方法:

  ①public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:

  执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和ResultSet 的创建和关闭。

  ②public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 

  几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。

  ③public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException :

  执行一个不需要置换参数的查询操作。

  ④public int update(Connection conn, String sql, Object[] params) throws SQLException:

  用来执行一个更新(插入、更新或删除)操作。

四、ResultSetHandler接口

  该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。

  ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。

  ResultSetHandler 接口的实现类:

  ①ArrayHandler:把结果集中的第一行数据转成对象数组。
  ②ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
  ③BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
  ④BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
  ⑤ColumnListHandler:将结果集中某一列的数据存放到List中。
  ⑥KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
  ⑦MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
  ⑧MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List

五、代码示例

 package me.jdbc.day04;

 import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import org.apache.commons.dbutils.QueryLoader;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test; import me.jdbc.day02.Customer; /**
* Apache DBUtils测试类
*
* @author Administrator
*
*/
public class DBUtilsTest { /**
* QueryLoader: 可以用来加载存放着 SQL 语句的资源文件. 使用该类可以把 SQL 语句外置化到一个资源文件中. 以提供更好的解耦
*
* @throws IOException
*/
@Test
public void testQueryLoader() throws IOException {
// / 代表类路径的根目录.
Map<String, String> sqls = QueryLoader.instance().load("/sql.properties"); String updateSql = sqls.get("UPDATE_CUSTOMER");
System.out.println(updateSql);
} /**
* 1. ResultSetHandler 的作用:
* QueryRunner 的 query 方法的返回值最终取决于 query 方法的ResultHandler 参数的 hanlde 方法的返回值.
*
* 2. BeanListHandler: 把结果集转为一个 Bean 的 List, 并返回.
* Bean 的类型在 创建BeanListHanlder 对象时以 Class 对象的方式传入.
* 可以适应列的别名来映射 JavaBean 的属性名:
* String sql = "SELECT id, name customerName, email, birth FROM customers WHERE id = ?";
*
* BeanListHandler(Class<T> type)
*
* 3. BeanHandler: 把结果集转为一个 Bean, 并返回.
* Bean 的类型在创建 BeanHandler 对象时以 Class对象的方式传入 BeanHandler(Class<T> type)
*
* 4. MapHandler: 把结果集转为一个 Map 对象, 并返回. 若结果集中有多条记录, 仅返回 第一条记录对应的 Map 对象.
* Map的键: 列名(而非列的别名), 值: 列的值
*
* 5. MapListHandler: 把结果集转为一个 Map 对象的集合, 并返回. Map 的键: 列名(而非列的别名), 值: 列的值
*
* 6. ScalarHandler: 可以返回指定列的一个值或返回一个统计函数的值.
*/ @Test
public void testScalarHandler() {
Connection connection = null;
QueryRunner queryRunner = new QueryRunner(); String sql = "SELECT name FROM customers WHERE id = ?"; try {
connection = JDBCTools.getConnection();
Object count = queryRunner.query(connection, sql, new ScalarHandler(), 6); System.out.println(count);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, null, connection);
}
} @Test
public void testMapListHandler() {
Connection connection = null;
QueryRunner queryRunner = new QueryRunner(); String sql = "SELECT id, name, email, birth FROM customers"; try {
connection = JDBCTools.getConnection();
List<Map<String, Object>> mapList = queryRunner.query(connection, sql, new MapListHandler()); System.out.println(mapList);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, null, connection);
}
} @Test
public void testMapHandler() {
Connection connection = null;
QueryRunner queryRunner = new QueryRunner(); String sql = "SELECT id, name customerName, email, birth FROM customers WHERE id = ?"; try {
connection = JDBCTools.getConnection();
Map<String, Object> map = queryRunner.query(connection, sql, new MapHandler(), 4); System.out.println(map);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, null, connection);
}
} /**
* 测试 ResultSetHandler 的 BeanListHandler
* 实现类 BeanListHandler: 把结果集转为一个 Bean的 List.
* 该 Bean 的类型在创建 BeanListHandler 对象时传入:
* new BeanListHandler<>(Customer.class)
*
*/
@Test
public void testBeanListHandler() {
String sql = "SELECT id, name, email, birth FROM customers"; // 1. 创建 QueryRunner 对象
QueryRunner queryRunner = new QueryRunner(); Connection conn = null; try {
conn = JDBCTools.getConnection(); Object object = queryRunner.query(conn, sql, new BeanListHandler<>(Customer.class)); System.out.println(object);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, null, conn);
}
} /**
* 测试 QueryRunner 的 query 方法
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test
public void testResultSetHandler() {
String sql = "SELECT id, name, email, birth FROM customers"; // 1. 创建 QueryRunner 对象
QueryRunner queryRunner = new QueryRunner(); Connection conn = null; try {
conn = JDBCTools.getConnection();
/**
* 2. 调用 query 方法: ResultSetHandler
* 参数的作用: query 方法的返回值直接取决于ResultSetHandler 的 hanlde(ResultSet rs) 是如何实现的.
* 实际上, 在QueryRunner 类的 query 方法中也是调用了 ResultSetHandler 的 handle()方法作为返回值的。
*/
Object object = queryRunner.query(conn, sql, new ResultSetHandler() {
@Override
public Object handle(ResultSet rs) throws SQLException {
List<Customer> customers = new ArrayList<>(); while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
String email = rs.getString(3);
Date birth = rs.getDate(4); Customer customer = new Customer(id, name, email, birth);
customers.add(customer);
} return customers;
}
}); System.out.println(object);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, null, conn);
} } /**
* 测试 QueryRunner 类的 update 方法
* 该方法可用于 INSERT, UPDATE 和 DELETE
*/
@Test
public void testQueryRunnerUpdate() {
// 1. 创建 QueryRunner 的实现类
QueryRunner queryRunner = new QueryRunner(); String sql = "DELETE FROM customers WHERE id IN (?,?)"; Connection connection = null; try {
connection = JDBCTools.getConnection();
// 2. 使用其 update 方法
queryRunner.update(connection, sql, 12, 13);
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCTools.releaseDB(null, null, connection);
} } }

如果,您对我的这篇博文有什么疑问,欢迎评论区留言,大家互相讨论学习。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。

转载请注明出处和链接地址,欢迎转载,谢谢!

最新文章

  1. charles4抓https请求的注意事项
  2. ReferenceQueue的使用
  3. 关于IOS应用程序视图
  4. 【性能测试】性能测试总结&lt;一&gt;
  5. 轻量级开源内存数据库SQLite性能测试
  6. BC-Clarke and five-pointed star(水)
  7. HDU 5778 abs (枚举)
  8. SQL Server 2012 数据库各个版本功能对比
  9. 批处理(.bat)中使用相对路径
  10. JDBC操作TimesTen
  11. java.util.Map.Entry接口
  12. 优化算法-BFGS
  13. php文件上传提示错误:找不到临时文件夹
  14. .net core 开发短网址平台的思路
  15. eclipse的maven项目中找不到Maven Dependencies
  16. Java中的Throable类是不是受查异常?
  17. linux进程管理之优先级
  18. (转载)通向架构师的道路(第四天)之Tomcat性能调优-让小猫飞奔
  19. gulp 编译es6 探究
  20. HDFS恢复误删操作的方法

热门文章

  1. Java设计模式——工厂设计模式
  2. Java EE.JSP.内置对象
  3. 负载分配—DNS的域名解析
  4. springboot的邮件服务
  5. 在WPF中嵌入WebBrowser可视化页面
  6. 微信小程序中悬浮窗功能的实现(主要探讨和解决在原生组件上的拖动)
  7. 如何选择合适的SSL证书类型
  8. js中数组和对象的合并
  9. Java——擦除
  10. Spring 5 新功能:函数式 Web 框架