1.0          其他語言
 
 

4.3 寫你自己的 DAO 類

 
 

在大多數情況下,都需要寫自己的 DAO 函數,因為自動產生的 DAO 函數太簡單,無法應付復雜場合。

許多專案都需要從多個表中查詢,在這種情況下,我們需要寫一些 VO(value object) 類。新的 VO 類可以是一個全新的 Java bean 類,或者是自動產生的資料庫 model 類的子類

比如,表 A 有如下欄位(column):
XX
YY
ZZ
並且表 B 有如下欄位(column):
SS
TT

我們可以寫一個新的 VO 類來應付新的查詢需求︰

public class MyVO{
    String xx;
String ss;
public String getXx(){ return xx;
} public void setXx(String xx){ this.xx = xx;
} public String getSs(){ return ss;
} public void setSs(String ss){ this.ss = ss;
}
} ... String sql = "select A.XX,B.SS from A,B "; // sql += " where ...";
return this.queryBeanList(sql, null, MyVO.class);//each element is a MyVO object
...

這里的 mapping 是基于資料庫欄位(column) 名稱和 Java bean 屬性名稱,這里不需要額外的配置檔案。

對于其他的更新/刪除操作,可以使用 ANSI SQL 寫 DAO 函數:

    public void decreaseInventory(String productItemId, long qty) {
        StringBuffer sql = new StringBuffer();
        sql.append("update inventory i set qty = qty - ?");
        sql.append(" where itemid = ?");
        List paraList = new LinkedList();
        paraList.add(new Long(qty));
        paraList.add(productItemId);
        int updateCount = this.update(sql.toString(), paraList.toArray());
        log.debug("udpate count:" + updateCount);

    }

相比較直接用 JDBC 編程,優勢在于我們不再需要注意資源的釋放了,不再需要使用 JDBC Connection/Statement/ResultSet 了,也不需要寫 try catch 了.