Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念

一、概念

1.PO(persistant object) 持久對(duì)象

在 o/r 映射的時(shí)候出現(xiàn)的概念,如果沒有 o/r 映射,沒有這個(gè)概念存在了。通常對(duì)應(yīng)數(shù)據(jù)模型 ( 數(shù)據(jù)庫 ), 本身還有部分業(yè)務(wù)邏輯的處理??梢钥闯墒桥c數(shù)據(jù)庫中的表相映射的 java 對(duì)象。最簡單的 PO 就是對(duì)應(yīng)數(shù)據(jù)庫中某個(gè)表中的一條記錄,多個(gè)記錄可以用 PO 的集合。 PO 中應(yīng)該不包含任何對(duì)數(shù)據(jù)庫的操作。

2.DO(Domain Object)領(lǐng)域?qū)ο?/h4>

就是從現(xiàn)實(shí)世界中抽象出來的有形或無形的業(yè)務(wù)實(shí)體。一般和數(shù)據(jù)中的表結(jié)構(gòu)對(duì)應(yīng)。

3.TO(Transfer Object) ,數(shù)據(jù)傳輸對(duì)象

在應(yīng)用程序不同 ( 關(guān)系 ) 之間傳輸?shù)膶?duì)象

4.DTO(Data Transfer Object)數(shù)據(jù)傳輸對(duì)象

這個(gè)概念來源于J2EE的設(shè)計(jì)模式,原來的目的是為了EJB的分布式應(yīng)用提供粗粒度的數(shù)據(jù)實(shí)體,以減少分布式調(diào)用的次數(shù),從而提高分布式調(diào)用的性能和降低網(wǎng)絡(luò)負(fù)載,但在這里,我泛指用于展示層與服務(wù)層之間的數(shù)據(jù)傳輸對(duì)象。

5.VO(view object) 值對(duì)象

視圖對(duì)象,用于展示層,它的作用是把某個(gè)指定頁面(或組件)的所有數(shù)據(jù)封裝起來。

6.BO(business object) 業(yè)務(wù)對(duì)象

從業(yè)務(wù)模型的角度看 , 見 UML 元件領(lǐng)域模型中的領(lǐng)域?qū)ο?。封裝業(yè)務(wù)邏輯的 java 對(duì)象 , 通過調(diào)用 DAO 方法 , 結(jié)合 PO,VO 進(jìn)行業(yè)務(wù)操作。 business object: 業(yè)務(wù)對(duì)象 主要作用是把業(yè)務(wù)邏輯封裝為一個(gè)對(duì)象。這個(gè)對(duì)象可以包括一個(gè)或多個(gè)其它的對(duì)象。 比如一個(gè)簡歷,有教育經(jīng)歷、工作經(jīng)歷、社會(huì)關(guān)系等等。 我們可以把教育經(jīng)歷對(duì)應(yīng)一個(gè) PO ,工作經(jīng)歷對(duì)應(yīng)一個(gè) PO ,社會(huì)關(guān)系對(duì)應(yīng)一個(gè) PO 。 建立一個(gè)對(duì)應(yīng)簡歷的 BO 對(duì)象處理簡歷,每個(gè) BO 包含這些 PO 。 這樣處理業(yè)務(wù)邏輯時(shí),我們就可以針對(duì) BO 去處理。

7.POJO(plain ordinary java object) 簡單無規(guī)則 java 對(duì)象

純的傳統(tǒng)意義的 java 對(duì)象。就是說在一些 Object/Relation Mapping 工具中,能夠做到維護(hù)數(shù)據(jù)庫表記錄的 persisent object 完全是一個(gè)符合 Java Bean 規(guī)范的純 Java 對(duì)象,沒有增加別的屬性和方法。我的理解就是最基本的 Java Bean ,只有屬性字段及 setter 和 getter 方法!

8.DAO(data access object) 數(shù)據(jù)訪問對(duì)象

是一個(gè) sun 的一個(gè)標(biāo)準(zhǔn) j2ee 設(shè)計(jì)模式, 這個(gè)模式中有個(gè)接口就是 DAO ,它負(fù)持久層的操作。為業(yè)務(wù)層提供接口。此對(duì)象用于訪問數(shù)據(jù)庫。通常和 PO 結(jié)合使用, DAO 中包含了各種數(shù)據(jù)庫的操作方法。通過它的方法 , 結(jié)合 PO 對(duì)數(shù)據(jù)庫進(jìn)行相關(guān)的操作。夾在業(yè)務(wù)邏輯與數(shù)據(jù)庫資源中間。配合 VO, 提供數(shù)據(jù)庫的 CRUD 操作

二、區(qū)別

