Apache DbUtils - JDBC輕量級封裝的工具包


  前段時間使用了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

/*創建Visitor*/
CREATE TABLE Visitor
(
    Id INT(11) NOT NULL AUTO_INCREMENT,
    Name VARCHAR(1000) NOT NULL,
    Email VARCHAR(1000) NOT NULL,
    Status INT NOT NULL DEFAULT 1,
    CreateTime DateTime,
    PRIMARY KEY(Id)
)

建完表結構,我們就可以學習怎么利用框架中的Utils類幫助我們完成CRUD-DEMO,其實對於這個框架主要操作的是ResultSetHandler接口的實現類與QueryRunner類

創建對應的JavaBean實體類如下:

package david.apache.model;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Visitor {
    
    private int id;
    private String name;
    private String email;
    private int status;
    private Date createTime;

    public Visitor() {
        // TODO Auto-generated constructor stub
        setCreateTime(new Date());
    }

    public Visitor(String name, String email) {
        this.setName(name);
        this.setEmail(email);
        this.setStatus(1);
        this.setCreateTime(new Date());
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return String.format("{Id: %d, Name: %s, Email: %s, CreateTime: %s}", getId(), getName(), getEmail(),
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(getCreateTime()));
    }
}
Visitor-JavaBean

首先我們先新建一個獲取Connection的方法:

private static Connection getConnection() {
    Connection conn = null;
    try {
        Class.forName(CONNECTION_DRIVER_STR);
        conn = DriverManager.getConnection(CONNECTION_STR, "root", "123456");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return conn;
}
獲取Connection

新建方法(對於里面的自增字段,我們可以采用變通的方法來插入,使用select last_insert_id()方法)

/*
 * 新增Visitor, ScalarHandler的demo
 */
public static void insertVisitor(Visitor visitor) {
    Connection conn = getConnection();
    QueryRunner qr = new QueryRunner();
    String sql = "insert into visitor (Name, Email, Status, CreateTime) values (?, ?, ?, ?)";
    try {
        int count = qr.update(conn, sql, visitor.getName(), visitor.getEmail(), 1, new Date());
        BigInteger newId = (BigInteger) qr.query(conn, "select last_insert_id()", new ScalarHandler<BigInteger>(1));
        visitor.setId(Integer.valueOf(String.valueOf(newId)));
        System.out.println("新增" + count + "條數據=>Id:" + newId);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
Create操作

大家可以看到操作的步驟其實很簡單,也是寫SQL可以了,對於自增字段我們通過select last_insert_id()的方法利用ScalarHandler<BigInteger>實體類來返回達到變通效果。

刪除方法

public static void deleteVisitor(int id) {
    Connection conn = getConnection();
    QueryRunner qr = new QueryRunner();
    String sql = "delete from visitor where status>0 and id=?";
    try {
        int count = qr.update(conn, sql, id);
        System.out.println("刪除" + count + "條數據。");
    } catch (SQLException e) {
        // TODO: handle exception
        e.printStackTrace();
    }
}
刪除操作

查詢方法

public static Visitor retrieveVisitor(int id) {
    Connection conn = getConnection();
    Visitor visitor = null;
    QueryRunner qr = new QueryRunner();
    String sql = "select * from visitor where status>0 and id=?";        
    try {
        visitor = (Visitor) qr.query(conn, sql, new BeanHandler<Visitor>(Visitor.class), id);
        System.out.println(visitor);
        return visitor;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return visitor;
}
查詢操作

更新操作

public static void updateVisitor(int id) {
    Visitor visitor = retrieveVisitor(id);
    System.out.println("更新前:" + visitor);
    Connection conn = getConnection();
    String updateFieldStr = visitor.getName();
    QueryRunner qr = new QueryRunner();
    String sql = "update visitor set Name = ?, Email = ?, Status = ?, CreateTime = ? where status>0 and Id = ?";
    if (updateFieldStr.contains("updated")) {
        updateFieldStr = updateFieldStr.substring(0, updateFieldStr.indexOf("updated"));
    } else {
        updateFieldStr = updateFieldStr + "updated";
    }
    visitor.setName(updateFieldStr);
    try {
        int count = qr.update(conn, sql, new Object[] { visitor.getName(), visitor.getName(), visitor.getStatus(),
                visitor.getCreateTime(), visitor.getId() });
        System.out.println("更新了" + count + "條數據");
        System.out.println("更新后:" + visitor);
    } catch (SQLException e) {
        // TODO: handle exception
        e.printStackTrace();
    }
}
更新操作

BeanListHandler方法

public static void getVisitorList() {
    Connection conn = getConnection();
    QueryRunner qr = new QueryRunner();
    String sql = "select * from visitor where status>0";
    try {
        List<Visitor> ls = qr.query(conn, sql, new BeanListHandler<Visitor>(Visitor.class));
        for (Visitor visitor : ls) {
            System.out.println(visitor);
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
BeanListHandler

MapHandler操作

public static void getVisitWithMap(int id) {
    Connection conn = getConnection();
    QueryRunner qr = new QueryRunner();
    String sql = "select * from visitor where status>0 and id=?";
    try {
        Map<String, Object> map = qr.query(conn, sql, new MapHandler(), id);
        Integer visitorId = Integer.valueOf(map.get("Id").toString());
        String visitorName = map.get("Name").toString();
        String visitorEmail = map.get("Email").toString();
        Integer visitorStatus = Integer.valueOf(map.get("Status").toString());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString());
        Visitor visitor = new Visitor(visitorName, visitorEmail);
        visitor.setId(visitorId);
        visitor.setStatus(visitorStatus);
        visitor.setCreateTime(visitorCreateTime);
        System.out.println(visitor);
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
}
MapHandler操作

MapListHandler方法

public static void getVisitWithMapLs() {
        Connection conn = getConnection();
        QueryRunner qr = new QueryRunner();
        String sql = "select * from visitor where status>0";
        try {
            List<Map<String, Object>> mapLs = qr.query(conn, sql, new MapListHandler());
            for (Map<String, Object> map : mapLs) {
                Integer visitorId = Integer.valueOf(map.get("Id").toString());
                String visitorName = map.get("Name").toString();
                String visitorEmail = map.get("Email").toString();
                Integer visitorStatus = Integer.valueOf(map.get("Status").toString());
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date visitorCreateTime = sdf.parse(map.get("CreateTime").toString());
                Visitor visitor = new Visitor(visitorName, visitorEmail);
                visitor.setId(visitorId);
                visitor.setStatus(visitorStatus);
                visitor.setCreateTime(visitorCreateTime);
                System.out.println(visitor);
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
MapListHandler操作

經過上面的幾個示例,相信大家應該知道怎么用這個框架了吧~ 框架的官網地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM