一、结构介绍

高层结构图:

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. 游戏AI行为决策——GOAP(目标导向型行动规划)

    游戏AI行为决策--GOAP(附代码与项目) 新的一年即将到来,感觉还剩一种常见的游戏AI决策方法不讲的话,有些过意不去.就在这年的尾巴与大家一起交流下「目标导向型行为规划(GOAP)」吧! 另外,我 ...

  2. grid网格布局

    https://ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html Grid 布局只对项目生效 划分网格的线,称为"网格线" ...

  3. @vue/cli eslint插件使用指南

    使用步骤 使用 npm 安装 @vue/cli-service 版本对应的 @vue/cli-plugin-eslint 例如:"@vue/cli-service": " ...

  4. linux操作系统和文件系统,命令(上)

    Linux是一个类似于windows的操作系统 Linux操作系统的一种主要使用方式是通过终端软件:终端软件里只能使用键盘不能使用鼠标,在终端软件里通过输入命令完成各种任务 clear命令可以删除终端 ...

  5. Haproxy详解以及基于Haproxy的高可用实战

    1.Haproxy与Keepalived VRRP 介绍 软件:haproxy 主要是做负载均衡的7层,也可以做4层负载均衡 apache也可以做7层负载均衡,但是很麻烦.实际工作中没有人用. ngi ...

  6. 使用 Docker 部署 MySql

    前言 虽然不建议将需要持久化的数据保存在容器中,但是自己平时做个小项目玩玩还是没什么问题的. 拉取镜像 docker pull mysql 不加 tag 的话默认从 DockerHub 拉取最新版本的 ...

  7. Codeforces Round 977 (Div. 2)

    手速局,因为水平不够三题遗憾离场. A. Meaning Mean 题意 你一个序列,你每次可以选择两个数删掉,并把他们的平均数加入到序列的末尾.当序列长度为 \(1\) 的时候,剩下的数最大值是多少 ...

  8. Redis数据库常见命令

    Redis数据库常见命令 Linux启动Redis # 启动服务 redis-server # 开启客户端 redis-cli # 关闭redis服务 shutdown #查看服务是否运行 ping ...

  9. 2022年6月中国数据库排行榜:TiDB卷土重来摘桂冠,达梦蛰伏五月夺探花

    排行榜风云又起,各产品墨坛论剑.2022年6月的 中国数据库流行度排行榜 再掀风云,6月排行榜共有231个数据库参与排名,两名新成员的加入,注入了新活力.本月排行榜用一句话可以概括为:TiDB卷土重来 ...

  10. url 统一资源定位符的组成

    协议 protocol :http 或者 https = http + ssl  或者 file 文件(本地): 域名 host 或 ip 地址: 端口 port 省略默认 80  : 路径 path ...