前段時(shí)間使用了Apache Common DbUtils這個(gè)工具,在此留個(gè)印,以備不時(shí)查看。大家都知道現(xiàn)在市面上的數(shù)據(jù)庫(kù)訪問(wèn)層的框架很多,當(dāng)然很多都是包含了OR-Mapping工作步驟的 例如大家常用的Hibernate與Mybatis。當(dāng)然如果人們要一個(gè)純粹的封裝了JDBC的工具類,使用Apache Common DbUtils(下面簡(jiǎn)稱ACD)是個(gè)不錯(cuò)的選擇,這個(gè)工具在JDBC的基礎(chǔ)上稍加封裝是JDBC的操作更加便捷,在學(xué)習(xí)使用這個(gè)框架的途中你也不需要學(xué) 習(xí)太多的API類,因?yàn)橐还惨膊?個(gè)部分(3個(gè)包)。 1. org.apache.commons.dbutils (該包中的類主要幫助我們更便捷的操作JDBC) 2. org.apache.commons.dbutils.handlers(該包中的類都是實(shí)現(xiàn)org.apache.commons.dbutils.ResultSetHandler接口的實(shí)現(xiàn)類) 3. org.apache.commons.dbutils.wrappers(該包中的類主要是封裝了對(duì)Sql結(jié)果集的操作) 使用這個(gè)DbUtils的一些優(yōu)勢(shì): 1. 防止了資源的泄露,寫一段JDBC的準(zhǔn)備代碼其實(shí)并不麻煩,但是那些操作確實(shí)是十分耗時(shí)和繁瑣的,也會(huì)導(dǎo)致有時(shí)候數(shù)據(jù)庫(kù)連接忘記關(guān)閉了導(dǎo)致異常難以追蹤。 2. 干凈整潔的持久化代碼,把數(shù)據(jù)持久化到數(shù)據(jù)庫(kù)的代碼被打打削減,剩下的代碼能夠清晰簡(jiǎn)潔的表達(dá)你的操作目的。 3. 自動(dòng)把ResultSets中的工具映射到JavaBean中,你不需要手動(dòng)的使用Setter方法將列值一個(gè)個(gè)賦予相應(yīng)的時(shí)日,Resultset中的每一個(gè)行都大表一個(gè)完成的Bean實(shí)體。 要學(xué)習(xí)如何使用這個(gè)框架,最簡(jiǎn)單的方式就是用它寫個(gè)Demo-CRUD操作,讓我們先做個(gè)準(zhǔn)備動(dòng)作在Mysql中建立一個(gè)測(cè)試專用表Visitor /*創(chuàng)建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) ) 建完表結(jié)構(gòu),我們就可以學(xué)習(xí)怎么利用框架中的Utils類幫助我們完成CRUD-DEMO,其實(shí)對(duì)于這個(gè)框架主要操作的是ResultSetHandler接口的實(shí)現(xiàn)類與QueryRunner類 創(chuàng)建對(duì)應(yīng)的JavaBean實(shí)體類如下:  Visitor-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())); } }首先我們先新建一個(gè)獲取Connection的方法:  獲取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; }新建方法(對(duì)于里面的自增字段,我們可以采用變通的方法來(lái)插入,使用select last_insert_id()方法)  Create操作 /* * 新增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 + "條數(shù)據(jù)=>Id:" + newId); } catch (SQLException e) { e.printStackTrace(); } }大家可以看到操作的步驟其實(shí)很簡(jiǎn)單,也是寫SQL可以了,對(duì)于自增字段我們通過(guò)select last_insert_id()的方法利用ScalarHandler<BigInteger>實(shí)體類來(lái)返回達(dá)到變通效果。 刪除方法  刪除操作 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 + "條數(shù)據(jù)。"); } 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 + "條數(shù)據(jù)"); System.out.println("更新后:" + visitor); } catch (SQLException e) { // TODO: handle exception e.printStackTrace(); } }BeanListHandler方法  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(); } }MapHandler操作  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(); } }MapListHandler方法  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(); } }經(jīng)過(guò)上面的幾個(gè)示例,相信大家應(yīng)該知道怎么用這個(gè)框架了吧~ 框架的官網(wǎng)地址
如果你覺(jué)得這篇文章對(duì)你有用,歡迎推薦[推薦]
如果你覺(jué)得文章內(nèi)有錯(cuò)誤歡迎指出^0^~
如果您想轉(zhuǎn)載本博客,請(qǐng)注明出處
如果您對(duì)本文有意見(jiàn)或者建議,歡迎留言 本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文鏈接,否則作者保留追究法律責(zé)任的權(quán)利。
|
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
導(dǎo)航
統(tǒng)計(jì)
- 隨筆: 8
- 文章: 0
- 評(píng)論: 17
- 引用: 0
常用鏈接
留言簿
隨筆分類
隨筆檔案
搜索
最新評(píng)論

閱讀排行榜
評(píng)論排行榜
|
|