DO,VO,DTO.....

在 Java 項目里(尤其是 Spring、MyBatis 這類框架),經常會看到一堆以 O 結尾的類:VO、DO、DTO、BO、POJO……它們本質上都是普通的 Java Bean(即 POJO),但職責和出現的位置不同。下面用“用戶下單”這個場景,把常見的幾種 O?講清楚。


1. DO(Data Object)

  • 別名:Entity、PO(Persistent Object)。

  • 出現位置數據庫訪問層(DAO / Mapper)。

  • 職責

    • 一張表對應一個 DO。

    • 字段與列一一對應,命名也盡量保持和列名一致。

    • 只做數據持久化,不帶業務邏輯。

  • 示例

    @TableName("t_user")
    public class UserDO {private Long id;private String name;private String password;   // 數據庫里加密存儲private LocalDateTime createTime;private LocalDateTime updateTime;
    }

2. DTO(Data Transfer Object)

  • 出現位置:服務間或層間遠程/進程間通信(Controller ? Service、Service ? 外部 RPC、消息隊列)。

  • 職責

    • 專門用來“搬運”數據,屏蔽內部實現細節。

    • 當DO無法接收前端傳來的全部數據時,使用DTO。

    • 可以聚合多張 DO 的字段,也可以只取部分字段,避免把 DO 直接暴露出去。

    • 序列化友好(JSON / Protobuf / Hessian)。

  • 示例

    public class UserDTO {private Long id;private String name;// 沒有 password!
    }

3. VO(View Object / Value Object)

  • 出現位置:展示層(前端頁面、移動端、小程序、Thymeleaf、Vue/React)。

  • 職責

    • 面向“頁面渲染”或“接口返回”。

    • 業務服務層,處理完數據,返回信息給前端,可以通過VO.

    • 字段名、格式盡量貼近前端需求(駝峰、下劃線、枚舉值轉中文)。

    • 經常做脫敏、格式化、單位換算(錢→元/分、日期→yyyy-MM-dd)。

  • 示例

    public class UserVO {private Long userId;        // id -> userIdprivate String nickName;    // name -> nickNameprivate String createTimeStr; // LocalDateTime -> "2024-07-14 12:00"
    }

4. BO(Business Object)

  • 出現位置:業務邏輯層(Service)。

  • 職責

    • 把多張 DO 組合成一個業務意義上的對象。

    • 可以包含業務方法(例如計算折扣、校驗庫存)。

    • 很多團隊偷懶直接用 DO 代替 BO,導致貧血模型。

  • 示例

    public class OrderBO {private UserDO buyer;private List<OrderItemDO> items;private CouponDO coupon;public BigDecimal calcPayAmount() { ... }
    }

5. POJO(Plain Old Java Object)

  • 定義:上面所有 O 的統稱。只要是一個“只有屬性+getter/setter+toString”的簡單 Java 類,都叫 POJO。

  • 注意:POJO 不是某一種 O,而是它們的“祖宗”。


一張圖總結(從下往上數據流動)

數據庫表↓
DO(持久化)↓
DAO 層↓
Service 層(組裝 DO → BO,做業務計算)↓
Manager / RPC 層(BO → DTO,遠程傳輸)↓
Controller 層(DTO → VO,適配前端)↓
前端頁面 / 小程序

常見疑問

問題解答
DO 和 Entity 有什么區別?沒區別,只是叫法不同。JPA 喜歡叫 Entity,MyBatis 喜歡叫 DO/PO。
可以直接把 DO 返回給前端嗎?不建議。一來字段可能多余(密碼、邏輯刪除),二來命名格式可能不符合前端習慣。
項目小,有必要分這么細嗎?如果只有幾個接口,全部用 XxxDTO 一把梭也行。但人多了、接口多了以后,分層對象能顯著降低心智負擔。
MapStruct / BeanUtils 干嘛用?做對象轉換(DO→DTO→VO)的膠水代碼,省掉手寫 100 個 setter。

一句話記憶:
DO 存庫,DTO 跑路,VO 露臉,BO 干活,POJO 是戶口本。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88880.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構之并查集和LRUCache

