在 Java 开发(尤其是分层架构)中,DO、VO、DTO 是用于区分数据载体的 领域模型对象,它们的核心作用是 隔离不同层次的数据传输,避免数据混乱和耦合。具体区别如下:
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 | 层 / 服务间数据传输 | 接收前端参数或服务间调用 | 按需组合 / 转换,灵活设计 |
为什么需要区分它们?
- 解耦:避免数据库表结构变更直接影响前端展示或接口定义。
- 安全:通过 VO/DTO 过滤敏感字段(如密码、身份证号),防止泄露。
- 清晰:明确数据在不同层次的用途,提高代码可读性和可维护性。
例如:用户注册时,前端传入的 UserRegisterDTO(含 confirmPassword)经过校验后,会转换为 UserDO(不含 confirmPassword)存入数据库,而查询用户列表时,UserDO 会转换为 UserVO(不含密码)返回给前端。
6585

被折叠的 条评论
为什么被折叠?



