一、结构介绍

高层结构图:

wrappers包:

handlers包(部分):

二、功能介绍

commons.dbutils是一个对JDBC操作进行封装的类集,其有如下几个优点:

(1)没有可能的资源泄漏,避免了繁锁的JDBC代码

(2)代码更整洁

(3)从ResultSet自动生成JavaBeans属性

(4)无其他依赖包

三、基本使用

基本用到的类有:QueryRunner、ResultSetHandler及其子类等

QueryRunner -- 执行查询的类,可以执行SELECT、INSERT、UPDATE、DELETE等语句,QueryRunner用ResultSetHandler的子类来处理ResultSet并返回结果;而包提供的ResultSetHandler子类使用RowProcessor的子类来处理ResultSet中的每一行;RowProcessor的默认实现为BasicRowProcessor;BeanProcessor不是RowProcessor,可以看作一个工具类

ResultHandler及其子类 -- 实现了Object handle(ResultSet rs) throws SQLException方法

AbstractListHandler -- 返回多行List的抽象类

ArrayHandler --  返回一行的Object[]

ArrayListHandler -- 返回List,每行是Object[]

BeanHandler -- 返回第一个Bean对象

BeanListHandler -- 返回List,每行是Bean

ColumnListHandler -- 返回一列的List

KeyedHandler -- 返回Map,具体见代码

MapHandler -- 返回单个Map

MapListHandler -- 返回List,每行是Map

ScalarHandler -- 返回列的头一个值

代码:

