Apache DbUtils应用实例

来源:互联网 发布:python 异步网络框架 编辑:程序博客网 时间:2024/05/23 00:06
  前段时间使用了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 plain copy
  1. /*创建Visitor*/  
  2. CREATE TABLE Visitor  
  3. (  
  4.     Id INT(11) NOT NULL AUTO_INCREMENT,  
  5.     Name VARCHAR(1000) NOT NULL,  
  6.     Email VARCHAR(1000) NOT NULL,  
  7.     Status INT NOT NULL DEFAULT 1,  
  8.     CreateTime DateTime,  
  9.     PRIMARY KEY(Id)  
  10. )  

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

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

[java] view plain copy
  1. package david.apache.model;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5.   
  6. public class Visitor {  
  7.       
  8.     private int id;  
  9.     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 plain copy
  1. private static Connection getConnection() {  
  2.     Connection conn = null;  
  3.     try {  
  4.         Class.forName(CONNECTION_DRIVER_STR);  
  5.         conn = DriverManager.getConnection(CONNECTION_STR, "root""123456");  
  6.     } catch (Exception e) {  
  7.         e.printStackTrace();  
  8.     }  
  9.     return conn;  
  10. }  

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

[java] view plain copy
  1. /* 
  2.  * 新增Visitor, ScalarHandler的demo 
  3.  */  
  4. public static void insertVisitor(Visitor visitor) {  
  5.     Connection conn = getConnection();  
  6.     QueryRunner qr = new QueryRunner();  
  7.     String sql = "insert into visitor (Name, Email, Status, CreateTime) values (?, ?, ?, ?)";  
  8.     try {  
  9.         int count = qr.update(conn, sql, visitor.getName(), visitor.getEmail(), 1new Date());  
  10.         BigInteger newId = (BigInteger) qr.query(conn, "select last_insert_id()"new ScalarHandler<BigInteger>(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<BigInteger>实体类来返回达到变通效果。

删除方法

[java] view plain copy
  1. public static void deleteVisitor(int id) {  
  2.     Connection conn = getConnection();  
  3.     QueryRunner qr = new QueryRunner();  
  4.     String sql = "delete from visitor where status>0 and id=?";  
  5.     try {  
  6.         int count = qr.update(conn, sql, id);  
  7.         System.out.println("删除" + count + "条数据。");  
  8.     } catch (SQLException e) {  
  9.         // TODO: handle exception  
  10.         e.printStackTrace();  
  11.     }  
  12. }  

查询方法

[java] view plain copy
  1. public static Visitor retrieveVisitor(int id) {  
  2.     Connection conn = getConnection();  
  3.     Visitor visitor = null;  
  4.     QueryRunner qr = new QueryRunner();  
  5.     String sql = "select * from visitor where status>0 and id=?";          
  6.     try {  
  7.         visitor = (Visitor) qr.query(conn, sql, new BeanHandler<Visitor>(Visitor.class), id);  
  8.         System.out.println(visitor);  
  9.         return visitor;  
  10.     } catch (Exception e) {  
  11.         e.printStackTrace();  
  12.     }  
  13.     return visitor;  
  14. }  

更新操作

[java] view plain copy
  1. public static void updateVisitor(int id) {  
  2.     Visitor visitor = retrieveVisitor(id);  
  3.     System.out.println("更新前:" + visitor);  
  4.     Connection conn = getConnection();  
  5.     String updateFieldStr = visitor.getName();  
  6.     QueryRunner qr = new QueryRunner();  
  7.     String sql = "update visitor set Name = ?, Email = ?, Status = ?, CreateTime = ? where status>0 and Id = ?";  
  8.     if (updateFieldStr.contains("updated")) {  
  9.         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 plain copy
  1. public static void getVisitorList() {  
  2.     Connection conn = getConnection();  
  3.     QueryRunner qr = new QueryRunner();  
  4.     String sql = "select * from visitor where status>0";  
  5.     try {  
  6.         List<Visitor> ls = qr.query(conn, sql, new BeanListHandler<Visitor>(Visitor.class));  
  7.         for (Visitor visitor : ls) {  
  8.             System.out.println(visitor);  
  9.         }  
  10.     } catch (SQLException e) {  
  11.         // TODO Auto-generated catch block  
  12.         e.printStackTrace();  
  13.     }  
  14. }  

MapHandler操作

[java] view plain copy
  1. public static void getVisitWithMap(int id) {  
  2.     Connection conn = getConnection();  
  3.     QueryRunner qr = new QueryRunner();  
  4.     String sql = "select * from visitor where status>0 and id=?";  
  5.     try {  
  6.         Map<String, Object> map = qr.query(conn, sql, new MapHandler(), id);  
  7.         Integer visitorId = Integer.valueOf(map.get("Id").toString());  
  8.         String visitorName = map.get("Name").toString();  
  9.         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 plain copy
  1. public static void getVisitWithMapLs() {  
  2.         Connection conn = getConnection();  
  3.         QueryRunner qr = new QueryRunner();  
  4.         String sql = "select * from visitor where status>0";  
  5.         try {  
  6.             List<Map<String, Object>> mapLs = qr.query(conn, sql, new MapListHandler());  
  7.             for (Map<String, Object> map : mapLs) {  
  8.                 Integer visitorId = Integer.valueOf(map.get("Id").toString());  
  9.                 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.     }  

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


本文转自【http://www.blogjava.net/davidjefiny/archive/2014/01/05/apache_common_dbutils.html】

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则作者保留追究法律责任的权利

原创粉丝点击