Apache Common DbUtils

时间:2022-12-05 14:55:25

前段时间使用了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. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  2. 腾讯QQ你的缓存策略应该改下了

    缓存策略基本原则大家都怎么考虑的? 缓存好友数量这个也是醉了,这个数字好像变化频率有点低吧,ok,就算你企鹅用户量大,需要缓存,那肉肉的问一句你这更新策略也不能只管网上涨的,不管往下降的吧?难不成你是 ...

  3. UITableViewCell的separator分隔线设置失效

    // 处理separator -(void)viewDidLayoutSubviews { if ([self.tableView respondsToSelector:@selector(setSe ...

  4. 在WebView中如何让JS与Java安全地互相调用

    在现在安卓应用原生开发中,为了追求开发的效率以及移植的便利性,使用WebView作为业务内容展示与交互的主要载体是个不错的折中方案.那么在这种Hybrid(混合式) App中,难免就会遇到页面JS需要 ...

  5. Oracle 重建控制文件一例

    环境:OEL 5.7 + Oracle 10.2.0.5 背景:在Oracle的运维过程中,时常会遇到一些场景是需要重建控制文件才可以解决的.本文的场景可以通过复制控制文件到新路径,运行一段时间后,再 ...

  6. 水壶-[Kruskal重构树] [解题报告]

    水壶 本来从不写针对某题的题解,但因为自己实在是太蠢了,这道题也神TM的恶心,于是就写篇博客纪念一下 H水壶 时间限制 : 50000 MS 空间限制 : 565536 KB 评测说明 : 2s,51 ...

  7. python3 os.walk()使用

    os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. 在Unix,Windows中有效. os.walk(top[, topdown=True[, onerror=Non ...

  8. FreeMarker 的使用方法

    1.FreeMarker 概述 FreeMarker 是一个用Java语言编写的模板引擎,使用模板来生成文本输出;主要用于做静态页面或页面展示; 2.FreeMarker 使用 // 导入jar包: ...

  9. POJ3045 Cow Acrobats

    题意 Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away and join t ...

  10. Excel 출력

    NativeExcel 참조 사이트 http://www.nika-soft.com/dwnld.htm IWorkbook book = Factory.CreateWorkbook(); lWo ...