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】。

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

Apache—dbutils开源JDBC工具类库简介的更多相关文章

  1. Apache:dbutils 开源JDBC工具类库

    commons-dbutils jar:下载 package com.jdbc.tools; import org.apache.commons.dbutils.QueryRunner; import ...

  2. 开源JDBC工具类DbUtils

    本篇将会详细地介绍Apache公司的JDBC帮助工具类DbUtils以及如何使用.在上一篇中我们已经通过将以前对dao层使用JDBC操作数据库的冗余代码进行了简易封装形成自己的简单工具类JdbcUti ...

  3. DBUtils开源JDBC类库,对JDBC简单封装(作用是:简化编码工作量,同时不会影响程序的性能)

    DBUtils:提高了程序的性能,编程更加简便 架包 mysql-connector-java-jar commons-dbcp-1.4jar commons-pool-1.5.5jar common ...

  4. Apache—DBUtils框架简介

    转载自:http://blog.csdn.net/fengdongkun/article/details/8236216 Apache—DBUtils框架简介.DbUtils类.QueryRunner ...

  5. JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表

    本文目录:       1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData        2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData       ...

  6. 编写更少量的代码:使用apache commons工具类库

    Commons-configuration   Commons-FileUpload   Commons DbUtils   Commons BeanUtils  Commons CLI  Commo ...

  7. Apache—DBUtils

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

  8. Apache——DBUtils框架ResultSetHandler接口使用

    参考链接:http://i.cnblogs.com/EditPosts.aspx?opt=1 简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDB ...

  9. Apache—DBUtils框架

    1.所需要jar包 commons-collections-2.1.1.jarmchange-commons-java-0.2.11.jarmysql-connector-java-5.1.18-bi ...

随机推荐

  1. 【MySQL】(一)MySQL 体系结构和存储引擎

    1.1.定义数据库和实例 数据库:物理操作系统文件或其他形式文件类型的集合.在MySQL数据库中,数据库文件可以是frm.MYD.MYI.ibd结尾的文件. 实例:MySQL数据库由后台线程以及一个共 ...

  2. iView学习笔记(一):Table基本操作(包含前后端示例代码)

    iView表格操作 1.前端准备工作 首先新建一个项目,然后引入iView插件,配置好router npm安装iView npm install iview --save cnpm install i ...

  3. 微信小程序设计总结

    微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 小程序提供了一个简单.高效的应用开发框架和丰富的组件及API,帮助开发者在微信中开发具有原生 A ...

  4. Struts2 中Struts.xml结果页面配置

    结果页面的配置: 红色的比较常用 

  5. main方法中注入Spring bean

    在有些情况下需要使用main使用Spring bean,但是main方法启动并没有托管给Spring管理,会导致bean失败,报空指针异常. 可以使用 ClassPathXmlApplicationC ...

  6. [Short-Circuit Constraint Violation]警告解决办法

    今天用Altium Designer16画PCB时候遇到一个问题,进行DRC检测,警告如下: [Short-Circuit Constraint Violation] GrayscaleSensor1 ...

  7. .net core web api部署到docker

    一.创建.net core web api 的Demo 修改部分代码 端口随意指定,ip用星号“*”,方便接下来docker虚拟网络自动分配ip 下一步是Dockerfile文件,如果发现你的项目中没 ...

  8. JVM系列(1)- JVM常见参数及堆内存分配

    常见参数配置 基于JDK1.6 -XX:+PrintGC 每次触发GC的时候打印相关日志 -XX:+UseSerialGC 串行回收模式 -XX:+PrintGCDetails 打印更详细的GC日志 ...

  9. AWS Aurora数据库 Multi-Master 小测

    AWS Aurora Mysql终于推出了Multi-Master,直面硬刚Oracle RAC.在多一份数据库产品选择的小兴奋之余,我们也看看新推出的Multi-Master的特点(包括优缺点). ...

  10. spark学习(10)-RDD的介绍和常用算子

    RDD(弹性分布式数据集,里面并不存储真正要计算的数据,你对RDD的操作,他会在Driver端转换成Task,下发到Executor计算分散在多台集群上的数据) RDD是一个代理,你对代理进行操作,他 ...