DO、VO、DTO_do vo dto-CSDN博客

在 Java 开发(尤其是分层架构)中,DOVODTO 是用于区分数据载体的 领域模型对象,它们的核心作用是 隔离不同层次的数据传输,避免数据混乱和耦合。具体区别如下:

1. DO(Data Object / Domain Object)

  • 全称:数据对象 / 领域对象
  • 核心作用:映射数据库表结构,是与数据库交互的 "数据载体"。
  • 对应层次:主要在 持久层(DAO 层) 使用,直接与数据库表字段对应。
  • 特点

    • 字段通常与数据库表的列一一对应(如主键、普通字段、外键等)。
    • 可能包含 JPA/Hibernate 等 ORM 框架的注解(如 @Table@Column)。
    • 不包含业务逻辑,仅作为数据存储的映射。
  • 示例:数据库有 user 表(id, username, password, create_time),则 DO 可能为:

    @Table(name = "user")public class UserDO {    @Id    private Long id;    private String username;  // 对应表中username列    private String password;  // 对应表中password列(通常存储加密后的值)    private LocalDateTime createTime;  // 对应表中create_time列        // getter/setter}

2. VO(View Object)

  • 全称:视图对象
  • 核心作用:用于 前端页面展示 的数据封装,仅包含页面需要的字段。
  • 对应层次:主要在 表现层(Controller 层) 使用,作为接口返回给前端的数据格式。
  • 特点

    • 字段根据前端需求定制,可能是 DO/DTO 的子集或组合(如合并多个表的数据)。
    • 可能包含格式化后的字段(如日期格式化 createTimeStr: "2023-10-01")。
    • 避免将数据库敏感字段(如密码、手机号)暴露给前端。
  • 示例:前端用户列表页只需展示 id用户名注册时间,则 VO 可能为:

    public class UserVO {    private Long id;    private String username;  // 仅展示用户名    private String createTimeStr;  // 格式化后的时间(如"2023-10-01 12:00:00")        // 不包含password等敏感字段    // getter/setter}

3. DTO(Data Transfer Object)

  • 全称:数据传输对象
  • 核心作用:用于 不同层 / 服务之间的数据传输(如前端到后端、服务 A 到服务 B),解决数据格式不匹配问题。
  • 对应层次:主要在 业务层(Service 层) 或 跨服务调用 时使用。
  • 特点

    • 字段根据传输需求设计,可能包含多个 DO 的组合数据,或对数据进行转换(如类型转换、字段重命名)。
    • 可用于接收前端传入的参数(如表单提交的数据),或服务间接口调用的请求 / 响应数据。
    • 隔离前端输入与数据库模型,避免直接使用 DO 接收参数导致的安全问题(如恶意篡改字段)。
  • 示例:前端提交用户注册表单(包含 用户名密码确认密码),后端用 DTO 接收:

    public class UserRegisterDTO {    private String username;    private String password;    private String confirmPassword;  // 仅用于前端校验,不对应数据库字段        // getter/setter + 可能包含参数校验注解(如@NotBlank)}

三者的核心区别与关系

类型

核心用途

典型使用场景

与数据库的关系

DO

映射数据库表

持久层(DAO)读写数据库

一一对应(字段与表列映射)

VO

前端展示

控制器(Controller)返回结果

按需选择,可能与表无直接对应

DTO

层 / 服务间数据传输

接收前端参数或服务间调用

按需组合 / 转换,灵活设计

为什么需要区分它们?

  1. 解耦:避免数据库表结构变更直接影响前端展示或接口定义。
  2. 安全:通过 VO/DTO 过滤敏感字段(如密码、身份证号),防止泄露。
  3. 清晰:明确数据在不同层次的用途,提高代码可读性和可维护性。

例如:用户注册时,前端传入的 UserRegisterDTO(含 confirmPassword)经过校验后,会转换为 UserDO(不含 confirmPassword)存入数据库,而查询用户列表时,UserDO 会转换为 UserVO(不含密码)返回给前端。


原网址: 访问
创建于: 2025-12-05 13:35:51
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论