前段时间使用了Apache Common DbUtils这个工具,在此留个印,以备不时查看。大家都知道现在市面上的数据库访问层的框架很多,当然很多都是包含了OR-Mapping工作步骤的 例如大家常用的Hibernate与Mybatis。当然如果人们要一个纯粹的封装了JDBC的工具类,使用Apache Common DbUtils(下面简称ACD)是个不错的选择,这个工具在JDBC的基础上稍加封装是JDBC的操作更加便捷,在学习使用这个框架的途中你也不需要学 习太多的API类,因为一共也才3个部分(3个包)。
  1. org.apache.commons.dbutils (该包中的类主要帮助我们更便捷的操作JDBC)

  2. org.apache.commons.dbutils.handlers(该包中的类都是实现org.apache.commons.dbutils.ResultSetHandler接口的实现类)

  3. org.apache.commons.dbutils.wrappers(该包中的类主要是封装了对Sql结果集的操作)

使用这个DbUtils的一些优势:

  1. 防止了资源的泄露,写一段JDBC的准备代码其实并不麻烦,但是那些操作确实是十分耗时和繁琐的,也会导致有时候数据库连接忘记关闭了导致异常难以追踪。

  2. 干净整洁的持久化代码,把数据持久化到数据库的代码被打打削减,剩下的代码能够清晰简洁的表达你的操作目的。

  3. 自动把ResultSets中的工具映射到JavaBean中,你不需要手动的使用Setter方法将列值一个个赋予相应的时日,Resultset中的每一个行都大表一个完成的Bean实体。    

要学习如何使用这个框架,最简单的方式就是用它写个Demo-CRUD操作,让我们先做个准备动作在Mysql中建立一个测试专用表Visitor。

[sql] view plaincopy在CODE上查看代码片派生到我的代码片
01./*创建Visitor*/
02.CREATE TABLE Visitor
03.(
04. Id INT(11) NOT NULL AUTO_INCREMENT,
05. Name VARCHAR(1000) NOT NULL,
06. Email VARCHAR(1000) NOT NULL,
07. Status INT NOT NULL DEFAULT 1,
08. CreateTime DateTime,
09. PRIMARY KEY(Id)
10.)

建完表结构,我们就可以学习怎么利用框架中的Utils类帮助我们完成CRUD-DEMO,其实对于这个框架主要操作的是ResultSetHandler接口的实现类与QueryRunner类

创建对应的JavaBean实体类如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
01.package david.apache.model;
02.
03.import java.text.SimpleDateFormat;
04.import java.util.Date;
05.
06.public class Visitor {
07.
08. private int id;
09. private String name;
10. private String email;
11. private int status;
12. private Date createTime;
13.
14. public Visitor() {
15. // TODO Auto-generated constructor stub
16. setCreateTime(new Date());
17. }
18.
19. public Visitor(String name, String email) {
20. this.setName(name);
21. this.setEmail(email);
22. this.setStatus(1);
23. this.setCreateTime(new Date());
24. }
25.
26. public int getId() {
27. return id;
28. }
29.
30. public void setId(int id) {
31. this.id = id;
32. }
33.
34. public String getName() {
35. return name;
36. }
37.
38. public void setName(String name) {
39. this.name = name;
40. }
41.
42. public String getEmail() {
43. return email;
44. }
45.
46. public void setEmail(String email) {
47. this.email = email;
48. }
49.
50. public int getStatus() {
51. return status;
52. }
53.
54. public void setStatus(int status) {
55. this.status = status;
56. }
57.
58. public Date getCreateTime() {
59. return createTime;
60. }
61.
62. public void setCreateTime(Date createTime) {
63. this.createTime = createTime;
64. }
65.
66. @Override
67. public String toString() {
68. // TODO Auto-generated method stub
69. return String.format("{Id: %d, Name: %s, Email: %s, CreateTime: %s}", getId(), getName(), getEmail(),
70. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(getCreateTime()));
71. }
72.}

首先我们先新建一个获取Connection的方法:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
01.private static Connection getConnection() {
02. Connection conn = null;
03. try {
04. Class.forName(CONNECTION_DRIVER_STR);
05. conn = DriverManager.getConnection(CONNECTION_STR, "root", "123456");
06. } catch (Exception e) {
07. e.printStackTrace();
08. }
09. return conn;
10.}

新建方法(对于里面的自增字段,我们可以采用变通的方法来插入,使用select last_insert_id()方法)

