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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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配网&…