系列文章目錄 數據結構之ArrayList_arraylist o(1) o(n)-CSDN博客 數據結構之LinkedList-CSDN博客 數據結構之棧_棧有什么方法-CSDN博客 數據結構之隊列-CSDN博客 數據結構之二叉樹-CSDN博客 數據結構之優先級隊列-CSDN博客 常見的排序方法-CSDN博客 數據結構之Map和Se…

UE5多人MOBA+GAS 21、給升龍添加連段攻擊,從角色的按下事件中傳遞事件給GA

文章目錄給升龍制作可連段緩存下一連段用普攻鍵來觸發升龍后續的連段在角色中發送按下普攻標簽事件在升龍中接收按下事件&#xff0c;觸發連段以及傷害和力量的傳遞最后在藍圖中設置一下升龍技能的完整代碼給升龍制作可連段 給升龍技能添加一些連段 緩存下一連段 緩存下一連…

基于光柵傳感器+FPGA+ARM的測量控制解決方案

基于光柵傳感器結合FPGA與ARM的測量控制解決方案&#xff0c;通過硬件協同分工實現高精度、實時性及多場景適應性&#xff1a;?? ?一、系統架構分工??傳感層&#xff08;光柵傳感器&#xff09;?采用光柵尺輸出正交脈沖信號&#xff0c;分辨率達0.5μm&#xff0c;精度1μ…

NW831NW910美光固態閃存NW887NW888

美光固態閃存深度解析&#xff1a;NW831、NW910、NW887、NW888系列全方位評測一、技術根基與架構創新美光NW系列固態閃存的技術突破源于其先進的G9 NAND架構&#xff0c;該架構采用5納米制程工藝和多層3D堆疊技術&#xff0c;在單位面積內實現了高達256層的存儲單元堆疊&#x…

reasense api 文檔

API 架構 英特爾實感&#xff08;Intel RealSense?&#xff09;API 提供對深度攝像頭流數據的配置、控制和訪問功能。該 API 支持通過高層級 API 快速啟用攝像頭基礎功能&#xff0c;或通過底層級 API 全面控制所有攝像頭設置。請根據需求選擇合適的 API&#xff1a; 高層級 P…

ArkTs實現骰子布局

