`
163
  • 浏览: 24620 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论
阅读更多

DAO:::::DAO实现对数据库的操作.

SERVICE::::::Service实现业务逻辑的封装,数据库操作只是业务逻辑的一部分而已。

但是在实际应用中,建议使用Service+DAO,看似麻烦些,但分层能相对清晰一点。

总之,我还是很喜欢把DAO和SERVICE分开的。这样起码以后容易扩展并且看起来逻辑清晰.

看过的一篇帖子说:比如现在用hibernate 以后可能改为jdbc或者其他的也比较方便,SERVICE是单纯的进行业务逻辑处理调用DAO来持久数据,所以DAO和SERVICE还是应该要独立的!

http://www.iteye.com/topic/11712

以下是我看到的一个帖子,总结的很好。做为收藏.....

第二种模型,也就是Martin Fowler指的rich domain object是下面这样子的:

一个带有业务逻辑的实体类,即domain object是Item
一个DAO接口ItemDao
一个DAO实现ItemDaoHibernateImpl
一个业务逻辑对象ItemManager

 

java 代码
  1. public class Item implements Serializable {   
  2.     //  所有的属性和getter/setter方法同上,省略   
  3.     public Bid placeBid(User bidder, MonetaryAmount bidAmount,   
  4.                         Bid currentMaxBid, Bid currentMinBid)   
  5.         throws BusinessException {   
  6.        
  7.         // Check highest bid (can also be a different Strategy (pattern))   
  8.         if (currentMaxBid != null && currentMaxBid.getAmount().compareTo(bidAmount) > 0) {   
  9.             throw new BusinessException("Bid too low.");   
  10.         }   
  11.        
  12.         // Auction is active   
  13.         if ( !state.equals(ItemState.ACTIVE) )   
  14.             throw new BusinessException("Auction is not active yet.");   
  15.        
  16.         // Auction still valid   
  17.         if ( this.getEndDate().before( new Date() ) )   
  18.             throw new BusinessException("Can't place new bid, auction already ended.");   
  19.        
  20.         // Create new Bid   
  21.         Bid newBid = new Bid(bidAmount, this, bidder);   
  22.        
  23.         // Place bid for this Item   
  24.         this.getBids.add(newBid);  // 请注意这一句,透明的进行了持久化,但是不能在这里调用ItemDao,Item不能对ItemDao产生依赖!   
  25.        
  26.         return newBid;   
  27.     }   
  28. }  

<script>render_code();</script>

 

竞标这个业务逻辑被放入到Item中来。请注意this.getBids.add(newBid); 如果没有Hibernate或者JDO这种O/R Mapping的支持,我们是无法实现这种透明的持久化行为的。但是请注意,Item里面不能去调用ItemDAO,对ItemDAO产生依赖!

 

java 代码
  1. public interface ItemDao {   
  2.     public Item getItemById(Long id);   
  3.     public Collection findAll();   
  4.     public void updateItem(Item item);   
  5. }  

 

ItemDao定义持久化操作的接口,用于隔离持久化代码。

 

java 代码
  1. public class ItemDaoHibernateImpl implements ItemDao extends HibernateDaoSupport {   
  2.     public Item getItemById(Long id) {   
  3.         return (Item) getHibernateTemplate().load(Item.class, id);   
  4.     }   
  5.     public Collection findAll() {   
  6.         return (List) getHibernateTemplate().find("from Item");   
  7.     }   
  8.     public void updateItem(Item item) {   
  9.         getHibernateTemplate().update(item);   
  10.     }   
  11. }  

 

java 代码
  1. public class ItemManager {    
  2.     private ItemDao itemDao;    
  3.     public void setItemDao(ItemDao itemDao) { this.itemDao = itemDao;}    
  4.     public Bid loadItemById(Long id) {    
  5.         itemDao.loadItemById(id);    
  6.     }    
  7.     public Collection listAllItems() {    
  8.         return  itemDao.findAll();    
  9.     }    
  10.     public Bid placeBid(Item item, User bidder, MonetaryAmount bidAmount,    
  11.                             Bid currentMaxBid, Bid currentMinBid) throws BusinessException {    
  12.         item.placeBid(bidder, bidAmount, currentMaxBid, currentMinBid);   
  13.         itemDao.update(item);    // 必须显式的调用DAO,保持持久化   
  14.     }   
  15. }  

<script>render_code();</script>

 

在第二种模型中,placeBid业务逻辑是放在Item中实现的,而loadItemById和findAll业务逻辑是放在ItemManager中实现的。不过值得注意的是,即使placeBid业务逻辑放在Item中,你仍然需要在ItemManager中简单的封装一层,以保证对placeBid业务逻辑进行事务的管理和持久化的触发。

这种模型是Martin Fowler所指的真正的domain model。在这种模型中,有三个业务逻辑方法:placeBid,loadItemById和findAll,现在的问题是哪个逻辑应该放在Item中,哪个逻辑应该放在ItemManager中。在我们这个例子中,placeBid放在Item中(但是ItemManager也需要对它进行简单的封装),loadItemById和findAll是放在ItemManager中的。

切分的原则是什么呢? Rod Johnson提出原则是“case by case”,可重用度高的,和domain object状态密切关联的放在Item中,可重用度低的,和domain object状态没有密切关联的放在ItemManager中。

我提出的原则是:看业务方法是否显式的依赖持久化。

Item的placeBid这个业务逻辑方法没有显式的对持久化ItemDao接口产生依赖,所以要放在Item中。请注意,如果脱离了Hibernate这个持久化框架,Item这个domain object是可以进行单元测试的,他不依赖于Hibernate的持久化机制。它是一个独立的,可移植的,完整的,自包含的域对象

而loadItemById和findAll这两个业务逻辑方法是必须显式的对持久化ItemDao接口产生依赖,否则这个业务逻辑就无法完成。如果你要把这两个方法放在Item中,那么Item就无法脱离Hibernate框架,无法在Hibernate框架之外独立存在。

分享到:
评论

相关推荐

    新闻发布系统设计思路(Dao与service)

    本文将深入探讨基于 Dao(Data Access Object)与 Service 层的设计思路,这两种模式在实际项目中起到关键作用。 Dao(数据访问对象)层是应用程序与数据库交互的桥梁,它的主要职责是实现对数据库的操作,如查询、...

    S2S3H3整合以及泛型Dao与Service封装

    本程序整合了struts-2.2.3.1+spring-framework-3.1.0+hibernate-distribution-3.6.8+JSON+MySQL+Annotation,并且对Dao和Service进行了封装,内含.jar包,并且解决了一对多双向关联的could not initialize proxy - ...

    快速生成dao、service、controller等相关代码

    这个过程通常涉及编写DAO(Data Access Object)、Service和Controller层的代码,这些是软件架构中的核心组件。"快速生成DAO、Service、Controller等相关代码"的标题和描述暗示了一个针对这种情况的解决方案,即一个...

    基于MAVEN的SpringMVC+Mybatis整合及dao、service强封装

    SpringMVC+Mybatis整合及dao、service强封装:一、SPringMVC与Mybatis框架整合,其中SpringMVC主要采用注解方式实现,Mybatis采用xml为主,对数据库开发、测试、部署环境进行分离配置;二、在封装上针对Mybatis进行...

    自动生成dao,service

    在Java Web开发中,DAO层通常用于与数据库进行交互,包括CRUD(创建、读取、更新和删除)操作。Service层则负责业务逻辑,它调用DAO层的方法并进行必要的事务管理和业务规则处理。自动生成这些层的代码可以帮助...

    Java自动生成entity、dao、service、controller代码

    Java自动生成entity、dao、service、controller代码

    hibernate4 通用dao,service

    5. 测试与调试:可能涉及到如何通过JUnit测试DAO和Service的功能,确保其正确性。 6. 示例代码:博客可能会提供具体的代码示例,展示如何创建一个通用DAO和Service,以及如何在实际应用中使用它们。 7. 最佳实践:...

    怎样区分Action, Service 和 Dao功能.

    区分Action、Service和Dao功能 在软件开发中,Action、Service和Dao都是常用的架构模式,但是很多开发者对这些概念的理解和使用却存在一定的混淆。因此,本文将对Action、Service和Dao的功能进行详细的区分和解释。...

    dao+service+servlet+jsp实现留言板(添加、查看)

    本项目采用DAO(数据访问对象)、Service层以及Servlet和JSP技术,按照MVC(模型-视图-控制器)模式来实现留言板功能,包括留言的添加和查看。 1. **MVC模式**: MVC是一种广泛应用于Web应用开发的设计模式,它将...

    SSM框架下基本的mapper,dao,service,controller等相关文件的整理

    在Service层中,我们可以使用Spring框架提供的依赖注入机制,来将Dao层的对象注入到Service层中,从而实现业务逻辑与数据访问之间的交互。 Controller层 Controller层是SSM框架中的Web层,负责将用户请求与业务...

    java代码生成器(dao层service层)

    DAO层是应用程序与数据库交互的主要接口,而Service层则封装了业务逻辑,两者在Java应用开发中占据着核心地位。使用代码生成器可以显著提高开发效率,减少手动编码的工作量,降低出错概率。 DAO层的主要职责是提供...

    Servlet使用MVC模式(Dao\Service\Servlet)增删查改

    在这个名为"Servlet使用MVC模式(Dao\Service\Servlet)增删查改"的小程序中,我们将深入探讨如何利用这些组件来实现对MySQL数据库的操作。 **模型(Model)** 模型层是应用程序的核心,负责处理业务逻辑和数据访问...

    数据库表生成domain,dao,service,controller工具

    数据库表生成domain, DAO, service, controller工具是一种高效开发辅助软件,主要针对Java Web应用程序开发。这类工具的主要目的是简化从数据库模型到应用层代码的转换过程,帮助开发者快速生成符合MVC(Model-View-...

    一个通用的dao和service包

    向你的service里注入dao(spring配置文件),dao是这个包里的类 &lt;bean id="employeeService" class="com.erp.service.impl.EmployeeServiceImpl"&gt; &lt;bean class="com.xvxv.common.dao.impl.EntityDaoImpl"&gt; ...

    一次性生成dao和service层

    在反复的做项目的过程中,是不是每次都有大量的dao和service生成(vo的) 是不是总是要复制,粘贴.本人花了一天时间写了一个小小的工具.只需配合一下vo包名即可生成所有的vo 的dao 和service (当然,您的框架和我不一样只...

    Mybatis(dao)缓存|mybatis+redis(dao+service)缓存验证

    ### Mybatis(dao)缓存与mybatis+redis(dao+service)缓存验证 #### 一、Mybatis缓存机制概述 Mybatis提供了一级缓存和二级缓存两种缓存机制,这两种缓存机制有助于提高数据访问的效率。 **1.1 一级缓存** 一级...

    Service层和DAO层解析

    在简单的情况下,Service层可能直接调用DAO层的方法,但其主要目的是提供更高层次的抽象,处理业务规则,进行异常处理,并与其他服务或系统进行交互。 在分层架构中,Service层和DAO层的解耦是非常重要的。Spring...

Global site tag (gtag.js) - Google Analytics