溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中DO、DTO、BO、VO、POJO的區(qū)別是什么

發(fā)布時間:2021-07-19 11:19:11 來源:億速云 閱讀:801 作者:chen 欄目:編程語言

這篇文章主要講解了“java中DO、DTO、BO、VO、POJO的區(qū)別是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“java中DO、DTO、BO、VO、POJO的區(qū)別是什么”吧!


 

定義

先來看看阿里巴巴開發(fā)規(guī)約的定義:

POJO(Plain Ordinary Java Object):在本規(guī)約中,POJO專指只有setter/getter/toString的簡單類,包括DO/DTO/BO/VO等。

【參考】分層領域模型規(guī)約:

  • DO(Data Object):與數(shù)據(jù)庫表結構一一對應,通過DAO層向上傳輸數(shù)據(jù)源對象。

  • DTO(Data Transfer Object):數(shù)據(jù)傳輸對象,Service或Manager向外傳輸?shù)膶ο蟆?/p>

  • BO(Business Object):業(yè)務對象??梢杂蒘ervice層輸出的封裝業(yè)務邏輯的對象。

  • Query:數(shù)據(jù)查詢對象,各層接收上層的查詢請求。額外規(guī)定:【強制】超過2個參數(shù)的查詢封裝,禁止使用Map類來傳輸。

  • VO(View Object):顯示層對象,通常是Web向模板渲染引擎層傳輸?shù)膶ο蟆?/p>

—《阿里巴巴Java開發(fā)規(guī)約》

詳細各個詞的定義:

DAO:Data Acess Object,數(shù)據(jù)訪問對象,這個我們不陌生,跟數(shù)據(jù)庫打交道的系統(tǒng)都會有這樣的DAO類,主要的作用:

  • 封裝對數(shù)據(jù)庫的訪問,常規(guī)的增刪改查(CRUD操作)都通過DAO來實現(xiàn)。

PO/DO:  Persistent Object / Data Object,持久對象 / 數(shù)據(jù)對象。

  1. 跟數(shù)據(jù)庫表是一一對應的,一個PO/DO 數(shù)據(jù)是表的一條記錄。

  2. 以前用Hibernate 的時候PO用的很多,現(xiàn)在普遍喜歡用 DO,這個看各個公司自己的規(guī)范。

  3. PO / DO 只是數(shù)據(jù)的對象,不包含任何的操作。舉個例子,學生表是StudentDO,對學生表的增刪改查等操作就是StudentDAO。

DTO:Data Transfer Object,數(shù)據(jù)傳輸對象

  1. 在分布式系統(tǒng)中,系統(tǒng)之間可以通過DTO進行數(shù)據(jù)傳輸;

  2. DTO也可以在應用內(nèi)部,核心層和應用層之間傳遞數(shù)據(jù),DTO只是簡單的數(shù)據(jù)傳輸,沒有業(yè)務邏輯的處理;

  3. 有的場景,比如數(shù)據(jù)庫表有10個字段,id(唯一id)、version(版本號),gmt_create(記錄創(chuàng)建時間) 這些字段不需要對外提供,所以DTO 可以只取有含義的業(yè)務字段,DO是和數(shù)據(jù)庫記錄的一一映射,但是DTO只需要按照業(yè)務需要定義需要的字段。

BO :  Business Object, 業(yè)務對象

BO主要作用是把業(yè)務邏輯封裝為一個對象。這個對象可以包括一個或多個其它的對象。

  1. 在領域模型中,BO是個非常重要的概念, BO是最小的業(yè)務單元。

  2. BO 包含數(shù)據(jù)對象(PO/DO)以及對數(shù)據(jù)的操作。

VO:  View Object,視圖模型,展示層對象

對應頁面顯示(web頁面/移動端H5/Native視圖)的數(shù)據(jù)對象。

  1. 舉個例子,DTO 中時間Date格式,或者是 yyyyMMddHHmmss的字符串,但是VO需要的是前端展示的格式,需要轉成”yyyy年MM月dd月";

 

實踐

講了這么多概念,我們再看下實操,先說命名:

領域模型命名規(guī)約
 1) 數(shù)據(jù)對象:xxxDO,xxx即為數(shù)據(jù)表名。
 2) 數(shù)據(jù)傳輸對象:xxxDTO,xxx為業(yè)務領域相關的名稱。
 3) 展示對象:xxxVO,xxx一般為網(wǎng)頁名稱。
 4) POJO是DO/DTO/BO/VO的統(tǒng)稱,禁止命名成xxxPOJO

再以學生檔案管理系統(tǒng)為例,我們現(xiàn)在需要做個學生檔案管理的后臺系統(tǒng),按照上面的定義,我們能定義出以下一些對象:

如下圖所示:

java中DO、DTO、BO、VO、POJO的區(qū)別是什么

DB層這里應該叫存儲層,這里只列了DB,還有類似HBase、Redis,泛指儲存數(shù)據(jù)。

以Student表為例,DB層負責存儲。

  1. DAO層提供了查詢、刪除、寫入的接口;

  2. DO 就是DAO操作的對象,這里是StudentDO,有時候也會省略DO,直接寫Student;

  3. service層或core層是做業(yè)務邏輯處理的,比如查詢接口,根據(jù)學生學號調(diào)用DAO層獲取Student信息,之后做一次數(shù)據(jù)裁剪,只取業(yè)務字段,例如版本號、自增id、數(shù)據(jù)庫記錄創(chuàng)建時間等非業(yè)務字段不取,獲取一個StudentDTO,然后查詢學生檔案相關的ProfileDTO,組裝成ProfileBO,作為檔案領域模型;

  4. 業(yè)務層從service 層拿到這個BO,對BO做一個視圖轉化,轉成VO視圖對象,提供給前端負責展示。

大學剛畢業(yè)實習那會寫了一個業(yè)務層直接調(diào)用DAO層的代碼,覺得中間要經(jīng)過服務層、核心層過于繁瑣,字段都差不多,后面被Team Leader 教學了。

VO(視圖) 和 DO(數(shù)據(jù)模型)都可能會隨著需求變化,軟件設計的原則是降低耦合,一桿到底這種設計就是強耦合(把視圖和數(shù)據(jù)直接綁定),DO變化的時候因為DTO(數(shù)據(jù)傳輸對象)、BO(領域模型)的存在,不需要修改VO,VO修改也同樣不需要修改DO數(shù)據(jù)模型。

發(fā)這個文章的時候,發(fā)現(xiàn)一件事,費勁巴拉搞的封面只有星標和長讀用戶才能看得到,截圖如下:

java中DO、DTO、BO、VO、POJO的區(qū)別是什么

感謝各位的閱讀,以上就是“java中DO、DTO、BO、VO、POJO的區(qū)別是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對java中DO、DTO、BO、VO、POJO的區(qū)別是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI