最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

阿里巴巴Java開(kāi)發(fā)手冊(cè)中的DO、DTO、BO、AO、VO、POJO定義

2023-06-29 16:47 作者:編程小宇e  | 我要投稿

常用文件夾分層:

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


阿里巴巴Java開(kāi)發(fā)手冊(cè)中的DO、DTO、BO、AO、VO、POJO定義的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
西宁市| 乌什县| 陕西省| 密云县| 田阳县| 德兴市| 陆丰市| 大理市| 平遥县| 乌鲁木齐县| 乡城县| 全州县| 赫章县| 金山区| 浮山县| 潜江市| 宝丰县| 白山市| 道真| 漳州市| 玛沁县| 大石桥市| 蓝田县| 监利县| 辰溪县| 哈巴河县| 英吉沙县| 井研县| 阿拉善左旗| 沁源县| 漯河市| 耒阳市| 许昌县| 高陵县| 富阳市| 繁昌县| 玉溪市| 莱芜市| 伊通| 闽清县| 长乐市|