当前位置: 首页 > 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:通过注解自动生成转换代码。

相关文章:

  • 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法**是一种非常经典、有效的**特征选择算法
  • 国家统计局:中美大幅降低关税有利于双方贸易增长,也有利于世界经济复苏
  • 减负举措如何助力基层干部轻装上阵?记者一线调查
  • 国际观察丨美中东政策生变,以色列面临艰难选择
  • 芬兰直升机相撞坠毁事故中五名人员全部遇难
  • 全国游泳冠军赛:孙杨、潘展乐同进400自决赛,今晚将正面对决
  • 试点首发进口消费品检验便利化措施,上海海关与上海商务委发文