Entry Component struct workA {// 定義6種顏色數組&#xff0c;使用ResourceColor類型確保顏色值合法性State color: ResourceColor[] [#ef2816, #f0a200, #6ab002, #005868, #41192e, #141411]// 定義公共樣式裝飾器&#xff0c;避免重復樣式代碼Stylesys() {// 白色圓形基礎…

c語言內存函數以及數據在內存中的存儲

代碼見&#xff1a;登錄 - Gitee.com 1. memcpy使用和模擬實現 strcpy&#xff0c;strncpy是拷貝字符串的&#xff0c;有局限性 函數原型&#xff1a; void * memcpy ( void * destination, const void * source, size_t num ); 功能&#xff1a; memcpy 是完成內存塊拷?的…

Codeforces Round 787 (Div. 3)(A,B,C,D,E,F,G)

Codeforces Round 787 (Div. 3) - Codeforces A. Food for Animals 題意 有a袋狗糧,b袋貓糧,c袋通用糧食&#xff0c;問現在有x只狗y只貓,每一個動物都要吃一袋糧食,問糧食夠不夠吃 思路 首先肯定考慮貓吃貓糧&#xff0c;狗吃狗糧。然后再考慮如果不夠吃的話才會去吃通用…

LLaMA-Factory的webui快速入門

一、webui的啟動方式 LLaMA-Factory 支持通過 WebUI 零代碼微調大語言模型。 在完成安裝 后&#xff0c;您可以通過以下指令進入 WebUI: llamafactory-cli webui 使用上面命令啟動服務后&#xff0c;即可使用默認7860端口進行訪問。訪問地址&#xff1a;http://ip:7860,截止…

【第四節】ubuntu server安裝docker

首先更新軟件源 sudo apt update sudo apt upgrade安裝docker 下載 Docker 官方 GPG 密鑰 # 1. 下載 Docker 官方 GPG 密鑰 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg再次更新軟件源…

Kubernetes的微服務

用控制器來完成集群的工作負載&#xff0c;那么應用如何暴漏出去&#xff1f;需要通過微服務暴漏出去后才能被訪問Service是一組提供相同服務的Pod對外開放的接口。借助Service&#xff0c;應用可以實現服務發現和負載均衡。service默認只支持4層負載均衡能力&#xff0c;沒有7…

退出登錄后頭像還在?這個緩存問題坑過多少前端!

目錄 1. 為什么退出登錄后頭像還在&#xff1f; ① 緩存沒清理干凈 ② 頭像URL沒更新 ③ 后端會話失效&#xff0c;但靜態資源可訪問 2. 怎么解決&#xff1f;5種常見方案 ? 方案1&#xff1a;強制刷新頁面&#xff08;簡單粗暴&#xff09; ? 方案2&#xff1a;給頭像…

Windows下白嫖ClaudeCode

我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 兄弟們&#xff0c;交個朋友啊&#xff01;一定要用我的呀&#xff0…

windows在anaconda中下載安裝fasttext

windows在anaconda中下載安裝fasttext 1.訪問fasttext-wheel&#xff0c;點擊對應鏈接&#xff0c;下載對應Python版本、操作系統類型 的.whl文件&#xff1a; 鏈接地址&#xff1a;https://pypi.org/project/fasttext-wheel/#files 打開anaconda終端&#xff0c;切換到上面的…

mysql5.7系列-索引下推(cover_index)

什么是索引下推 ICP&#xff08;Index Condition Pushdown&#xff09;是在MySQL 5.6版本上推出的查詢優化策略&#xff0c;把本來由Server層做的索引條件檢查下推給存儲引擎層來做&#xff0c;以降低回表和訪問存儲引擎的次數&#xff0c;提高查詢效率。 回顧下mysql的架構分…

計算機網絡(基礎概念)

計算機網絡&#xff08;基礎概念&#xff09;1 初識協議1.1 協議分層2 OSI七層模型2.1 物理層2.2 數據鏈路層2.3 網絡層2.4 傳輸層2.5 應用層3 TCP/IP協議族3.1 什么是TCP/IP協議?3.1.1 OS與網絡關系4 網絡傳輸的基本流程4.1 局域網4.2 MAC地址5 跨網絡傳輸5.1 IP地址6 Socket…

專題 JavaScript 函數基礎

你將知道&#xff1a;函數聲明和表達式函數聲明和表達式之間的區別什么是匿名函數什么是 IIFE命名函數表達式this 關鍵字函數是調用該函數時執行的代碼塊 。函數聲明和表達式讓我們回顧一下它的語法&#xff1a;functionfunctionName(param1, param2, ..., paramN) {// Functio…

數據結構——優先隊列(priority_queue)的巧妙運用

優先隊列是一種相對高級的數據結構&#xff0c;它的底層原理是二叉堆。然而本篇不會執著于深挖其背后的原理&#xff0c;更主要的是理一下它在題目中的一些實用方法&#xff0c;幫助你更快的上手使用。 優先隊列(priority_queue) 優先隊列的特別之處就在于它可以自動進行排序&…

Java:繼承和多態(必會知識點整理)

主要內容繼承多態向上轉型向下轉型方法重寫方法重載super關鍵字動態綁定封裝訪問控制構造方法規則一、繼承 1. 概念&#xff1a; 一句話說就是&#xff1a;“共性抽取&#xff0c;代碼復用”子類會將父類中的成員變量或者成員方法繼承到子類中子類繼承父類之后&#xff0c;必須…

基于esp32系列的開源無線dap-link項目使用介紹

基于esp32系列的開源無線dap-link項目使用介紹&#x1f516;有關esp32/8266相關項目&#xff1a;需要自己搭建編譯環境&#xff1a; https://github.com/windowsair/wireless-esp8266-dap/tree/master&#x1f33f;支持esp32/c3/s3,支持在線固件燒錄&#xff0c;支持AP配網&…