当前位置: 首页 > news >正文

分层对象模型:PO、DTO、VO、BO定义区别与使用场景

目录

前言

PO(持久化对象)

DTO(数据传输对象)

VO(视图对象)

BO(业务对象)

关键区别总结

典型应用场景 

为什么要分层设计

工具支持


前言

在开发中,我们经常遇到一些对象,如VO、DTO、PO、BO这些,搞不懂为什么要分这么多对

象,直接查询出对象实体类返回不就可以了吗?其实每个对象模型都有不同含义和作用,我们主要

说一下这几个对象模型在开发中的用途和区别。

PO(持久化对象)

作用:直接映射数据库表结构,与数据库交互的实体,数据库结构是怎么样的,PO就是对应数据

库库表结构。

特点

  • 通常与ORM框架(如Hibernate、MyBatis)配合使用。
  • 字段与数据库一一对应,可能包含数据库特有的注解(如@Table、@Column)

示例

@Entity
@Table(name = "user")
public class UserPO {
    @Id
    private Long id;
    private String name;
    private String email;
    // Getters & Setters
}

DTO(数据传输对象)

作用:用于不同层(Controller层与Service层)之间数据传输,避免暴露敏感数据或冗余字段,一

般用于Controller层接收传递给Service进行业务处理,或者一般远程调用(如RPC接口)或微服务

之间通信。

特点

  • 按需组合数据,可能包含多个PO的字段。

示例:

public class UserDTO {
    private Long id;
    private String name;
    // 不返回email,避免隐私泄露
    // Getters & Setters
}

VO(视图对象)

作用:面向前端展示,封装页面需要的数据,可能包含格式化后的数据。

特点:

  • 结构与前端UI强相关,可能组合多个业务数据。

  • 例如:日期格式化为字符串、状态码转文字描述。

示例

public class UserVO {
    private String userName;
    private String registerDate; // 格式化为"yyyy-MM-dd"
    // Getters & Setters
}

BO(业务对象)

作用:封装复杂的业务逻辑,代表业务处理最小单元。

特点

  • 可能聚合多个PO的数据,并包含业务方法。
  • 例如:订单BO包含订单信息、用户信息、商品列表及计算总价的方法。

示例

public class OrderBO {
    private OrderPO orderPO;
    private UserPO userPO;
    private List<ProductPO> products;
    
    public BigDecimal calculateTotalPrice() {
        // 业务逻辑:计算订单总价
    }
}

关键区别总结

对象层级核心用途数据特点
PO数据访问层(DAO)直接对应数据库表结构与数据库字段严格一致
DTO服务层/控制层之间跨层传输数据,屏蔽敏感字段按需组合,无业务逻辑
VO控制层/前端适配前端展示需求格式化数据,结构灵活
BO业务逻辑层(Service)封装复杂业务逻辑聚合多个PO,包含业务方法

典型应用场景 

  • 用户注册流程
  1. 前端提交表单——>DTO接收(如UserCreateDTO)。
  2. Service层将DTO转化为PO存入数据库。
  3. Service层可能通过BO组合用户、权限数据。
  4. 返回给前端时,PO转为VO(如隐藏密码,格式化日期)
  • 微服务PRC调用
  1. 服务A通过DTO向服务B请求数据。
  2. 服务B从数据库获取PO,转换DTO返回。

为什么要分层设计

  • 解耦:各层职责单一,修改数据库字段不影响前端展示。
  • 安全:DTO和VO可过滤敏感字段(如密码、手机号)。
  • 复用性:BO封装通用业务逻辑,避免代码重复。
  • 灵活性:VO可自由适配不同前端请求(Web、App、小程序)。

工具支持

对象转换工具:

  • MapStructPlus:通过注解自动生成转换代码。
http://www.dtcms.com/a/130742.html

相关文章:

  • win10中快速访问部分外网的快捷设置方法
  • 【已更新完毕】2025泰迪杯数据挖掘竞赛B题数学建模思路代码文章教学:基于穿戴装备的身体活动监测
  • MySQL中的隐式转换和显式转换
  • 2025认证杯挑战赛B题【 谣言在社交网络上的传播 】原创论文讲解(含完整python代码)
  • java学习总结(if switch for)
  • Go:方法
  • 【Java】查看当前 Java 使用的垃圾回收器
  • 【GitHub探索】mcp-go,MCP协议的Golang-SDK
  • AVL搜索树
  • 互斥锁(mutex) ---- 静态锁与动态锁
  • (C语言)算法复习总结1——二分查找
  • 【T2I】Region-Aware Text-to-Image Generation via Hard Binding and Soft Refinement
  • GPT-2 语言模型 - 模型训练
  • 关于柔性数组
  • 开源项目faster-whisper和whisper是啥关系
  • C语言之continue相关题目
  • 剖析 Rust 与 C++:性能、安全及实践对比
  • 【频域分析】对数谱
  • app逆向专题四:charles抓包工具配置
  • Relief法**是一种非常经典、有效的**特征选择算法
  • Java—— 文字版格斗游戏
  • 整型与布尔型的转换
  • 二分三分算法详解, 模板与临界条件分析
  • Android开发:应用DeepSeek官方Api在App中实现对话功能
  • 智能制造方案精读:117页MES制造执行系统解决方案【附全文阅读】
  • vue webSocket
  • 腾势品牌欧洲市场冲锋,科技豪华席卷米兰
  • CSI-PVController-claimWorker
  • 【Unity精品源码】Ultimate Character Controller:高级角色控制器完整解决方案
  • Go语言Slice切片底层