[java] view
plain
copy

  1. //建表语句
  2. DROP TABLE IF EXISTS `test`.`user`;
  3. CREATE TABLE  `test`.`user` (
  4. `name` varchar(10) DEFAULT NULL,
  5. `password` varchar(10) DEFAULT NULL
  6. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  7. 表中数据
  8. 'user1', 'pwd1'
  9. 'user2', 'pwd2'
  10. //User类
  11. public class User {
  12. private String name;
  13. private String pwd;
  14. public User(){
  15. }
  16. public void setName(String val) {
  17. this.name = val;
  18. }
  19. public void setPassword(String val) {
  20. this.pwd = val;
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public String getPassword() {
  26. return pwd;
  27. }
  28. }
[java] view
plain
copy

  1. package dbutiltest;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.SQLException;
  5. import java.util.List;
  6. import java.util.Map;
  7. import org.apache.commons.dbutils.DbUtils;
  8. import org.apache.commons.dbutils.QueryRunner;
  9. import org.apache.commons.dbutils.ResultSetHandler;
  10. import org.apache.commons.dbutils.handlers.ArrayHandler;
  11. import org.apache.commons.dbutils.handlers.ArrayListHandler;
  12. import org.apache.commons.dbutils.handlers.BeanHandler;
  13. import org.apache.commons.dbutils.handlers.BeanListHandler;
  14. import org.apache.commons.dbutils.handlers.ColumnListHandler;
  15. import org.apache.commons.dbutils.handlers.KeyedHandler;
  16. import org.apache.commons.dbutils.handlers.MapListHandler;
  17. public class TestDbUtils {
  18. static {
  19. try {
  20. Class.forName("org.gjt.mm.mysql.Driver");
  21. } catch (ClassNotFoundException e) {
  22. e.printStackTrace();
  23. System.exit(1);
  24. }
  25. }
  26. public Connection getConnection() {
  27. Connection conn = null;
  28. try {
  29. conn = DriverManager.getConnection(
  30. "jdbc:mysql://localhost:3306/test", "root", "pwd");
  31. } catch (SQLException e) {
  32. e.printStackTrace();
  33. }
  34. return conn;
  35. }
  36. public static void main(String[] args) {
  37. TestDbUtils u = new TestDbUtils();
  38. u.testArrayHandler();
  39. u.testArrayListHandler();
  40. u.testBeanListHandler();
  41. u.testMapListHandler();
  42. u.testColumnListHandler();
  43. u.testNonQuery();
  44. }
  45. public void testArrayHandler() {
  46. System.out.println("----testArrayHandler----");
  47. String sql = "select * from user";
  48. ResultSetHandler handler = new ArrayHandler();
  49. QueryRunner query = new QueryRunner();
  50. Connection conn = null;
  51. try {
  52. conn = getConnection();
  53. Object[] arr = (Object[])query.query(conn, sql, handler);
  54. for (int i = 0; i < arr.length; i++) {
  55. System.out.println(arr[i].toString());
  56. }
  57. } catch (SQLException e) {
  58. e.printStackTrace();
  59. } finally {
  60. try {
  61. DbUtils.close(conn);
  62. } catch (SQLException e) {
  63. // ignore
  64. }
  65. }
  66. }
  67. public void testArrayListHandler() {
  68. System.out.println("----testArrayListHandler----");
  69. String sql = "select * from user";
  70. ResultSetHandler handler = new ArrayListHandler();
  71. QueryRunner query = new QueryRunner();
  72. Connection conn = null;
  73. try {
  74. conn = getConnection();
  75. List list = (List)query.query(conn, sql, handler);
  76. for (int i = 0; i < list.size(); i++) {
  77. Object[] arr = (Object[])list.get(i);
  78. for (int j = 0; j < arr.length; j++) {
  79. System.out.print(arr[j] + "  ");
  80. }
  81. System.out.println();
  82. }
  83. } catch (SQLException e) {
  84. e.printStackTrace();
  85. } finally {
  86. try {
  87. DbUtils.close(conn);
  88. } catch (SQLException e) {
  89. // ignore
  90. }
  91. }
  92. }
  93. public void testBeanListHandler() {
  94. System.out.println("----testBeanListHandler----");
  95. String sql = "select * from user where name=?";
  96. Object[] params = new Object[]{"user1"};
  97. ResultSetHandler handler = new BeanListHandler(User.class);
  98. QueryRunner query = new QueryRunner();
  99. Connection conn = null;
  100. try {
  101. conn = getConnection();
  102. List list = (List)query.query(conn, sql, params, handler);
  103. for (int i = 0; i < list.size(); i++) {
  104. User user = (User)list.get(i);
  105. System.out.println(user.getName() + "  " + user.getPassword());
  106. }
  107. } catch (SQLException e) {
  108. e.printStackTrace();
  109. } finally {
  110. try {
  111. DbUtils.close(conn);
  112. } catch (SQLException e) {
  113. // ignore
  114. }
  115. }
  116. }
  117. public void testMapListHandler() {
  118. System.out.println("----testMapListHandler----");
  119. String sql = "select * from user where name=?";
  120. Object[] params = new Object[]{"user1"};
  121. ResultSetHandler handler = new MapListHandler();
  122. QueryRunner query = new QueryRunner();
  123. Connection conn = null;
  124. try {
  125. conn = getConnection();
  126. List list = (List)query.query(conn, sql, params, handler);
  127. for (int i = 0; i < list.size(); i++) {
  128. Map user = (Map)list.get(i);
  129. System.out.println(user.get("name") + "  " + user.get("password"));
  130. }
  131. } catch (SQLException e) {
  132. e.printStackTrace();
  133. } finally {
  134. try {
  135. DbUtils.close(conn);
  136. } catch (SQLException e) {
  137. // ignore
  138. }
  139. }
  140. }
  141. public void testColumnListHandler() {
  142. System.out.println("----testColumnListHandler----");
  143. String sql = "select * from user";
  144. ResultSetHandler handler = new ColumnListHandler("name");
  145. QueryRunner query = new QueryRunner();
  146. Connection conn = null;
  147. try {
  148. conn = getConnection();
  149. List list = (List)query.query(conn, sql, handler);
  150. for (int i = 0; i < list.size(); i++) {
  151. System.out.println(list.get(i));
  152. }
  153. } catch (SQLException e) {
  154. e.printStackTrace();
  155. } finally {
  156. try {
  157. DbUtils.close(conn);
  158. } catch (SQLException e) {
  159. // ignore
  160. }
  161. }
  162. }
  163. public void testKeyedHandler() {
  164. System.out.println("----testKeyedHandler----");
  165. String sql = "select * from user";
  166. ResultSetHandler handler = new KeyedHandler("name");
  167. QueryRunner query = new QueryRunner();
  168. Connection conn = null;
  169. try {
  170. conn = getConnection();
  171. Map map = (Map)query.query(conn, sql, handler);
  172. Map user = (Map)map.get("user2");
  173. System.out.println(user.get("password"));
  174. } catch (SQLException e) {
  175. e.printStackTrace();
  176. } finally {
  177. try {
  178. DbUtils.close(conn);
  179. } catch (SQLException e) {
  180. // ignore
  181. }
  182. }
  183. }
  184. public void testNonQuery() {
  185. System.out.println("----testNonQuery----");
  186. String sql = "insert into `user` values('user_test','pwd_test')";
  187. QueryRunner query = new QueryRunner();
  188. Connection conn = null;
  189. try {
  190. conn = getConnection();
  191. query.update(conn, sql);
  192. } catch (SQLException e) {
  193. e.printStackTrace();
  194. } finally {
  195. try {
  196. DbUtils.close(conn);
  197. } catch (SQLException e) {
  198. // ignore
  199. }
  200. }
  201. }
  202. }

关于wrappers包:

在新建 QueryRunner时,覆盖父类的方法wrap

[java] view
plain
copy

  1. QueryRunner query = new QueryRunner() {
  2. protected ResultSet wrap(ResultSet rs) {
  3. return StringTrimmedResultSet.wrap(rs);
  4. }
  5. };

四、扩展

1.RowProcessor接口

2.ResultSetHandler接口

commons.dbutils1.2介绍及使用的更多相关文章

  1. Apache Commons 工具类介绍及简单使用

    转自:http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下 ...

  2. Apache Commons 工具集介绍

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...

  3. Apache Commons 工具类介绍及简单使用(转载)

    原文链接 http://www.cnblogs.com/younggun/p/3247261.html Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动 ...

  4. Java:Apache Commons 工具类介绍及简单使用

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. Commons简介 组件 功能介绍 commo ...

  5. apache commons lang架包介绍

    commons lang组件介绍和学习 介绍 Java语言开发时有一个隐患,那就是java支持null值,这就导致很多时候操作可能会出异常. 因此很多第三方组件都会提供安全null safe 操作(即 ...

  6. java中常用的工具类(三)

    继续分享java中常用的一些工具类.前两篇的文章中有人评论使用Apache 的lang包和IO包,或者Google的Guava库.后续的我会加上的!谢谢支持IT江湖 一.连接数据库的综合类       ...

  7. java:工具类

    Google guava工具类的介绍和使用:https://blog.csdn.net/wwwdc1012/article/details/82228458 Apache Commons 工具类介绍及 ...

  8. java常用工具类(三)

    一.连接数据库的综合类 package com.itjh.javaUtil; import java.sql.Connection; import java.sql.DriverManager; im ...

  9. Java常用开源库

    Java的经久不衰,很大程度上得益于Java的生态好.在日常开发中,我们也会经常使用到各种开源库和工具类,为了避免重复造轮子,本文将贴出工作及学习中会用到的部分开源库和工具类.Java的生态实在太大, ...

  10. Apache Commons介绍(转载)

    一.Commons BeanUtils说明:针对Bean的一个工具集.由于Bean往往是有一堆get和set组成,所以BeanUtils也是在此基础上进行一些包装. 二.Commons CLI说明:这 ...

随机推荐

  1. 工程化Vue使用

    目录 环境准备 Vue项目-创建 Vue项目开发流程 API风格 案例 推荐阅读: VUE-局部使用 环境准备 介绍:create-vue是Vue官方提供的最新的脚手架工具,用于快速生成一个工程化的V ...

  2. 公有云-实验一 实践腾讯云部署Web应用

    实验一 实践腾讯云部署Web应用 概述 企业A需要搭建一套在互联网上发布的论坛平台,但是企业内部并没有完善的基础架构设施,难以保证论坛平台的高可用性和高安全性.经过IT部门相关专家分析讨论,决定在腾讯 ...

  3. SPIE独立出版。遥感征稿中--2024年遥感与数字地球国际学术会议(RSDE 2024)

    ​ [成都,遥感主题,稳定EI检索]2024年遥感与数字地球国际学术会议(RSDE 2024) 2024 International Conference on Remote Sensing and ...

  4. Hash表实践 —— 两数之和

    目录 题目背景 解题思路 题目背景 这个题目用常规的双循环就可以完成. 但不是最优解.为什么? 看看他的步骤数: N =[3,2,4] 求结果为6的两个元素坐标如下, 1). 3+2 = 5 不等于 ...

  5. Azure 学习笔记

    选择 VM 配套 https://docs.azure.cn/zh-cn/virtual-machines/sizes  https://docs.azure.cn/zh-cn/virtual-mac ...

  6. redisson内存泄漏问题排查

    问题描述 最近生产有个服务突然出现频繁告警,接口P99响应时间变长,运维同学观察到相应的pod cpu飙升,内存占用很高. cpu升高问题排查是老生常谈的话题了,一般可以使用top -p pid -H ...

  7. Linux内核虚拟内存管理之匿名映射缺页异常分析

    今天我们就来讨论下这种缺页异常,让大家彻底理解它.注:本文使用linux-5.0内核源代码.文章分为以下几节内容: 匿名映射缺页异常的触发情况 0页是什么?为什么使用0页? 源代码分析 3.1 触发条 ...

  8. js中判断数据类型的方法有哪些

    判断数据类型可以使用 typeof 但是typeof 判断数组和函数时返回的都是Object 不能具体判断,这时使用 instanceof 可以判断对象是否是另一个函数创造的 : 用法: typeof ...

  9. 58. vue常用的api

    1. nextTick  使用场景:通过异步渲染的页面解构不能直接dom操作,要使用 nextTick (延迟回调)等待一下 :nextTick 的作用:感知dom的更新完成,类似于 updated ...

  10. Android复习(三)清单文件中的元素——>uses-sdk

    <uses-sdk> Google Play 会利用在应用清单中声明的 <uses-sdk> 属性,从不符合其平台版本要求的设备上滤除您的应用.在设置这些属性前,请确保您了解  ...