springmvc 中dao層和service層的區(qū)別說明
springmvc dao層和service層的區(qū)別
首先解釋面上意思,service是業(yè)務(wù)層,dao是數(shù)據(jù)訪問層
這個問題我曾經(jīng)也有過,記得以前剛學(xué)編程的時候,都是在service里直接調(diào)用dao,service里面就new一個dao類對象,調(diào)用,其他有意義的事沒做,也不明白有這個有什么用,參加工作久了以后就會知道,業(yè)務(wù)才是工作中的重中之重。
我們都知道,標(biāo)準(zhǔn)主流現(xiàn)在的編程方式都是采用MVC綜合設(shè)計模式,MVC本身不屬于設(shè)計模式的一種,它描述的是一種結(jié)構(gòu),最終目的達(dá)到解耦,解耦說的意思是你更改某一層代碼,不會影響我其他層代碼,如果你會像spring這樣的框架,你會了解面向接口編程,表示層調(diào)用控制層,控制層調(diào)用業(yè)務(wù)層,業(yè)務(wù)層調(diào)用數(shù)據(jù)訪問層。
初期也許都是new對象去調(diào)用下一層,比如你在業(yè)務(wù)層new一個DAO類的對象,調(diào)用DAO類方法訪問數(shù)據(jù)庫,這樣寫是不對的,因為在業(yè)務(wù)層中是不應(yīng)該含有具體對象,最多只能有引用,如果有具體對象存在,就耦合了。當(dāng)那個對象不存在,我還要修改業(yè)務(wù)的代碼,這不符合邏輯。
好比主板上內(nèi)存壞了,我換內(nèi)存,沒必要連主板一起換。我不用知道內(nèi)存是哪家生產(chǎn),不用知道多大容量,只要是內(nèi)存都可以插上這個接口使用。這就是MVC的意義。
接下來說你感覺service的意義,其實因為你現(xiàn)在做東西分層次不是那么嚴(yán)格,在一個你們做東西業(yè)務(wù)本身也少,舉個最簡單的例子,你做一個分頁的功能,數(shù)據(jù)1000條,你20條在一個頁,你可以把這個功能寫成工具類封裝起來,然后在業(yè)務(wù)層里調(diào)用這個封裝的方法,這才是業(yè)務(wù)里真正干得事,只要沒訪問數(shù)據(jù)庫的,都要在業(yè)務(wù)里寫。
DAO層、Service層、Controller層和View層詳解
DAO層
DAO層主要是做數(shù)據(jù)持久層的工作,負(fù)責(zé)與數(shù)據(jù)庫進(jìn)行聯(lián)絡(luò)的一些任務(wù)都封裝在此,DAO層的設(shè)計首先是設(shè)計DAO的接口,然后在Spring的配置文件中定義此接口的實現(xiàn)類,然后就可在模塊中調(diào)用此接口來進(jìn)行數(shù)據(jù)業(yè)務(wù)的處理,而不用關(guān)心此接口的具體實現(xiàn)類是哪個類,顯得結(jié)構(gòu)非常清晰,DAO層的數(shù)據(jù)源配置,以及有關(guān)數(shù)據(jù)庫連接的參數(shù)都在Spring的配置文件中進(jìn)行配置。
Service層
Service層主要負(fù)責(zé)業(yè)務(wù)模塊的邏輯應(yīng)用設(shè)計。同樣是首先設(shè)計接口,再設(shè)計其實現(xiàn)的類,接著再Spring的配置文件中配置其實現(xiàn)的關(guān)聯(lián)。這樣我們就可以在應(yīng)用中調(diào)用Service接口來進(jìn)行業(yè)務(wù)處理。Service層的業(yè)務(wù)實現(xiàn),具體要調(diào)用到已定義的DAO層的接口,封裝Service層的業(yè)務(wù)邏輯有利于通用的業(yè)務(wù)邏輯的獨立性和重復(fù)利用性,程序顯得非常簡潔。
Controller層
Controller層負(fù)責(zé)具體的業(yè)務(wù)模塊流程的控制,在此層里面要調(diào)用Serice層的接口來控制業(yè)務(wù)流程,控制的配置也同樣是在Spring的配置文件里面進(jìn)行,針對具體的業(yè)務(wù)流程,會有不同的控制器,我們具體的設(shè)計過程中可以將流程進(jìn)行抽象歸納,設(shè)計出可以重復(fù)利用的子單元流程模塊,這樣不僅使程序結(jié)構(gòu)變得清晰,也大大減少了代碼量。
View層
此層與控制層結(jié)合比較緊密,需要二者結(jié)合起來協(xié)同工發(fā)。View層主要負(fù)責(zé)前臺jsp頁面的表示
DAO層
Service層這兩個層次都可以單獨開發(fā),互相的耦合度很低,完全可以獨立進(jìn)行,這樣的一種模式在開發(fā)大項目的過程中尤其有優(yōu)勢,Controller,View層因為耦合度比較高,因而要結(jié)合在一起開發(fā),但是也可以看作一個整體獨立于前兩個層進(jìn)行開發(fā)。這樣,在層與層之前我們只需要知道接口的定義,調(diào)用接口即可完成所需要的邏輯單元應(yīng)用,一切顯得非常清晰簡單。 DAO設(shè)計的總體規(guī)劃需要和設(shè)計的表,和實現(xiàn)類之間一一對應(yīng)。
DAO層所定義的接口里的方法都大同小異,這是由我們在DAO層對數(shù)據(jù)庫訪問的操作來決定的,對數(shù)據(jù)庫的操作,我們基本要用到的就是新增,更新,刪除,查詢等方法。因而DAO層里面基本上都應(yīng)該要涵蓋這些方法對應(yīng)的操作。除此之外,可以定義一些自定義的特殊的對數(shù)據(jù)庫訪問的方法。
Service邏輯層設(shè)計
Service層是建立在DAO層之上的,建立了DAO層后才可以建立Service層,而Service層又是在Controller層之下的,因而Service層應(yīng)該既調(diào)用DAO層的接口,又要提供接口給Controller層的類來進(jìn)行調(diào)用,它剛好處于一個中間層的位置。每個模型都有一個Service接口,每個接口分別封裝各自的業(yè)務(wù)處理方法。
在DAO層定義的一些方法,在Service層并沒有使用,那為什么還要在DAO層進(jìn)行定義呢?這是由我們定義的需求邏輯所決定的。
DAO層的操作 經(jīng)過抽象后基本上都是通用的,因而我們在定義DAO層的時候可以將相關(guān)的方法定義完畢,這樣的好處是在對Service進(jìn)行擴展的時候不需要再對DAO層進(jìn)行修改,提高了程序的可擴展性。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC學(xué)習(xí)之JSON和全局異常處理詳解
在項目上線之后,往往會出現(xiàn)一些不可預(yù)料的異常信息,對于邏輯性或設(shè)計性問題,開發(fā)人員或者維護(hù)人員需要通過日志,查看異常信息并排除異常,這篇文章主要給大家介紹了關(guān)于SpringMVC學(xué)習(xí)之JSON和全局異常處理的相關(guān)資料,需要的朋友可以參考下2022-10-10java實現(xiàn)拉鉤網(wǎng)上的FizzBuzzWhizz問題示例
這篇文章主要介紹了java實現(xiàn)拉鉤網(wǎng)上的FizzBuzzWhizz問題示例,需要的朋友可以參考下2014-05-05SpringCloud zuul 網(wǎng)關(guān)如何解決跨域問題
這篇文章主要介紹了SpringCloud zuul網(wǎng)關(guān)解決跨域問題的具體實現(xiàn)方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06IDEA無法創(chuàng)建JDK1.8版本的Springboot項目問題解決(2種方法)
本文主要介紹了IDEA無法創(chuàng)建JDK1.8版本的Springboot項目問題解決,包含兩種解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07IntelliJ IDEA創(chuàng)建maven web項目的圖文步驟(IDEA新手適用)
這篇文章主要介紹了IntelliJ IDEA創(chuàng)建maven web項目的圖文步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架
這篇文章主要介紹了詳解Spring Cloud 跨服務(wù)數(shù)據(jù)聚合框架,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03