PO、DTO和VO的区别

PO:Persistence Object,是持久化对象,也叫实体对象(Entity),是对象到关系表的映射。在关系型数据库中,每张表对应着一个PO,PO 中的属性值与表中数据一一对应,通过数据访问层(DAO)将数据从关系型数据库中查询出来,并映射为 PO,然后再将 PO 返回给业务层进行操作或展示。通常,PO 包含了数据表的所有属性,以及一些基本的 getter 和 setter 方法。

DTO:Data Transfer Object,是数据传输对象,是用于在系统内部的不同层之间传输数据的对象。PO 是与数据库相关的对象,而 DTO 则是与业务相关的对象,DTO通常包含一些与业务关联的元素,如一组或多组 PO 的聚合、关联操作、计算生成的数据等。通过 DTO 可以将接收到的数据进行格式化和过滤,避免将不必要的数据传递到业务逻辑中,提高系统性能。同时,DTO 也使得需求变更更加容易,只需要对 DTO 进行相应的修改就可以了。

VO:View Object,是视图对象,也叫展示对象(View),主要用于业务展示的界面显示。VO 的设计目的是将业务系统中经常使用的属性和展示方法,打包成一个对象,屏蔽服务端的结构,以利于同步修改。通常,VO 与 PO 或 DTO 中的属性一一对应,但是在相关业务场景下,VO 可以对这些属性进行一些格式化或加工处理,使其更符合前端展示需求。例如,将 PO 中的日期格式化为 “yyyy-MM-dd” 格式,或者从多个 DTO 中聚合所需属性。

这些缩写之间的划分并不固定,而是在实际开发中根据需求进行的。

来自:学成在线笔记_暹罗猫~的博客-优快云博客

### DTOVO PO 的概念及区别 #### 1. **DTO (Data Transfer Object, 数据传输对象)** DTO 是一种设计模式中的角色,主要用来在不同层次间传递数据。它最初是为了优化 EJB 分布式应用而提出的,通过减少网络通信次数来提升性能[^4]。然而,在现代开发中,其用途已经扩展到任何需要跨层传输大量数据的场景。 - **特点**: 封装多个属性以便一次性传输复杂的数据结构。 - **应用场景**: 展示层服务层之间或者微服务架构下的模块间数据交换。 - **优点**: 减少多次调用带来的开销;便于维护复杂的业务逻辑。 ```java public class UserDTO { private String name; private int age; public String getName() { return this.name; } public void setName(String name) { this.name = name; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } } ``` --- #### 2. **VO (View Object, 视图对象)** VO 主要服务于前端界面的需求,负责将特定页面所需的所有数据打包成一个整体返回给客户端显示[^3]。相比其他两种对象更贴近用户的实际体验需求。 - **特点**: 面向具体UI组件定制化构建;可能包含计算字段或格式化的信息。 - **应用场景**: 前端渲染时所需的综合型数据集合体。 - **注意事项**: 不应直接暴露数据库表结构细节至外部世界以免泄露敏感信息。 ```json { "userId": 101, "userName": "Alice", "formattedDateOfBirth": "January 5th, 1987" } ``` --- #### 3. **PO (Persistent Object, 持久化对象)** 代表存储于关系型数据库内的记录映射而成的对象实例形式存在程序内存空间里头[^1]。每一个这样的实体都对应着一张具体的表格定义及其列名约束条件等等元数据描述内容。 - **特点**: 映射数据库表结构;通常由ORM框架自动生成。 - **应用场景**: DAO(Data Access Object)操作涉及增删改查等功能实现过程中作为参数传入传出使用。 - **关联技术栈**: Hibernate,Spring Data JPA等流行工具库支持自动转换SQL语句执行结果集为相应的Java Bean类型变量表示法即所谓的Entity Class也就是我们所说的PO. ```sql CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), password_hash CHAR(64) ); ``` ```java @Entity @Table(name="users") public class UserPO { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; @Column(nullable=false,length=50) private String username; @Column(length=64,columnDefinition="CHAR",nullable=false) private String passwordHash; // Getters & Setters omitted... } ``` --- ### 总结对比 | 特性/类别 | 定义范围 | 使用位置 | 是否反映DB Schema | |-----------|------------------------------|--------------------------|-------------------------| | **DTO** | 跨层通讯 | 展现层<->服务层 | 否 | | **VO** | 用户交互相关 | 展现层 | 否 | | **PO** | 实体持久化 | 持久层 | 是 | 尽管三者均属于领域驱动设计理念下常见的术语范畴之内,但是它们各自承担的角色定位完全不同,因此开发者应当依据实际情况合理选用合适的载体完成既定目标达成最佳实践效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值