在 Java 开发中,VO、DTO、POJO、PO、DO 等概念经常被使用,它们的主要区别在于 用途 和 设计目的。
🔥 1. VO(View Object)—— 视图对象
目的: 用于前端展示,通常是后端返回给前端的数据格式。
🔹 特点:
-
只包含展示需要的字段,可能会组合多个实体的数据
-
不包含业务逻辑
-
可能用于 接口返回值
📌 示例:
public class UserVO {private String username;private String email;private String roleName; // 角色名称,可能是拼接的
}
场景: 用于前端接口返回,避免暴露数据库字段。
🔥 2. DTO(Data Transfer Object)—— 数据传输对象
目的: 用于 服务层传输数据,通常是前端传入后端的参数或 后端之间的数据传递。
🔹 特点:
-
只用于数据传输,不涉及业务逻辑
-
可能用于 多个 PO/DO 组合,减少调用次数
-
可以在
Controller
层和Service
层之间传输数据
📌 示例:
public class UserDTO {private String username;private String password;private Integer age;
}
场景:
✅ 前端传参:前端提交username
和password
,后端接收UserDTO
。
✅ 微服务调用:服务A 调用 服务B 时用DTO
作为传输对象。
🔥 3. POJO(Plain Old Java Object)—— 普通 Java 对象
目的: 一个普通的 Java 类,没有特殊限制,可以是 PO、DO、DTO、VO 的基础对象。
🔹 特点:
-
只有 属性 + Getter/Setter,没有
@Entity
这些注解 -
可用于所有场景(DTO、VO、DO 都可能是 POJO)
📌 示例:
public class UserPOJO {private String name;private Integer age;
}
场景: 只是一个普通的 Java 对象,没特定用途。
🔥 4. PO(Persistent Object)—— 持久化对象
目的: 对应数据库表,通常与 ORM 框架(MyBatis、JPA)配合使用。
🔹 特点:
-
与数据库结构一一对应,通常是
@Entity
标注的对象 -
可用于 DAO 层,执行 增删改查
-
可能包含
@Table
、@Column
、@Id
注解
📌 示例(基于 JPA):
@Entity
@Table(name = "t_user")
public class UserPO {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username")private String username;
}
场景: 直接操作数据库的对象,MyBatis/JPA 需要它。
🔥 5. DO(Domain Object)—— 领域对象
目的: 表示业务对象,通常是 面向领域建模 时的核心对象。
🔹 特点:
-
面向业务逻辑,可用于 领域模型设计
-
可能包含业务逻辑
-
独立于数据库表结构
📌 示例(领域对象):
public class UserDO {private String username;private Integer age;public boolean isAdult() {return this.age >= 18;}
}
场景: 复杂业务逻辑封装,避免业务逻辑写在
Service
层。
🚀 总结:区别对比
类型 | 作用 | 主要使用场景 | 是否与数据库表绑定 | 是否包含业务逻辑 |
---|---|---|---|---|
VO(视图对象) | 前端展示 | 返回给前端的数据 | ❌ 否 | ❌ 否 |
DTO(数据传输对象) | 数据传输 | 接口入参 / 微服务间传输 | ❌ 否 | ❌ 否 |
PO(持久化对象) | 数据库映射 | 数据库操作(MyBatis/JPA) | ✅ 是 | ❌ 否 |
DO(领域对象) | 业务逻辑 | 封装业务规则 | ❌ 否 | ✅ 是 |
POJO(普通 Java 对象) | 通用对象 | 任何 Java 对象 | ❌ 否 | ❌ 否 |
🎯 什么时候用什么?
1️⃣ 数据库操作:PO (@Entity
)
2️⃣ 前后端数据传输:DTO
3️⃣ 接口返回给前端:VO
4️⃣ 业务逻辑建模:DO
5️⃣ 普通 Java 对象:POJO
这样就能清晰地区分它们的作用了! 🚀