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 阅读(1898) 评论(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

搜索

最新评论

阅读排行榜

评论排行榜