常见术语:什么是 DTO & VO & PO & DO
DTO、VO、PO 是分层架构(尤其是结合 DDD、Spring Boot 项目)中常见的几种对象类型,它们分别服务于不同的层,职责清晰、边界明确。
✅ 一张表快速区分:DTO / VO / PO / DO¶
| 名称 | 全称 | 作用 | 典型使用层 | 是否与数据库映射 |
|---|---|---|---|---|
| DTO | Data Transfer Object | 服务/接口层之间的数据传输对象 | Controller ↔ App ↔ Domain | ❌(一般不直接) |
| VO | View Object | 用于前端展示的数据对象 | API Controller | ❌ |
| PO | Persistent Object | 数据库持久化对象(对应表结构) | Infrastructure (DAO) | ✅ |
| DO | Domain Object / Entity | 领域实体/值对象 | Domain Layer | ❌(自己控制) |
🔍 各对象类型详细解析¶
1. ✅ DTO(Data Transfer Object)¶
- 用于服务层/远程调用层之间的数据交换
- 可以用于请求参数或接口返回
- 通常是扁平结构、不包含业务逻辑
📦 示例:
| Java | |
|---|---|
🧭 使用场景:
- 接口参数传递(如
@RequestBody UserDTO) - 微服务之间的 RPC 通信(Feign 等)
- 应用服务与领域服务的数据桥梁
2. ✅ VO(View Object)¶
- 用于构建前端页面/响应展示的数据模型
- 可能会组合多个数据源、加工展示
- 通常是只读的、展现层专用的
📦 示例:
| Java | |
|---|---|
🧭 使用场景:
Controller接口响应数据封装(Result<UserVO>)- 用于页面展示字段,不一定是数据库字段
3. ✅ PO(Persistent Object)¶
- 直接对应数据库表结构
- 通常是 MyBatis、JPA 等 ORM 框架映射对象
- 包含数据库字段(可能还有一些注解如
@Table、@Column)
📦 示例:
| Java | |
|---|---|
🧭 使用场景:
- DAO 层 / Mapper 层使用
- ORM 框架与数据库交互
4. ✅ DO(Domain Object / Domain Entity)¶
- 领域模型的核心
- 聚焦业务行为,包含业务逻辑
- 不依赖数据库,不关心持久化细节
📦 示例:
| Java | |
|---|---|
🧭 使用场景:
- DDD 领域模型
- 领域服务中的操作对象
- 不用于暴露给 Controller
🎯 对比图解(从前端到数据库):¶
| Text Only | |
|---|---|
🧠 开发建议¶
| 建议 | 说明 |
|---|---|
| ❌ 不要混用 | DTO ≠ VO ≠ PO ≠ DO,各自职责清晰 |
| ✅ 用 MapStruct 等工具做转换 | 避免手动冗长的拷贝 |
| ✅ Controller 接受 DTO / 返回 VO | 不直接暴露 Domain Entity 或 PO |
| ✅ 领域层只使用 DO,不依赖 DTO/PO |
✅ 总结一句话¶
DTO 用来传数据,VO 用来展示数据,PO 用来存数据,DO 用来管业务。