阿里巴巴Java開(kāi)發(fā)手冊(cè)中的DO、DTO、BO、AO、VO、POJO定義
常用文件夾分層:
pojo
vo (與前端交互的所有對(duì)象,包括接參和返回)
query (查詢的篩選條件,前端傳參和后端內(nèi)部傳參通用)
entity (數(shù)據(jù)庫(kù)表基礎(chǔ)對(duì)象)
dto(后端內(nèi)部傳輸用,例如多張表字段合并到一個(gè)對(duì)象)
下面都是解釋為什么這么做,不愛(ài)看可以跳過(guò)
分層領(lǐng)域模型規(guī)約:
DO(Data Object):此對(duì)象與數(shù)據(jù)庫(kù)表結(jié)構(gòu)一一對(duì)應(yīng),通過(guò) DAO 層向上傳輸數(shù)據(jù)源對(duì)象。
DTO(Data Transfer Object):數(shù)據(jù)傳輸對(duì)象,Service 或 Manager 向外傳輸?shù)膶?duì)象。
BO(Business Object):業(yè)務(wù)對(duì)象,可以由 Service 層輸出的封裝業(yè)務(wù)邏輯的對(duì)象。
Query:數(shù)據(jù)查詢對(duì)象,各層接收上層的查詢請(qǐng)求。注意超過(guò) 2 個(gè)參數(shù)的查詢封裝,禁止使用 Map 類來(lái)傳輸。
VO(View Object):顯示層對(duì)象,通常是 Web 向模板渲染引擎層傳輸?shù)膶?duì)象。

