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. stack函数怎么用嘞?↓↓↓

    c++ stl栈stack的头文件书写格式为: #include 实例化形式如下: stack StackName; 其中成员函数如下: 1.检验堆栈是否为空 empty() 堆栈为空则返回真 形式如 ...

  2. Number() 与 parseInt()解析

    在 Python 中,将字符串转为整型变量的函数是 int() ,直接使用 int("123")就可以得到 123的输出结果,这样可以比较快速的得到我们想要的结果,在 js 中将 ...

  3. JQuery第一章js 上机+课后

    =============上机1 包含字母   <!DOCTYPE html>   <html>   <head>   <title>sj1.html& ...

  4. D3学习之画布制作

    最近大半个月都和d3斗争,学习艰辛(呜呜……)如果觉得作者写的对你有用,可以打赏作者哦!owo 起言:结合自己的学习之路,我认为要想使用d3画图搞清楚布局很重要,层次分明,就给了你很大的灵活性,写起代 ...

  5. 【Python3爬虫】当爬虫碰到表单提交,有点意思

    一.写在前面 我写爬虫已经写了一段时间了,对于那些使用GET请求或者POST请求的网页,爬取的时候都还算得心应手.不过最近遇到了一个有趣的网站,虽然爬取的难度不大,不过因为表单提交的存在,所以一开始还 ...

  6. UIRefreshControl 问题

    这两天在学UIRefreshControl,主要参照的是github上的一个Demo(网址 https://github.com/evgeniymikholap/UIRefreshControlExa ...

  7. codeforces 576 div2 A-D题解

    A题 Description 题目链接: https://codeforces.com/contest/1199/problem/A 题意: 给定长度为n(1≤n≤100000)的一个序列a,以及两个 ...

  8. JavaScript数据结构——字典和散列表的实现

    在前一篇文章中,我们介绍了如何在JavaScript中实现集合.字典和集合的主要区别就在于,集合中数据是以[值,值]的形式保存的,我们只关心值本身:而在字典和散列表中数据是以[键,值]的形式保存的,键 ...

  9. 利用MAVEN打包可运行jar包,包括依赖的第三方包

    转载自:http://bglmmz.iteye.com/blog/2058914 背景: 另一篇文章说了如何利用IDEA来打包,现在来说说如何利用MAVEN打包 目标:应用本身打成一个jar包,依赖的 ...

  10. mysql docker 主从配置

    主从复制相关 前置条件: docker安装的mysql是5.7.26版本 1. 编排docker-compose文件如下: version: '3' services: mysql-master: v ...