轉載自 http://blog.sina.com.cn/s/blog_4adc4b090101kvek.html
首先解釋面上意思,service是業務層,dao是數據訪問層。
呵呵,這個問題我曾經也有過,記得以前剛學編程的時候,都是在service里直接調用dao,service里面就new一個dao類對象,調用,其他有意義的事沒做,也不明白有這個有什么用,參加工作久了以后就會知道,業務才是工作中的重中之重。
我們都知道,標准主流現在的編程方式都是采用MVC綜合設計模式,MVC本身不屬於設計模式的一種,它描述的是一種結構,最終目的達到解耦,解耦說的意思是你更改某一層代碼,不會影響我其他層代碼,如果你會像spring這樣的框架,你會了解面向接口編程,表示層調用控制層,控制層調用業務層,業務層調用數據訪問層。初期也許都是new對象去調用下一層,比如你在業務層new一個DAO類的對象,調用DAO類方法訪問數據庫,這樣寫是不對的,因為在業務層中是不應該含有具體對象,最多只能有引用,如果有具體對象存在,就耦合了。當那個對象不存在,我還要修改業務的代碼,這不符合邏輯。好比主板上內存壞了,我換內存,沒必要連主板一起換。我不用知道內存是哪家生產,不用知道多大容量,只要是內存都可以插上這個接口使用。這就是MVC的意義。
接下來說你感覺service的意義,其實因為你現在做東西分層次不是那么嚴格,在一個你們做東西業務本身也少,舉個最簡單的例子,你做一個分頁的功能,數據1000條,你20條在一個頁,你可以把這個功能寫成工具類封裝起來,然后在業務層里調用這個封裝的方法,這才是業務里真正干得事,只要沒訪問數據庫的,都要在業務里寫。
再有不明白的追問,這是經驗問題,呵呵,其實以后你就會懂。只是剛開始寫的代碼都是有個請求,我就去數據庫取,業務幾乎沒有。
------------------------------------------------------------------------------
雖然每分,但還是把自己的理解給LZ說說。
怎么說呢,我不是理論帝。所以我講講自己的理解
比說你現在用的是SSH框架,做一個用戶模塊:
1、假設現在你做這個功能會用到user表和權限表,那么你前台的頁面訪問action,action再去調用用戶模塊service,用戶模塊service判斷你是操作user表還是權限表,如果你操作的是user表則service的實現類就去調用userDAO。如果是操作的是權限表則調用權限的DAO
2、也就是說DAO一定是和數據庫的每張表一一對應,而service則不是。明白的沒?其實你一個項目一個service和一個DAO其實也一樣可以操作數據庫,只不過那要是表非常多,出問題了,那找起來多麻煩,而且太亂了
3、好處就是你的整個項目非常系統化,和數據庫的表能一致,而且功能模塊化,這樣以后維護或者改錯比較容易,性能也高一些
--------------------------------------------------------------------------
簡單的說DAO層是跟數據庫打交道的,service層是處理一些業務流程的,
至於你說的為什么要用service層封裝,我認為:一般來說,某一個程序的有些業務流程需要連接數據庫,有些不需要與數據庫打交道而直接是一些業務處理,這樣就需要我們整合起來到service中去,這樣可以起到一個更好的開發與維護的作用,同時也是MVC設計模式中model層功能的體現
-------------------------------------------------------------------------------
初級DAO模式:
例如::寫一個類 操作1張表 針對這張表的所有操作都以方法的形式寫在這個類中 1個操作對應1個方法要求是外部通過調用這個類的方法達到操作某張表的目的時不需要寫任何和數據庫以及JDBC相關的代碼,這個類的命名就是XXDAO
比如表叫做 t_goods 商品表那么操作它的DAO就叫GoodsDAO
高級DAO模式:
例如:即DAO工廠模式,多個XXDAO實現同一個接口或者繼承同一個基類,編寫一個工廠類通過工廠模式(簡單工廠模式或利用反射動態加載均可)獲得接口或基類對象,內部實際上封裝返回的是具體的XXDAO類的對象。簡單的說即是在1的基礎上將創建具體的XXDAO對象的方式由new變為工廠模式實現
例如:UserDAO dao = DAOFactory.create(...);
dao.save()
dao.delete....
-------------------------------------------------------------------------
1.有一個dao接口,里面有平時的增刪查該的方法
2.有一個具體的實體類
3.有一個dao的實現類,有對實體操作的方法,繼承1的接口
4.如果有需要,還可以有一個工廠類,負責生產dao實現類
---------------------------------------------------------------------------
DAO層一般有接口和該接口的實現類! 接口用於規范實現類! 實現類一般用於用於操作數據庫! 一般操作修改,添加,刪除數據庫操作的步驟很相似,就寫了一個公共類DAO類 ,修改,添加,刪除數據庫操作時 直接調用公共類DAO類!
-----------------------------------------------------------------------------
com.公司名.系統名.模塊名
代碼目錄結構
Action : 負責頁面邏輯,將調用service的結果返回到頁面中
Service : 接口定義
---impl 接口的實現,負責業務邏輯
Domain 對應數據庫表的pojo
Dao : 只負責連接數據庫,從數據庫中查詢結果,包裝成對象后返回
util :工具類
-
追問
-
我看着 他們的 DAO里面的接口都和service里面的接口都一模一樣 這是為什么呢
何必多此一舉 還有再問下 spring 在調用的時候經過哪幾個步驟
-
回答
-
完全一樣是因為業務簡單,都是簡單的增刪改查。但是如果業務復雜一點,service層干的活就多了。舉個簡單一點的例子,附件上傳,dao可能只把附件的路徑啊,名稱啊之類的存儲到數據庫中,但是真正的把文件上傳的ftp還是要在service層寫的。
你的第二個問題沒看懂你要問啥。
-
------------------------------------------------------------------------------------------
-
action里是動作層,一般是控制層的代碼,控制頁面的跳轉;Dao層負責數據庫的對象的増刪改查接口,里面的方法是抽象的;DAOImpl層則實現了Dao層中的抽象方法,供action調用,這樣也從一定程度上對控制層和數據庫層進行解耦
-
追問
-
dao daoImple 和 service serviceImpl 里面的接口和實現有什么不一樣嗎
分這么多層干嘛呢 是 daoImpl 供action 調用還是 serviceimpl供action 調用?
-
--------------------------------------------------------------------------------------------