1、vo,dto,do在三層架構(gòu)應(yīng)用中的位置?


        用戶發(fā)出請(qǐng)求(可能是填寫表單),表單的數(shù)據(jù)在展示層被匹配為VO。

        展示層把VO轉(zhuǎn)換為服務(wù)層對(duì)應(yīng)方法所要求的DTO,傳送給服務(wù)層。

        服務(wù)層首先根據(jù)DTO的數(shù)據(jù)構(gòu)造(或重建)一個(gè)DO,調(diào)用DO的業(yè)務(wù)方法完成具體業(yè)務(wù)。

         服務(wù)層把DO轉(zhuǎn)換為持久層對(duì)應(yīng)的PO(可以使用ORM工具,也可以不用),調(diào)用持久層的持久化方法,把PO傳遞給它,完成持久化操作。

2、VO與DTO的區(qū)別?

大家可能會(huì)有個(gè)疑問(在筆者參與的項(xiàng)目中,很多程序員也有相同的疑惑):既然
DTO是展示層與服務(wù)層之間傳遞數(shù)據(jù)的對(duì)象,為什么還需要一個(gè)VO呢?對(duì)!對(duì)于絕
大部分的應(yīng)用場景來說,DTO和VO的屬性值基本是一致的,而且他們通常都是
POJO,因此沒必要多此一舉,但不要忘記這是實(shí)現(xiàn)層面的思維,對(duì)于設(shè)計(jì)層面來
說,概念上還是應(yīng)該存在VO和DTO,因?yàn)閮烧哂兄举|(zhì)的區(qū)別,DTO代表服務(wù)層需
要接收的數(shù)據(jù)和返回的數(shù)據(jù),而VO代表展示層需要顯示的數(shù)據(jù)。
       用一個(gè)例子來說明可能會(huì)比較容易理解:例如服務(wù)層有一個(gè)getUser的方法返回一
個(gè)系統(tǒng)用戶,其中有一個(gè)屬性是gender(性別),對(duì)于服務(wù)層來說,它只從語義上定
義:1-男性,2-女性,0-未指定,而對(duì)于展示層來說,它可能需要用“帥哥”代表男
性,用“美女”代表女性,用“秘密”代表未指定。說到這里,可能你還會(huì)反駁,在服務(wù)
層直接就返回“帥哥美女”不就行了嗎?對(duì)于大部分應(yīng)用來說,這不是問題,但設(shè)想一
下,如果需求允許客戶可以定制風(fēng)格,而不同風(fēng)格對(duì)于“性別”的表現(xiàn)方式不一樣,又
或者這個(gè)服務(wù)同時(shí)供多個(gè)客戶端使用(不同門戶),而不同的客戶端對(duì)于表現(xiàn)層的要
求有所不同,那么,問題就來了。再者,回到設(shè)計(jì)層面上分析,從職責(zé)單一原則來
看,服務(wù)層只負(fù)責(zé)業(yè)務(wù),與具體的表現(xiàn)形式無關(guān),因此,它返回的DTO,不應(yīng)該出現(xiàn)
與表現(xiàn)形式的耦合。

       理論歸理論,這到底還是分析設(shè)計(jì)層面的思維,是否在實(shí)現(xiàn)層面必須這樣做呢?
一刀切的做法往往會(huì)得不償失,下面我馬上會(huì)分析應(yīng)用中如何做出正確的選擇。

VO與DTO的應(yīng)用

在以下才場景中,我們可以考慮把VO與DTO二合為一(注意:是實(shí)現(xiàn)層面):
當(dāng)需求非常清晰穩(wěn)定,而且客戶端很明確只有一個(gè)的時(shí)候,沒有必要把VO和DTO區(qū)
分開來,這時(shí)候VO可以退隱,用一個(gè)DTO即可,為什么是VO退隱而不是DTO?
回到設(shè)計(jì)層面,服務(wù)層的職責(zé)依然不應(yīng)該與展示層耦合,所以,對(duì)于前面的例子,
你很容易理解,DTO對(duì)于“性別”來說,依然不能用“帥哥美女”,
這個(gè)轉(zhuǎn)換應(yīng)該依賴于頁面的腳本(如JavaScript)或其他機(jī)制(JSTL、EL、CSS)
即使客戶端可以進(jìn)行定制,或者存在多個(gè)不同的客戶端,
如果客戶端能夠用某種技術(shù)(腳本或其他機(jī)制)實(shí)現(xiàn)轉(zhuǎn)換,同樣可以讓VO退隱

以下場景需要優(yōu)先考慮VO、DTO并存:
上述場景的反面場景
因?yàn)槟撤N技術(shù)原因,比如某個(gè)框架(如Flex)提供自動(dòng)把POJO轉(zhuǎn)換為UI中某些Field
時(shí),可以考慮在實(shí)現(xiàn)層面定義出VO,這個(gè)權(quán)衡完全取決于使用框架的自動(dòng)轉(zhuǎn)換能力
帶來的開發(fā)和維護(hù)效率提升與設(shè)計(jì)多一個(gè)VO所多做的事情帶來的開發(fā)和維護(hù)效率的
下降之間的比對(duì)。
如果頁面出現(xiàn)一個(gè)“大視圖”,而組成這個(gè)大視圖的所有數(shù)據(jù)需要調(diào)用多個(gè)服務(wù),返回
多個(gè)DTO來組裝(當(dāng)然,這同樣可以通過服務(wù)層提供一次性返回一個(gè)大視圖的DTO來
取代,但在服務(wù)層提供一個(gè)這樣的方法是否合適,需要在設(shè)計(jì)層面進(jìn)行權(quán)衡)。

