JDBC輕量級封裝的工具包Apache DbUtils使用教程

jopen 12年前發布 | 36K 次閱讀 DbUtils 持久層框架

這個工具在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)
)
</div>

建完表結構,我們就可以學習怎么利用框架中的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()));
}

}</pre>

</div> </div>

首先我們先新建一個獲取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;
}

新建方法(對于里面的自增字段,我們可以采用變通的方法來插入,使用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();
    
    } }</pre>
    </div>

    大家可以看到操作的步驟其實很簡單,也是寫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();
    
    } }</pre>
    </div> </div>

    查詢方法

    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; }</pre>
    </div>

    更新操作

    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();
    
    } }</pre>
    </div>

    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();
    
    } }</pre>
    </div>

    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();
    
    } }</pre>

    </div>

    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();
     }
    
    }</pre>
    </div>

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

    來自:http://www.cnblogs.com/daviddai/p/Apache_Common_DbUtils.html
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!