面對(duì)這個(gè)圖,讓我們先從承上啟下的DTO開(kāi)始入手
DTO(Data Transfer Object)數(shù)據(jù)傳輸對(duì)象
這個(gè)傳輸通常指的前后端之間的傳輸
DTO是一個(gè)比較特殊的對(duì)象,他有兩種存在形式:
在后端,他的存在形式是java對(duì)象,也就是在controller里面定義的那個(gè)東東,通常在后端不需要關(guān)心怎么從json轉(zhuǎn)成java對(duì)象的,這個(gè)都是由一些成熟的框架幫你完成啦,比如spring框架
在前端,他的存在形式通常是js里面的對(duì)象(也可以簡(jiǎn)單理解成json),也就是通過(guò)ajax請(qǐng)求的那個(gè)數(shù)據(jù)體
這也是為什么把他畫(huà)成橫跨兩層的原因
這里可能會(huì)遇到個(gè)問(wèn)題,現(xiàn)在微服務(wù)盛行,服務(wù)和服務(wù)之間調(diào)用的傳輸對(duì)象能叫DTO嗎?
我的理解是看情況
DTO本身的一個(gè)隱含的意義是要能夠完整的表達(dá)一個(gè)業(yè)務(wù)模塊的輸出
如果服務(wù)和服務(wù)之間相對(duì)獨(dú)立,那就可以叫DTO
如果服務(wù)和服務(wù)之間不獨(dú)立,每個(gè)都不是一個(gè)完整的業(yè)務(wù)模塊,拆開(kāi)可能僅僅是因?yàn)橛?jì)算復(fù)雜度或者性能的問(wèn)題,那這就不能夠叫做DTO,只能是BO
VO(Value Object)值對(duì)象
VO就是展示用的數(shù)據(jù),不管展示方式是網(wǎng)頁(yè),還是客戶端,還是APP,只要是這個(gè)東西是讓人看到的,這就叫VO
VO主要的存在形式就是js里面的對(duì)象(也可以簡(jiǎn)單理解成json)
VO和DTO的區(qū)別
主要有兩個(gè)區(qū)別
一個(gè)是字段不一樣,VO根據(jù)需要會(huì)刪減一些字段
另一個(gè)是值不一樣,VO會(huì)根據(jù)需要對(duì)DTO中的值進(jìn)行展示業(yè)務(wù)的解釋
舉個(gè)簡(jiǎn)單的例子
DTO可能是這樣的
{
“gender”:“男”,
“age”:35
}
對(duì)于業(yè)務(wù)一來(lái)說(shuō)只需要性別,而且因?yàn)槭且粋€(gè)古風(fēng)聊天室,也不能直接展示男,因此經(jīng)過(guò)業(yè)務(wù)解釋業(yè)務(wù)一的VO是
{
“gender”:“公子”
}
對(duì)于業(yè)務(wù)二來(lái)說(shuō)只需要年齡,而且不需要精確的年齡,因此經(jīng)過(guò)業(yè)務(wù)解釋業(yè)務(wù)二的VO是
{
“age”:“30~39”
}
PO(Persistant Object)持久對(duì)象
PO比較好理解
簡(jiǎn)單說(shuō)PO就是數(shù)據(jù)庫(kù)中的記錄,一個(gè)PO的數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)著庫(kù)中表的結(jié)構(gòu),表中的一條記錄就是一個(gè)PO對(duì)象
通常PO里面除了get,set之外沒(méi)有別的方法
對(duì)于PO來(lái)說(shuō),數(shù)量是相對(duì)固定的,一定不會(huì)超過(guò)數(shù)據(jù)庫(kù)表的數(shù)量
等同于Entity,這倆概念是一致的
BO(Business Object)業(yè)務(wù)對(duì)象
BO就是PO的組合
簡(jiǎn)單的例子比如說(shuō)PO是一條交易記錄,BO是一個(gè)人全部的交易記錄集合對(duì)象
復(fù)雜點(diǎn)兒的例子PO1是交易記錄,PO2是登錄記錄,PO3是商品瀏覽記錄,PO4是添加購(gòu)物車記錄,PO5是搜索記錄,BO是個(gè)人網(wǎng)站行為對(duì)象
BO是一個(gè)業(yè)務(wù)對(duì)象,一類業(yè)務(wù)就會(huì)對(duì)應(yīng)一個(gè)BO,數(shù)量上沒(méi)有限制,而且BO會(huì)有很多業(yè)務(wù)操作,也就是說(shuō)除了get,set方法以外,BO會(huì)有很多針對(duì)自身數(shù)據(jù)進(jìn)行計(jì)算的方法
為什么BO也畫(huà)成橫跨兩層呢?原因是現(xiàn)在很多持久層框架自身就提供了數(shù)據(jù)組合的功能,因此BO有可能是在業(yè)務(wù)層由業(yè)務(wù)來(lái)拼裝PO而成,也有可能是在數(shù)據(jù)庫(kù)訪問(wèn)層由框架直接生成
很多情況下為了追求查詢的效率,框架跳過(guò)PO直接生成BO的情況非常普遍,PO只是用來(lái)增刪改使用
BO和DTO的區(qū)別
這兩個(gè)的區(qū)別主要是就是字段的刪減
BO對(duì)內(nèi),為了進(jìn)行業(yè)務(wù)計(jì)算需要輔助數(shù)據(jù),或者是一個(gè)業(yè)務(wù)有多個(gè)對(duì)外的接口,BO可能會(huì)含有很多接口對(duì)外所不需要的數(shù)據(jù),因此DTO需要在BO的基礎(chǔ)上,只要自己需要的數(shù)據(jù),然后對(duì)外提供
在這個(gè)關(guān)系上,通常不會(huì)有數(shù)據(jù)內(nèi)容的變化,內(nèi)容變化要么在BO內(nèi)部業(yè)務(wù)計(jì)算的時(shí)候完成,要么在解釋VO的時(shí)候完成
OK,到這里這些關(guān)系基本就理清楚了
等等,DO是什么
DO呢,標(biāo)題不是還有個(gè)DO么?
上面這些概念基本上已經(jīng)涵蓋了全部的流程,DO只是跟其中一個(gè)概念相同
但是跟哪個(gè)概念相同呢?
現(xiàn)在主要有兩個(gè)版本
一個(gè)是阿里巴巴的開(kāi)發(fā)手冊(cè)中的定義
DO( Data Object)這個(gè)等同于上面的PO
另一個(gè)是在DDD(Domain-Driven Design)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中
DO(Domain Object)這個(gè)等同于上面的BO
最后,讓我們?cè)僬f(shuō)說(shuō)實(shí)際應(yīng)用
這幾個(gè)概念很完整,我們?cè)谟玫臅r(shí)候是必須按這個(gè)來(lái)做嗎?
當(dāng)然不是的,系統(tǒng)和系統(tǒng)的復(fù)雜度不同,協(xié)作水平不同,完全沒(méi)有必要教條主義,這些概念全上
上哪些概念,省哪些,我給一些實(shí)際建議
1,PO這個(gè)沒(méi)法省,不管叫PO還是Entity,怎么著都得有
2,一些工具類的系統(tǒng)和一些業(yè)務(wù)不是很復(fù)雜的系統(tǒng)DTO是可以和BO合并成一個(gè),當(dāng)業(yè)務(wù)擴(kuò)展的時(shí)候注意拆分就行
3,VO是可以第一個(gè)優(yōu)化掉的,展示業(yè)務(wù)不復(fù)雜的可以壓根兒不要,直接用DTO
原文:https://blog.csdn.net/MacWx/article/details/122618986
1、什么是DTO、VO、BO、PO、DO、POJO
POJO的定義是無(wú)規(guī)則簡(jiǎn)單的對(duì)象,在日常的代碼分層中pojo會(huì)被分為VO、BO、 PO、 DTO。通過(guò)各層POJO的使用,有助于提高代碼的可讀性和可維護(hù)性。
概念看似簡(jiǎn)單,但是想?yún)^(qū)分好或者理解好也不容易,本文簡(jiǎn)單梳理一下。

