Persistent層實現的兩種模式:Dao Pattern & Command Pattern

          Persistent層的作用在于屏蔽數據庫細節方面的影響(也就是說通過此處來保證對于數據庫移植等的支持),同時封裝所有與數據庫交互的數據邏輯處理。Java EE對于Persistent層的實現推薦采用的為Dao Pattern

          很久前在TSS上有篇關于用Command Pattern來實現Persistent層的文章,之所以會提出這個主要原因在于當Persistent層采用ORM工具時,ORM工具本身就提供了對于CRUD的良好支持,此時采用Command Pattern也是實現Persistent層的一個不錯的方式。

          實際項目/系統中在Persistent層采用Dao Pattern實現的應該還是占據多數,不過如果采用Command Pattern來實現也是有其優勢,在此對兩種模式實現的Persistent層做一個比較。

          Dao Pattern

          在采用Dao Pattern的實現下,通常是每個持久對象即擁有一個Dao,通常此Dao通過依賴一個通用的Dao來完成與數據庫交互的邏輯處理,這里以一個簡單的用戶的Dao為例:

          持久對象Dao

          public class UserDaoImpl implements UserDao{

                 
          private CommonDao dao=null;
                 
                 
          public void setDao(CommonDao dao){
                        
          this.dao=dao;
                 }


                 
          public void save(User user){
                        dao.save(user);
                 }

                 
                 
          public void update(User user){
                        dao.update(user);
                 }


                 
          public void delete(User user){
                        dao.delete(user);
                 }


                 
          public User getById(int id){
                        
          return (User)dao.getById(id);
                 }


                 
          public User getByNameAndPass(String name,String pass){
                        Map params
          =new HashMap();
                        params.put(“name”,name);
                        params.put(“pass”,pass);
                        
          return (User)dao.getUniqueObjectByNamedQuery(“userquery”,params);
                 }


          }

          這是一個典型的、簡單的Dao對象,上層在調用時則可使用如DaoFactory.getDao(UserDao.class)或采用IoC直接注入的方法進行調用。

          Command Pattern

          在采用Command Pattern的實現下,每個持久對象的數據庫處理邏輯采用命令來實現,也就是說每個交互動作都是一個命令,對于只有普通CRUD操作而無復雜的數據邏輯處理的持久對象來說則可直接采用系統中已有的各種交互邏輯處理Command,同樣以一個簡單的用戶數據庫交互對象為例:

          對于用戶的保存交互:

          public class SaveCommand implements Command{

                 
          public void execute(Params params){

                        Session _session
          =HibernateUtil.getSession();

                        Transaction tx
          =_session.beginTransaction();

                        
          try{

          _session.save(params.getObject())

          tx.commit();

                        }


                        
          catch(Exception e){

                 
          if(tx!=null){

                 tx.rollback();

          }


          }


          finally{

                 HibernateUtil.closeSession();

          }


          }


          }

          這是一個簡單的命令交互對象,上層在調用時可使用如DaoCommand.getCommand(SaveCommand.class).execute(params)IoC注入等方式。

           

          以上是對于兩種模式實現Persistent的一個簡單的描述(以上的代碼只是個簡單的示例),可以看到兩者都可實現Persistent層所想要的效果,Persistent層存在的必要性我想沒什么值得多說的,以Dao pattern or Command Pattern實現Persistent層我覺得各有優缺點,簡單對比了一下,至于在Persistent層的通用方面(對外層屏蔽數據庫細節、封裝數據交互邏輯)由于兩者都可實現,所以沒做比較:

           

          DAO Pattern

          Command Pattern

              

          通過一個Dao對象完整的表達該持久對象與數據庫的各種交互邏輯

          細粒度的重用(使得普通的CRUD操作可不斷的重用,避免過多Dao的產生)

              

          導致了眾多DAO代碼的產生,而且Dao中往往方法都相同,這個時候通常需要去抽象形成一個基類的Dao避免CRUD在每個DAO中的重復,但眾多DAO的產生仍然不可避免。

          分散了持久對象的數據庫交互邏輯,也就是說無法有一個可看到該持久對象的數據庫交互邏輯的全貌對象,而是通過各種Command去完成。

          posted on 2005-12-26 13:10 BlueDavy 閱讀(1916) 評論(2)  編輯  收藏 所屬分類: Java

          評論

          # re: Persistent層實現的兩種模式:Dao Pattern & Command Pattern 2005-12-28 14:07 nonocast

          采用泛型會使DAO寫起來非常容易  回復  更多評論   

          # re: Persistent層實現的兩種模式:Dao Pattern & Command Pattern 2008-09-13 16:41 MyYate

          @nonocast
          泛型dao實現的時候一般都是一個PO都要寫一個daoimpl,當然不用泛型也一樣,而且在進行封裝復雜查詢時非常不方便。hibernate出現以后覺得dao可以取消了。
          作者這個command的參數params如何定義呢?  回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

          <2005年12月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 新竹县| 略阳县| 长宁县| 西乌珠穆沁旗| 方城县| 赫章县| 桂林市| 大埔区| 上虞市| 敦煌市| 新蔡县| 开封市| 盖州市| 呼和浩特市| 乌拉特后旗| 项城市| 新蔡县| 明溪县| 壶关县| 青河县| 白玉县| 旌德县| 井陉县| 普格县| 和龙市| 西华县| 河北省| 蓝山县| 天长市| 南充市| 根河市| 宜都市| 阿瓦提县| 获嘉县| 昌江| 北票市| 克东县| 沛县| 滨海县| 巢湖市| 肇源县|