網站首頁 編程語言 正文
阿里巴巴開發規約的定義:
POJO(Plain Ordinary Java Object):在本規約中,POJO專指只有setter/getter/toString的簡單類,包括DO/DTO/BO/VO等。
【參考】分層領域模型規約:
- DO(Data Object):與數據庫表結構一一對應,通過DAO層向上傳輸數據源對象。
- DTO(Data Transfer Object):數據傳輸對象,Service或Manager向外傳輸的對象。
- BO(Business Object):業務對象。可以由Service層輸出的封裝業務邏輯的對象。
- Query:數據查詢對象,各層接收上層的查詢請求。額外規定:【強制】超過2個參數的查詢封裝,禁止使用Map類來傳輸。
- VO(View Object):顯示層對象,通常是Web向模板渲染引擎層傳輸的對象。
—《阿里巴巴Java開發規約》
詳細各個詞的定義:
DAO: Data Acess Object,數據訪問對象,這個我們不陌生,跟數據庫打交道的系統都會有這樣的DAO類,主要的作用:
- 封裝對數據庫的訪問,常規的增刪改查(CRUD操作)都通過DAO來實現。
PO/DO:?Persistent Object / Data Object,持久對象 / 數據對象。
- 跟數據庫表是一一對應的,一個PO/DO 數據是表的一條記錄。
- 以前用Hibernate 的時候PO用的很多,現在普遍喜歡用?DO,這個看各個公司自己的規范。
- PO / DO 只是數據的對象,不包含任何的操作。舉個例子,學生表是StudentDO,對學生表的增刪改查等操作就是StudentDAO。
DTO:Data Transfer Object,數據傳輸對象
- 在分布式系統中,系統之間可以通過DTO進行數據傳輸;
- DTO也可以在應用內部,核心層和應用層之間傳遞數據,DTO只是簡單的數據傳輸,沒有業務邏輯的處理;
- 有的場景,比如數據庫表有10個字段,id(唯一id)、version(版本號),gmt_create(記錄創建時間) 這些字段不需要對外提供,所以DTO 可以只取有含義的業務字段,DO是和數據庫記錄的一一映射,但是DTO只需要按照業務需要定義需要的字段。
BO?: Business Object, 業務對象
BO主要作用是把業務邏輯封裝為一個對象。這個對象可以包括一個或多個其它的對象。
- 在領域模型中,BO是個非常重要的概念, BO是最小的業務單元。
- BO 包含數據對象(PO/DO)以及對數據的操作。
VO: View Object, 視圖模型,展示層對象
對應頁面顯示(web頁面/移動端H5/Native視圖)的數據對象。
- 舉個例子,DTO 中時間Date格式,或者是 yyyyMMddHHmmss的字符串,但是VO需要的是前端展示的格式,需要轉成”yyyy年MM月dd月";
實踐
講了這么多概念,我們再看下實操,先說命名:
領域模型命名規約 1) 數據對象:xxxDO,xxx即為數據表名。 2) 數據傳輸對象:xxxDTO,xxx為業務領域相關的名稱。 3) 展示對象:xxxVO,xxx一般為網頁名稱。 4) POJO是DO/DTO/BO/VO的統稱,禁止命名成xxxPOJO
再以學生檔案管理系統為例,我們現在需要做個學生檔案管理的后臺系統,按照上面的定義,我們能定義出以下一些對象:
如下圖所示:
DB層這里應該叫存儲層,這里只列了DB,還有類似HBase、Redis,泛指儲存數據。
以Student表為例,DB層負責存儲。
- DAO層提供了查詢、刪除、寫入的接口;
- DO 就是DAO操作的對象,這里是StudentDO,有時候也會省略DO,直接寫Student;
- service層或core層是做業務邏輯處理的,比如查詢接口,根據學生學號調用DAO層獲取Student信息,之后做一次數據裁剪,只取業務字段,例如版本號、自增id、數據庫記錄創建時間等非業務字段不取,獲取一個StudentDTO,然后查詢學生檔案相關的ProfileDTO,組裝成ProfileBO,作為檔案領域模型;
- 業務層從service 層拿到這個BO,對BO做一個視圖轉化,轉成VO視圖對象,提供給前端負責展示。
VO(視圖) 和 DO(數據模型)都可能會隨著需求變化,軟件設計的原則是降低耦合,一桿到底這種設計就是強耦合(把視圖和數據直接綁定),DO變化的時候因為DTO(數據傳輸對象)、BO(領域模型)的存在,不需要修改VO,VO修改也同樣不需要修改DO數據模型
原文鏈接:https://blog.csdn.net/qq_46509116/article/details/135311546
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-07-18 SQL?Server中字符串函數的用法詳解_MsSql
- 2023-06-13 Python的加密模塊之hashlib?與?base64詳解及常用加密方法_python
- 2023-01-29 python?index()?與?rindex()?方法的使用示例詳解_python
- 2022-11-06 關于useEffect執行兩次的問題及解決_React
- 2022-06-04 python實現對doc,txt,xls文檔的讀寫操作_python
- 2022-09-25 線性回歸的從零開始實現(線性神經網絡)
- 2022-12-05 Django中使用AJAX的詳細過程_python
- 2023-02-03 VSCode中ESLint插件修復以及配置教程_相關技巧
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支