3、DTO與DO的區(qū)別?

首先是概念上的區(qū)別,DTO是展示層和服務(wù)層之間的數(shù)據(jù)傳輸對(duì)象(可以認(rèn)為是兩者
之間的協(xié)議),而DO是對(duì)現(xiàn)實(shí)世界各種業(yè)務(wù)角色的抽象,這就引出了兩者在數(shù)據(jù)上
的區(qū)別,例如UserInfo和User(對(duì)于DTO和DO的命名規(guī)則,請(qǐng)參見筆者前面的一篇
博文),對(duì)于一個(gè)getUser方法來說,本質(zhì)上它永遠(yuǎn)不應(yīng)該返回用戶的密碼,因此
UserInfo至少比User少一個(gè)password的數(shù)據(jù)。而在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中,正如第一篇系列
文章所說,DO不是簡單的POJO,它具有領(lǐng)域業(yè)務(wù)邏輯。

4、DO與PO的區(qū)別?

    DO和PO在絕大部分情況下是一一對(duì)應(yīng)的,PO是只含有g(shù)et/set方法的POJO,
   但某些場景還是能反映出兩者在概念上存在本質(zhì)的區(qū)別:

1、 DO在某些場景下不需要進(jìn)行顯式的持久化,例如利用策略模式設(shè)計(jì)的商品折扣策
略,會(huì)衍生出折扣策略的接口和不同折扣策略實(shí)現(xiàn)類,這些折扣策略實(shí)現(xiàn)類可以算是
DO,但它們只駐留在靜態(tài)內(nèi)存,不需要持久化到持久層,因此,這類DO是不存在對(duì)
應(yīng)的PO的。

2、 同樣的道理,某些場景下,PO也沒有對(duì)應(yīng)的DO,例如老師Teacher和學(xué)生
Student存在多對(duì)多的關(guān)系,在關(guān)系數(shù)據(jù)庫中,這種關(guān)系需要表現(xiàn)為一個(gè)中間表,也
就對(duì)應(yīng)有一個(gè)TeacherAndStudentPO的PO,但這個(gè)PO在業(yè)務(wù)領(lǐng)域沒有任何現(xiàn)實(shí)的意
義,它完全不能與任何DO對(duì)應(yīng)上。這里要特別聲明,并不是所有多對(duì)多關(guān)系都沒有
業(yè)務(wù)含義,這跟具體業(yè)務(wù)場景有關(guān),例如:兩個(gè)PO之間的關(guān)系會(huì)影響具體業(yè)務(wù),并
且這種關(guān)系存在多種類型,那么這種多對(duì)多關(guān)系也應(yīng)該表現(xiàn)為一個(gè)DO,又如:“角
色”與“資源”之間存在多對(duì)多關(guān)系,而這種關(guān)系很明顯會(huì)表現(xiàn)為一個(gè)DO——“權(quán)限”。


3、某些情況下,為了某種持久化策略或者性能的考慮,一個(gè)PO可能對(duì)應(yīng)多個(gè)DO,
反之亦然。例如客戶Customer有其聯(lián)系信息Contacts,這里是兩個(gè)一對(duì)一關(guān)系的
DO,但可能出于性能的考慮(極端情況,權(quán)作舉例),為了減少數(shù)據(jù)庫的連接查詢
操作,把Customer和Contacts兩個(gè)DO數(shù)據(jù)合并到一張數(shù)據(jù)表中。反過來,如果一本
圖書Book,有一個(gè)屬性是封面cover,但該屬性是一副圖片的二進(jìn)制數(shù)據(jù),而某些查
詢操作不希望把cover一并加載,從而減輕磁盤IO開銷,同時(shí)假設(shè)ORM框架不支持屬
性級(jí)別的延遲加載,那么就需要考慮把cover獨(dú)立到一張數(shù)據(jù)表中去,這樣就形成一
個(gè)DO對(duì)應(yīng)對(duì)個(gè)PO的情況。

4、PO的某些屬性值對(duì)于DO沒有任何意義,這些屬性值可能是為了解決某些持久化
策略而存在的數(shù)據(jù),例如為了實(shí)現(xiàn)“樂觀鎖”,PO存在一個(gè)version的屬性,這個(gè)
version對(duì)于DO來說是沒有任何業(yè)務(wù)意義的,它不應(yīng)該在DO中存在。同理,DO中也
可能存在不需要持久化的屬性。

轉(zhuǎn)自:https://www.cnblogs.com/wang-meng/p/5645405.htmlhttp://www.xuebuyuan.com/746625.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容