JDBC輕量級封裝的工具包Apache 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 {
} catch (SQLException e) {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);} }</pre>e.printStackTrace();
</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 {} catch (SQLException e) {int count = qr.update(conn, sql, id); System.out.println("刪除" + count + "條數據。");} }</pre>// TODO: handle exception e.printStackTrace();</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 {} catch (Exception e) {visitor = (Visitor) qr.query(conn, sql, new BeanHandler<Visitor>(Visitor.class), id); System.out.println(visitor); return visitor;} return visitor; }</pre>e.printStackTrace();
</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")) {} else {updateFieldStr = updateFieldStr.substring(0, updateFieldStr.indexOf("updated"));} visitor.setName(updateFieldStr); try {updateFieldStr = updateFieldStr + "updated";} catch (SQLException e) {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);} }</pre>// TODO: handle exception e.printStackTrace();
</div>BeanListHandler方法
public static void getVisitorList() { Connection conn = getConnection(); QueryRunner qr = new QueryRunner(); String sql = "select * from visitor where status>0"; try {} catch (SQLException e) {List<Visitor> ls = qr.query(conn, sql, new BeanListHandler<Visitor>(Visitor.class)); for (Visitor visitor : ls) { System.out.println(visitor); }} }</pre>// TODO Auto-generated catch block e.printStackTrace();
</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 {} catch (Exception e) {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);} }</pre>// TODO: handle exception e.printStackTrace();</div>
MapListHandler方法
public static void getVisitWithMapLs() {}</pre>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(); }
</div>經過上面的幾個示例,相信大家應該知道怎么用這個框架了吧~ 框架的官網地址
來自:http://www.cnblogs.com/daviddai/p/Apache_Common_DbUtils.html本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關經驗
相關資訊
sesese色