DO、VO、DTO

在 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(不含密码)返回给前端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值