DTO(Data Transfer Object)數(shù)據(jù)傳輸對(duì)象
在服務(wù)間的調(diào)用中,傳輸?shù)臄?shù)據(jù)對(duì)象
個(gè)人理解,DTO是可以存在于各層服務(wù)中(接口、服務(wù)、數(shù)據(jù)庫(kù)等等)服務(wù)間的交互使用DTO來(lái)解耦
VO (view object/value object)表示層對(duì)象
前端展示的數(shù)據(jù),在接口數(shù)據(jù)返回給前端的時(shí)候需要轉(zhuǎn)成VO
使用場(chǎng)景,在接口層服務(wù)中,將DTO轉(zhuǎn)成VO,返回給前臺(tái)
B0(bussines object)業(yè)務(wù)層對(duì)象
主要在服務(wù)內(nèi)部使用的業(yè)務(wù)對(duì)象
主要在服務(wù)內(nèi)部使用的業(yè)務(wù)對(duì)象
使用場(chǎng)景,在服務(wù)層服務(wù)中,由DTO轉(zhuǎn)成BO然后進(jìn)行業(yè)務(wù)處理后,轉(zhuǎn)成DTO返回到接口層
PO(persistent object)持久對(duì)象
出現(xiàn)位置為數(shù)據(jù)庫(kù)數(shù)據(jù),用來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)提取的數(shù)據(jù)
只存儲(chǔ)數(shù)據(jù),不包含數(shù)據(jù)操作
使用場(chǎng)景,在數(shù)據(jù)庫(kù)層中,獲取的數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)到PO中,然后轉(zhuǎn)為DTO返回到服務(wù)層中
DO(domain object)領(lǐng)域?qū)嶓w對(duì)象
DO 現(xiàn)在主要有兩個(gè)版本:
①阿里巴巴的開(kāi)發(fā)手冊(cè)中的定義,DO( Data Object)這個(gè)等同于上面的PO
②DDD(Domain-Driven Design)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中,DO(Domain Object)這個(gè)等同于上面的BO
2、區(qū)別
《阿里巴巴Java開(kāi)發(fā)規(guī)范》關(guān)于領(lǐng)域模型的部分介紹如下:
分層領(lǐng)域模型規(guī)約:
DO(Data Object):此對(duì)象與數(shù)據(jù)庫(kù)表結(jié)構(gòu)一一對(duì)應(yīng),通過(guò) DAO 層向上傳輸數(shù)據(jù)源對(duì)象。
DTO(Data Transfer Object):數(shù)據(jù)傳輸對(duì)象,Service 或 Manager 向外傳輸?shù)膶?duì)象。
BO(Business Object):業(yè)務(wù)對(duì)象,由 Service 層輸出的封裝業(yè)務(wù)邏輯的對(duì)象。
AO(ApplicationObject):應(yīng)用對(duì)象,在Web層與Service層之間抽象的復(fù)用對(duì)象模型, 極為貼近展示層,復(fù)用度不高。
VO(View Object):顯示層對(duì)象,通常是 Web 向模板渲染引擎層傳輸?shù)膶?duì)象。
Query:數(shù)據(jù)查詢對(duì)象,各層接收上層的查詢請(qǐng)求。注意超過(guò) 2 個(gè)參數(shù)的查詢封裝,禁止使用 Map 類來(lái)傳輸。
最難理解的是BO,大致這么理解:
BO這個(gè)對(duì)象可以包括一個(gè)或多個(gè)其它的對(duì)象。
比如一個(gè)簡(jiǎn)歷,有教育經(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)簡(jiǎn)歷的BO對(duì)象處理簡(jiǎn)歷,每個(gè)BO包含這些PO。這樣處理業(yè)務(wù)邏輯時(shí),我們就可以針對(duì)BO去處理。
3、示例代碼
Controller層
此層常見(jiàn)的轉(zhuǎn)換為:DTO轉(zhuǎn)VO,將Services層傳過(guò)來(lái)的DTO轉(zhuǎn)換成VO表示數(shù)據(jù)返回給前端
public List<UserVO> getUsers(UserQuery userQuery);
Service層、Manager層
此層常見(jiàn)的轉(zhuǎn)換為:DO轉(zhuǎn)BO、BO轉(zhuǎn)DTO

DAO層
此層常見(jiàn)的轉(zhuǎn)換為:DTO轉(zhuǎn)換為DO,與數(shù)據(jù)庫(kù)進(jìn)行交互

領(lǐng)域模型定義
Entity表結(jié)構(gòu)實(shí)體,對(duì)應(yīng)DO
BO業(yè)務(wù)實(shí)體
VO視圖實(shí)體,DTO可共用
入?yún)⒎庋b
○ xxxParam
○ Query xxx Param
○ Save xxx Param
○ Edit xxx Param
○ Remove xxx Param
