Apache Common DbUtils
                        
                            时间:2021-07-01 10:21:17
                            帮助过:2人阅读
							                        
                     
                    
                    
                    前段时间使用了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