jinji
发布于 2025-01-09 / 97 阅读
0
0

DTO、VO、PO是什么意思,为什么在domain下面

在软件开发中,DTOVOPO 是常见的对象模型,用于在不同层次之间传递数据或表示数据。它们的主要目的是解耦和分层,使代码更清晰、更易于维护。以下是它们的定义和区别:


1. PO(Persistent Object,持久化对象)

  • 定义:PO 是与数据库表直接映射的对象,通常与数据库表一一对应。
  • 作用:用于表示数据库中的一条记录。
  • 特点
    • 通常与 ORM 框架(如 MyBatis、Hibernate)一起使用。
    • 包含与数据库字段对应的属性和方法。
    • 一般不包含业务逻辑。
  • 示例
    // User.java
    @Data
    @TableName("user")
    public class User {
        @TableId(type = IdType.AUTO)
        private Long id;
        private String name;
        private Integer age;
    }
    

2. DTO(Data Transfer Object,数据传输对象)

  • 定义:DTO 是用于在不同层(如 Controller 层和 Service 层)之间传输数据的对象。
  • 作用:封装数据,减少网络传输的数据量,避免暴露数据库结构。
  • 特点
    • 通常用于前后端交互或服务间通信。
    • 可以根据需要组合多个 PO 的数据。
    • 不包含业务逻辑。
  • 示例
    // UserDTO.java
    @Data
    public class UserDTO {
        private Long id;
        private String name;
        private Integer age;
        private String email; // 可能来自其他表或服务
    }
    

3. VO(View Object,视图对象)

  • 定义:VO 是用于展示层(如前端页面)的对象,通常包含需要展示的数据。
  • 作用:封装展示层需要的数据,避免直接暴露数据库结构。
  • 特点
    • 通常用于 Controller 层返回给前端的数据。
    • 可以根据需要组合多个 DTO 或 PO 的数据。
    • 可能包含格式化后的数据(如日期格式化)。
  • 示例
    // UserVO.java
    @Data
    public class UserVO {
        private Long id;
        private String name;
        private String ageGroup; // 例如:青年、中年
    }
    

为什么放在 domain 目录下?

在分层架构中,domain 是领域模型的存放位置,通常包含与业务逻辑相关的对象。将 DTO、VO、PO 放在 domain 目录下的原因如下:

  1. 职责清晰

    • domain 是业务逻辑的核心,DTO、VO、PO 都是与业务数据相关的对象,放在这里可以更好地体现它们的职责。
    • 例如,PO 是数据库表的映射,DTO 是业务数据的传输载体,VO 是展示数据的载体。
  2. 便于管理

    • 将相关对象放在同一个目录下,便于查找和维护。
    • 例如,domain 目录下可以按模块划分,如 userorder 等。
  3. 解耦分层

    • DTO、VO、PO 分别用于不同层次(如持久层、服务层、展示层),放在 domain 中可以更好地体现分层设计的思想。

目录结构示例

src
└── main
    └── java
        └── com
            └── example
                └── domain
                    ├── po
                    │   └── User.java
                    ├── dto
                    │   └── UserDTO.java
                    └── vo
                        └── UserVO.java

总结

对象 全称 作用 使用场景
PO Persistent Object 数据库表映射 持久层(如 MyBatis、Hibernate)
DTO Data Transfer Object 数据传输 服务层、Controller 层
VO View Object 展示数据 展示层(如前端页面)

通过 DTO、VO、PO 的分层设计,可以实现代码的解耦和复用,提高系统的可维护性和扩展性。


评论