一、结构介绍

高层结构图:

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. docker with GPU support

    自己总结的: nvidia-docker, 不支持windows,2019.10, nvidia-docker过时了,从docker 1903开始,安装一个nvidia-container-runti ...

  2. 爬虫案例1-爬取图片的三种方式之一:DrissionPage篇(3)

    @ 目录 前言 DrissionPage介绍 实战 共勉 博客 前言 继requests篇和selenium篇,本文是爬取图片的最后一个案例,利用了python第三方库DrissionPage来自动化 ...

  3. 合合信息推出国央企智能文档处理解决方案,AI赋能信创国产化

    信息时代,数字化转型已成为推动经济高质量发展的关键力量.国央企是国民经济的重要支柱,其数字化转型进程关乎着自身与产业链上下游企业的共同发展.文档的智能化处理可有效提升信息流转的效率.促进知识的沉淀与传 ...

  4. JAVAEE——navicat安装

    Navicat Premium 15激活步骤 准备 Navicat Premium 15.Navicat Premium 15注册机 用到的都放在这里了: 链接:https://pan.baidu.c ...

  5. Linux板子与ubuntu交互,NFS配置

    第0步:保证你的ubuntu能上网,可以选择NAT方式让ubuntu上网. 第一步:安装NFS服务 sudo apt-get install nfs-kernel-server portmap 第二步 ...

  6. 【赵渝强老师】MongoDB管理用户的认证机制

    一.MongoDB用户认证机制简介 为了认证客户端,你必须要添加一个对应的用户到MongoDB.基本的步骤分为以下几步: 用户管理接口:db.createUser()方法可以创建一个用户,添加完成后可 ...

  7. CSP 联训 3

    好吧,又倒数了,就签了个 T2,100 pts. T1 我把相同颜色的存起来,每种颜色找出枚举选哪两个座位不合法的矩阵的左上和右下,如果找到的矩阵左下和右上也相同,则这个矩阵确实不合法,减去,但判断左 ...

  8. Linux:/proc/meminfo参数详细解释

    Linux:/proc/meminfo参数详细解释 一.Linux内存总览图 二.meminfo参数的详细介绍 /proc/meminfo是了解Linux系统内存使用状况的主要接口,我们最常用的&qu ...

  9. Java日期时间API系列22-----Jdk8中java.time包中的新的日期时间API类,Month月份和DayOfWeek星期的计算。

    Java8中为月份和星期新增的了,Month和DayOfWeek,来处理月份和星期的特殊问题,这2个类都是枚举类,对Month.DayOfWeek源码说明和简单应用,月份英文,月份英文简称,月份中文, ...

  10. iOS多态使用小结

    多态是面试程序设计(OOP)一个重要特征,但在iOS中,可能比较少的人会留意这个特征,实际上在开发中我们可能已经不经意的使用了多态.比如说: 有一个tableView,它有多种cell,cell的UI ...