在DAO中對Hibernate進行封裝(轉)

偶然看見 l_walker於2003-9-15寫的一篇關於在DAO中對Hibernate的封裝的文章被置於精華。再回想起我去年在自己的項目開發中使用的一種封裝方法,覺得完全是另外一種思路。所以拿出來和大家討論,說不定運氣好也會被置爲精華 .

請看封裝後的調用代碼:

java代碼:



/**
* 用於管理...的Oracle dao
* <p>Company:... </p>
* @author chenxu
* @version 1.0
*/
public class UserOracleDAO {

/**
* 增加一個User
* @param vo UserVO
*/
public void addUser(UserVO vo, boolean needTrans) throws
AppException {
DoHibernateProc_save dproc = new DoHibernateProc_save(new Object[] {
vo}, needTrans);
dproc.doProc();
}

/**
* 更新一個User
* @param vo UserVO
*/
public void updateUser(UserVO vo, boolean needTrans) throws
AppException {
DoHibernateProc_update dproc = new DoHibernateProc_update(new
Object[] {
vo}, needTrans);
dproc.doProc();
}

/**
* 刪除一個User
* @param vo UserVO
*/
public void delUser(UserVO vo, boolean needTrans) throws
AppException {
DoHibernateProc_delete doproc = new DoHibernateProc_delete(new
Object[] {
vo}, needTrans);
doproc.doProc();
}

/**
* 獲得所有User
* @return List
*/
public List getAllUser(boolean needTrans) throws AppException {
DoHibernateProc_getLists dproc =
new DoHibernateProc_getLists(
"from UserVO as t where (t.deleted is null or t.deleted!=true)", needTrans);
dproc.doProc();
return (List) dproc.getResult();
}

/**
* 根據id查詢User
* @param name Long
* @return UserVO
*/
public UserVO getUserById(Long id, boolean needTrans) throws
AppException {
DoHibernateProc_getObject dproc = new DoHibernateProc_getObject(new
Object[] {UserVO.class, id}, needTrans);
dproc.doProc();
UserVO eType = (UserVO) dproc.getResult();
return eType;
}



在以上的 DAO 實現類的 對於hibernate的調用代碼中沒有包含任何的hibernate API的直接調用,同時也無需處理hibernate 相關的異常,有的只是對於我的5個封裝類 的調用。分別是:
DoHibernateProc_save------封裝hibernate保存操作的類
DoHibernateProc_update------封裝hibernate的更新操作的類
DoHibernateProc_delete------封裝hibernate的刪除操作的類
DoHibernateProc_getLists------封裝hibernate的hql查詢操作的類
DoHibernateProc_getObject------封裝hibernate的按id查詢的操作方法的類
;
同時其調用方法也簡介明瞭,囊括了大部分的hibernate操作。
這樣就實現了DAO開發人員和具體的Hibernate的操作的分離,可以由專門的對
hibernate非常熟悉的人員來開發維護此部分hibernate操作的代碼,業務模塊DAO開發人員對此無需有任何瞭解. 避免了不同模塊的開發人員在各自的DAO中分別修改hibernate代碼造成的混亂.

兩種封裝思路的比較:
l_walker的思路是對公用的方法(hibernate的API)進行封裝,而我的思路是對常用的crud操作進行封裝,是面向業務邏輯的封裝。

l_walker的封裝的結果是在其DAO中還是需要進行 hiernate的基本操作的調用比如:打開事務,打開session,關閉session,關閉事務,同時需要捕獲hierbnate的異常HibernateException.

而我的封裝結果是,
1,只需要用統一的方式調用我的封裝類;
2,dao開發者無需瞭解任何關於hibernate的知識;
3,調用我的封裝類一般只需2·3行簡單的代碼,也不用捕獲專有的異常
(此異常在封裝類中已被進行有效的正確的處理)。代碼量精簡!奇少!!
4,因爲修改造成的hibernate操作錯誤或不當的機率大大降低,因爲是統一的代碼,將被統一的修改;


最後,請敬仰已久的robbin提出指正!!不勝榮幸之至 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章