[java] view plaincopy在CODE上查看代码片派生到我的代码片
01./*
02. * 新增Visitor, ScalarHandler的demo
03. */
04.public static void insertVisitor(Visitor visitor) {
05. Connection conn = getConnection();
06. QueryRunner qr = new QueryRunner();
07. String sql = "insert into visitor (Name, Email, Status, CreateTime) values (?, ?, ?, ?)";
08. try {
09. int count = qr.update(conn, sql, visitor.getName(), visitor.getEmail(), 1, new Date());
10. BigInteger newId = (BigInteger) qr.query(conn, "select last_insert_id()", new ScalarHandler(1));
11. visitor.setId(Integer.valueOf(String.valueOf(newId)));
12. System.out.println("新增" + count + "条数据=>Id:" + newId);
13. } catch (SQLException e) {
14. e.printStackTrace();
15. }
16.}

大家可以看到操作的步骤其实很简单,也是写SQL可以了,对于自增字段我们通过select last_insert_id()的方法利用ScalarHandler实体类来返回达到变通效果。

删除方法

[java] view plaincopy在CODE上查看代码片派生到我的代码片
01.public static void deleteVisitor(int id) {
02. Connection conn = getConnection();
03. QueryRunner qr = new QueryRunner();
04. String sql = "delete from visitor where status>0 and id=?";
05. try {
06. int count = qr.update(conn, sql, id);
07. System.out.println("删除" + count + "条数据。");
08. } catch (SQLException e) {
09. // TODO: handle exception
10. e.printStackTrace();
11. }
12.}

查询方法

[java] view plaincopy在CODE上查看代码片派生到我的代码片
01.public static Visitor retrieveVisitor(int id) {
02. Connection conn = getConnection();
03. Visitor visitor = null;
04. QueryRunner qr = new QueryRunner();
05. String sql = "select * from visitor where status>0 and id=?";
06. try {
07. visitor = (Visitor) qr.query(conn, sql, new BeanHandler(Visitor.class), id);
08. System.out.println(visitor);
09. return visitor;
10. } catch (Exception e) {
11. e.printStackTrace();
12. }
13. return visitor;
14.}

更新操作

[java] view plaincopy在CODE上查看代码片派生到我的代码片
01.public static void updateVisitor(int id) {
02. Visitor visitor = retrieveVisitor(id);
03. System.out.println("更新前:" + visitor);
04. Connection conn = getConnection();
05. String updateFieldStr = visitor.getName();
06. QueryRunner qr = new QueryRunner();
07. String sql = "update visitor set Name = ?, Email = ?, Status = ?, CreateTime = ? where status>0 and Id = ?";
08. if (updateFieldStr.contains("updated")) {
09. updateFieldStr = updateFieldStr.substring(0, updateFieldStr.indexOf("updated"));
10. } else {
11. updateFieldStr = updateFieldStr + "updated";
12. }
13. visitor.setName(updateFieldStr);
14. try {
15. int count = qr.update(conn, sql, new Object[] { visitor.getName(), visitor.getName(), visitor.getStatus(),
16. visitor.getCreateTime(), visitor.getId() });
17. System.out.println("更新了" + count + "条数据");
18. System.out.println("更新后:" + visitor);
19. } catch (SQLException e) {
20. // TODO: handle exception
21. e.printStackTrace();
22. }
23.}

BeanListHandler方法

[java] view plaincopy在CODE上查看代码片派生到我的代码片
01.public static void getVisitorList() {
02. Connection conn = getConnection();
03. QueryRunner qr = new QueryRunner();
04. String sql = "select * from visitor where status>0";
05. try {
06. List ls = qr.query(conn, sql, new BeanListHandler(Visitor.class));
07. for (Visitor visitor : ls) {
08. System.out.println(visitor);
09. }
10. } catch (SQLException e) {
11. // TODO Auto-generated catch block
12. e.printStackTrace();
13. }
14.}

MapHandler操作

[java] view plaincopy在CODE上查看代码片派生到我的代码片
01.public static void getVisitWithMap(int id) {
02. Connection conn = getConnection();
03. QueryRunner qr = new QueryRunner();
04. String sql = "select * from visitor where status>0 and id=?";
05. try {
06. Map map = qr.query(conn, sql, new MapHandler(), id);
07. Integer visitorId = Integer.valueOf(map.get("Id").toString());
08. String visitorName = map.get("Name").toString();
09. String visitorEmail = map.get("Email").toString();
10. Integer visitorStatus = Integer.valueOf(map.get("Status").toString());
11. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
12. Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString());
13. Visitor visitor = new Visitor(visitorName, visitorEmail);
14. visitor.setId(visitorId);
15. visitor.setStatus(visitorStatus);
16. visitor.setCreateTime(visitorCreateTime);
17. System.out.println(visitor);
18. } catch (Exception e) {
19. // TODO: handle exception
20. e.printStackTrace();
21. }
22.}

MapListHandler方法

