国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
DAO與SERVICE

  

DAO與SERVICE

關(guān)鍵字: SERVICE

DAO:::::DAO實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的操作.

SERVICE::::::Service實(shí)現(xiàn)業(yè)務(wù)邏輯的封裝,數(shù)據(jù)庫操作只是業(yè)務(wù)邏輯的一部分而已。

但是在實(shí)際應(yīng)用中,建議使用Service+DAO,看似麻煩些,但分層能相對(duì)清晰一點(diǎn)。

總之,我還是很喜歡把DAO和SERVICE分開的。這樣起碼以后容易擴(kuò)展并且看起來邏輯清晰.

看過的一篇帖子說:比如現(xiàn)在用hibernate 以后可能改為jdbc或者其他的也比較方便,SERVICE是單純的進(jìn)行業(yè)務(wù)邏輯處理調(diào)用DAO來持久數(shù)據(jù),所以DAO和SERVICE還是應(yīng)該要獨(dú)立的!

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

以下是我看到的一個(gè)帖子,總結(jié)的很好。做為收藏.....

第二種模型,也就是Martin Fowler指的rich domain object是下面這樣子的:

一個(gè)帶有業(yè)務(wù)邏輯的實(shí)體類,即domain object是Item
一個(gè)DAO接口ItemDao
一個(gè)DAO實(shí)現(xiàn)ItemDaoHibernateImpl
一個(gè)業(yè)務(wù)邏輯對(duì)象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);  // 請(qǐng)注意這一句,透明的進(jìn)行了持久化,但是不能在這里調(diào)用ItemDao,Item不能對(duì)ItemDao產(chǎn)生依賴!   
  25.        
  26.         return newBid;   
  27.     }   
  28. }  

<script>render_code();</script>

 

競(jìng)標(biāo)這個(gè)業(yè)務(wù)邏輯被放入到Item中來。請(qǐng)注意this.getBids.add(newBid); 如果沒有Hibernate或者JDO這種O/R Mapping的支持,我們是無法實(shí)現(xiàn)這種透明的持久化行為的。但是請(qǐng)注意,Item里面不能去調(diào)用ItemDAO,對(duì)ItemDAO產(chǎn)生依賴!

 

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);    // 必須顯式的調(diào)用DAO,保持持久化   
  14.     }   
  15. }  

<script>render_code();</script>

 

在第二種模型中,placeBid業(yè)務(wù)邏輯是放在Item中實(shí)現(xiàn)的,而loadItemById和findAll業(yè)務(wù)邏輯是放在ItemManager中實(shí)現(xiàn)的。不過值得注意的是,即使placeBid業(yè)務(wù)邏輯放在Item中,你仍然需要在ItemManager中簡(jiǎn)單的封裝一層,以保證對(duì)placeBid業(yè)務(wù)邏輯進(jìn)行事務(wù)的管理和持久化的觸發(fā)。

這種模型是Martin Fowler所指的真正的domain model。在這種模型中,有三個(gè)業(yè)務(wù)邏輯方法:placeBid,loadItemById和findAll,現(xiàn)在的問題是哪個(gè)邏輯應(yīng)該放在Item中,哪個(gè)邏輯應(yīng)該放在ItemManager中。在我們這個(gè)例子中,placeBid放在Item中(但是ItemManager也需要對(duì)它進(jìn)行簡(jiǎn)單的封裝),loadItemById和findAll是放在ItemManager中的。

切分的原則是什么呢? Rod Johnson提出原則是“case by case”,可重用度高的,和domain object狀態(tài)密切關(guān)聯(lián)的放在Item中,可重用度低的,和domain object狀態(tài)沒有密切關(guān)聯(lián)的放在ItemManager中。

我提出的原則是:看業(yè)務(wù)方法是否顯式的依賴持久化。

Item的placeBid這個(gè)業(yè)務(wù)邏輯方法沒有顯式的對(duì)持久化ItemDao接口產(chǎn)生依賴,所以要放在Item中。請(qǐng)注意,如果脫離了Hibernate這個(gè)持久化框架,Item這個(gè)domain object是可以進(jìn)行單元測(cè)試的,他不依賴于Hibernate的持久化機(jī)制。它是一個(gè)獨(dú)立的,可移植的,完整的,自包含的域?qū)ο?/span>。

而loadItemById和findAll這兩個(gè)業(yè)務(wù)邏輯方法是必須顯式的對(duì)持久化ItemDao接口產(chǎn)生依賴,否則這個(gè)業(yè)務(wù)邏輯就無法完成。如果你要把這兩個(gè)方法放在Item中,那么Item就無法脫離Hibernate框架,無法在Hibernate框架之外獨(dú)立存在。


  

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
總結(jié)一下最近關(guān)于domain object以及相關(guān)的討論
Java視線論壇 :: 閱讀主題 - 總結(jié)一下最近關(guān)于domain object以及相關(guān)的討論
SSM框架整合完整案例
DAO-持久層-領(lǐng)域?qū)ο?貧血模型
基于struts+spring+ibatis的輕量級(jí)J2EE開發(fā)
Generic Data Access Objects
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服