POJO、DO/PO、BO、VO、DTO的區(qū)別與聯(lián)系

最近看到好多O,DO/PO、BO、VO、DTO等等,這么多O不都是POJO嗎,有必要分這么細(xì)嗎?

POJO 是什么?為什么會(huì)有 POJO ?

POJO(Plain Ordinary Java Object)
簡(jiǎn)單的java對(duì)象,是為了避免和 EJB 混淆而創(chuàng)建的簡(jiǎn)稱。在POJO下,又有DO/PO、BO、VO、DTO的分類。

POJO的特點(diǎn):只有setter/getter/toString的簡(jiǎn)單方法,沒(méi)有業(yè)務(wù)邏輯,所以稱作普通的簡(jiǎn)單的java對(duì)象。

回憶一下 EJB

EJB(Enterprise Java Beans)是基于分布式事務(wù)處理的企業(yè)級(jí)應(yīng)用程序的組件。

Sun 公司發(fā)布的文檔對(duì)EJB的定義是:EJB 是用于開(kāi)發(fā)和部署多層結(jié)構(gòu)的、分布式的、面向?qū)ο蟮?Java 應(yīng)用系統(tǒng)的跨平臺(tái)的構(gòu)件體系結(jié)構(gòu)。也就是說(shuō)EJB是以組件為基礎(chǔ)的技術(shù)模型。

EJB 的架構(gòu)主要包括:EJB 類,EJB 對(duì)象,Remote接口、Home接口。

EJB 類,包含了組件的實(shí)現(xiàn)細(xì)節(jié),是實(shí)際完成Bean功能的地方。EJB容器根據(jù)需要調(diào)用這個(gè)類對(duì)Bean進(jìn)行實(shí)例化。

EJB 對(duì)象,在服務(wù)器端,一個(gè) EJB 對(duì)象是一個(gè)實(shí)現(xiàn)了bean的遠(yuǎn)程接口的分布式對(duì)象,它在服務(wù)器端包裝了bean的實(shí)例。EJB對(duì)象由容器控制在適當(dāng)?shù)臅r(shí)機(jī)調(diào)用所需的服務(wù),這些服務(wù)對(duì)于客戶端是透明的。
Remote接口,根據(jù) EJB 規(guī)范,所有的 Remote接口都必須來(lái)源于一個(gè)通用的接口,包含了 EJB 對(duì)象必須實(shí)現(xiàn)的方法。

Home接口,開(kāi)發(fā)者必須定義Home接口,容器廠商則提供從Home接口中產(chǎn)生Home對(duì)象實(shí)現(xiàn)的方法。
好復(fù)雜的 EJB ,還是回過(guò)頭來(lái)看 POJO 吧。

PO/DO 和 DAO層的關(guān)系

PO(Persistent Object)/DO(Data Object)持久化對(duì)象/數(shù)據(jù)對(duì)象,與數(shù)據(jù)庫(kù)表結(jié)構(gòu)一一對(duì)應(yīng),一個(gè)PO/DO對(duì)象是表中的一條數(shù)據(jù)。PO/DO只是數(shù)據(jù)的對(duì)象,不包含任何操作。

在分層系統(tǒng)里,一般將系統(tǒng)分為DAO層、Service層、Controller層、視圖層。

DAO(Data Access Object)數(shù)據(jù)訪問(wèn)層對(duì)象,封裝對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),常規(guī)的增刪改查(CRUD操作)都通過(guò)DAO層的DAO類實(shí)現(xiàn)。而 DO/PO屬于DAO層,是用來(lái)支持DAO層類操作的協(xié)助類。

業(yè)務(wù)層的 BO

BO(Business Object)業(yè)務(wù)對(duì)象,把業(yè)務(wù)邏輯要處理的基礎(chǔ)數(shù)據(jù)封裝為一個(gè)對(duì)象。在分層系統(tǒng)里,BO作用于Service層,是用來(lái)支持Service層類操作的協(xié)助類。
在領(lǐng)域模型中,BO是一個(gè)非常重要的概念,BO是最小的業(yè)務(wù)單元。BO包含數(shù)據(jù)對(duì)象(PO/DO)以及對(duì)數(shù)據(jù)的操作。

視圖層的 VO

VO(View Object/Value Object)表示層對(duì)象,和視圖模型打交道的數(shù)據(jù)對(duì)象,主要用于客戶端的數(shù)據(jù)展示。在分層系統(tǒng)里,VO作用于視圖模型層,是支持?jǐn)?shù)據(jù)展示的協(xié)助類。

DTO又是什么?

DTO(Data Transfer Object)數(shù)據(jù)傳輸對(duì)象,在分布式系統(tǒng)中,系統(tǒng)之間可以通過(guò)DTO進(jìn)行數(shù)據(jù)傳輸。DTO也可以應(yīng)用在應(yīng)用內(nèi)部,DTO只是簡(jiǎn)單的數(shù)據(jù)傳輸,沒(méi)有業(yè)務(wù)邏輯的處理。

最后總結(jié)

在規(guī)模比較小的項(xiàng)目里,對(duì)于POJO不用分這么細(xì),一個(gè)DO數(shù)據(jù)對(duì)象在DAO層、Service層、Controller層和視圖層之間來(lái)回應(yīng)用。

如果項(xiàng)目做了前后端分離,在列表頁(yè)面的展示涉及到幾個(gè)表的查詢,這時(shí)候DO/PO就不夠用了,那么VO的作用就體現(xiàn)出來(lái)了,服務(wù)器端需要把頁(yè)面需要的數(shù)據(jù)封裝成一個(gè)數(shù)據(jù)對(duì)象返回給客戶端,這就是VO表示層對(duì)象,只作用于視圖層數(shù)據(jù)的展示。當(dāng)然,很多小公司這一步也省了,一個(gè)json對(duì)象,一個(gè)map對(duì)象搞定。

至于BO,也和VO的應(yīng)用類似,只不過(guò)它要封裝的是業(yè)務(wù)層的數(shù)據(jù)。而DTO,則是用來(lái)封裝系統(tǒng)間傳輸數(shù)據(jù)的對(duì)象??傊鼈兌际荘OJO。

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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