[java] view plaincopy在CODE上查看代码片派生到我的代码片
01.public static void getVisitWithMapLs() {
02. Connection conn = getConnection();
03. QueryRunner qr = new QueryRunner();
04. String sql = "select * from visitor where status>0";
05. try {
06. List> mapLs = qr.query(conn, sql, new MapListHandler());
07. for (Map map : mapLs) {
08. Integer visitorId = Integer.valueOf(map.get("Id").toString());
09. String visitorName = map.get("Name").toString();
10. String visitorEmail = map.get("Email").toString();
11. Integer visitorStatus = Integer.valueOf(map.get("Status").toString());
12. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
13. Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString());
14. Visitor visitor = new Visitor(visitorName, visitorEmail);
15. visitor.setId(visitorId);
16. visitor.setStatus(visitorStatus);
17. visitor.setCreateTime(visitorCreateTime);
18. System.out.println(visitor);
19. }
20. } catch (Exception e) {
21. // TODO: handle exception
22. e.printStackTrace();
23. }
24. }

经过上面的几个示例,相信大家应该知道怎么用这个框架了吧~ 框架的官网地址

Apache Common DbUtils的更多相关文章

  1. javaweb学习总结—Apache的DBUtils框架学习

    注明: 本文转载自http://www.cnblogs.com/xdp-gacl/p/4007225.html 一.commons-dbutils简介 commons-dbutils 是 Apache ...

  2. 使用ThreadLocal、Apache的dbutils的QueryRunner和dbcp2数据库连接池的BasicDataSource封装操作数据库工具

    package hjp.smart4j.framework.helper; import hjp.smart4j.framework.util.CollectionUtil; import hjp.s ...

  3. JavaWeb学习总结(十四)--Apache的DBUtils

    一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

  4. 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)

    转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...

  5. apache common包下的StringUtils的join方法

    apache common包下的StringUtils的join方法: 关键字:java string array join public static String join(Iterator it ...

  6. org.apache.common.io-FileUtils详解

    org.apache.common.io---FileUtils详解 getTempDirectoryPath():返回临时目录路径; public static String getTempDire ...

  7. javaweb学习总结(四十一)——Apache的DBUtils框架学习

    一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...

  8. Apache Commons DbUtils 快速上手

    原文出处:http://lavasoft.blog.51cto.com/62575/222771 Hibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了 ...

  9. 写一个ORM框架的第一步(Apache Commons DbUtils)

    新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...

随机推荐

  1. 项目笔记---Socket Error Code翻译

    前言 在项目中为了方便调试及客户反馈,需要Socket错误数字的中文解释,MSDN上只有英文版,同时也想自己学习而且方便将来更新ErrorCode的实际发生的情景,顾有此博文. MSDN:https: ...

  2. 第五章:javascript:队列

    队列是一种列表,不同的是队列只能在末尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据.先进先出.这点和栈不一样,在栈中,最后入栈的元素反被优先处理.可以将队列想象成银行排队办理业务的人,排队在 ...

  3. 【团队项目演示】FZU5BOYS之团队项目链接汇总

    FZU5BOYS      项目冲刺之博客汇总 Alpha版本 Day One Day Two Day Three Day Four Day Five Day Six Day Seven Day Ei ...

  4. Qt webkit插件相关知识

    1.在Qt中使用 WebKit 浏览器核心 使用 QtWebKit 需要在工程文件(*.pro)中加入: 1.           QT +=webkit   2.           QT += n ...

  5. ADHelper C#域用户操作(转)

    using System; using System.Collections.Generic; using System.DirectoryServices; using System.Linq; u ...

  6. hdu1542矩阵的并 线段树+扫描线

    求矩阵的并,也就是要求所有的面积.那可以吧总的图形按照矩阵来切割.使其为一块一块. 输入的时候用坐标表示,这里扫描线从下到上扫描.初始时让下面的边为1,上面的为-1: 用一条先从下面开始想上扫描.遇到 ...

  7. 【CodeForces 602B】G - 一般水的题2-Approximating a Constant Range

    Description When Xellos was doing a practice course in university, he once had to measure the intens ...

  8. jeecms内容显示条数

    1.按照1.2.3.4.5顺序显示 <div class="index-news"> [@cms_channel id='1'] <h2><span& ...

  9. Java编程思想学习(十) 正则表达式

    正则表达式是一种强大的文本处理工具,使用正则表达式我们可以以编程的方法,构造复杂的文本模式,并且对输入的字符串进行搜索.在我看来,所谓正则表达式就是我们自己定义一些规则,然后就可以验证输入的字符串是不 ...

  10. PHP邮件注入攻击技术

    1. 简介 如 今,互联网的使用急剧上升,但绝大多数互联网用户没有安全知识背景.大多数的人都会使用互联网通过邮件Email的方式和他人进行通信.出于这个原因,大 多数网站允许他们的用户联系他们,向网站 ...