在 Java 开发中,为了规范不同场景下数据对象的职责,衍生出多种对象定义规范。除了常见的 POJO、VO、PO、DO 之外,还有以下这些常用类型,每种类型都有明确的适用场景:
1. POJO(Plain Old Java Object)
- 定义:普通 Java 对象,仅包含字段、getter/setter 方法,无业务逻辑,不依赖任何框架或接口(如不继承
Serializable以外的类,不实现特定框架的接口)。 - 特点:是所有 “简单数据载体” 的统称,其他对象(如 PO、VO 等)本质上都是 POJO 的细分。
- 场景:作为所有数据对象的基础规范,避免引入不必要的依赖。
2. PO(Persistent Object,持久化对象)
- 定义:与数据库表结构一一对应的对象,用于数据持久化(通过 ORM 框架映射到数据库)。
- 特点:字段名、类型与数据库表字段完全一致,通常包含主键字段,无复杂业务逻辑。
- 场景:DAO 层与数据库交互时使用(如 MyBatis 中接收查询结果、Hibernate 中作为实体类)。
3. DO(Domain Object,领域对象)
- 定义:也称为 “领域对象”,对应业务领域中的核心实体(如 “用户”“订单”),可能包含业务逻辑。
- 特点:与 PO 的区别在于,DO 更侧重业务领域概念,可能不与单一数据库表对应(可能包含多个表的关联信息)。
- 场景:Service 层处理核心业务逻辑时使用,是业务模型的直接映射。
- 注意:部分场景中 DO 与 PO 会混用(尤其是简单业务),但严格来说,DO 是 “业务实体”,PO 是 “数据库映射”。
4. VO(View Object,视图对象)
- 定义:用于前端展示的数据对象,字段根据页面 / 接口需求设计,可能包含格式化后的信息。
- 特点:可过滤敏感字段(如密码)、组合多个对象的信息(如用户 VO 包含角色名称)、转换数据格式(如日期转字符串)。
- 场景:Controller 层向前端返回数据时使用(如接口响应体、页面渲染数据)。
5. DTO(Data Transfer Object,数据传输对象)
- 定义:用于跨层 / 跨系统数据传输的对象,优化数据传输效率(减少接口调用次数)。
- 特点:按需封装传输数据,可能合并多个对象的字段(如 “用户 + 角色”DTO),或裁剪不必要的字段。
- 场景:微服务间通信、远程接口调用(如 Feign 调用)、多层架构中 Service 到 Controller 的数据传递。
- 与 VO 的区别:DTO 更侧重 “传输过程”,VO 更侧重 “前端展示”,简单场景下可混用。
6. BO(Business Object,业务对象)
- 定义:封装业务逻辑的对象,通常由多个 PO/DO 组合而成,包含业务方法。
- 特点:是业务逻辑的载体,可能包含复杂的计算、校验、规则判断等逻辑。
- 场景:Service 层处理复杂业务时使用(如 “订单 BO” 包含价格计算、库存扣减等方法)。
7. AO(Application Object,应用对象)
- 定义:用于应用层(如 Controller)接收前端请求参数的对象,通常对应一个具体的业务操作。
- 特点:与前端表单 / 请求参数一一对应,可能包含多个相关联的业务数据(如 “用户注册 AO” 包含用户名、密码、角色 ID 等)。
- 场景:Controller 层接收前端提交的表单数据或请求参数时使用,与 VO 对应 “输出” 相反,AO 侧重 “输入”。
8. Query(查询对象)
- 定义:专门用于封装查询条件的对象,集中管理查询参数。
- 特点:包含分页参数(页码、页大小)、过滤条件(如用户名模糊查询、状态筛选)等。
- 场景:DAO 层或 Service 层接收查询参数时使用(如
UserQuery包含usernameLike、status、pageNum等字段)。
9. Entity(实体对象)
- 定义:在 JPA、Hibernate 等 ORM 框架中,通常用
@Entity注解标记,本质上是 PO 的一种,但更强调与数据库表的映射关系。 - 特点:通过注解(如
@Id、@Column)明确与数据库的映射规则,是 ORM 框架的核心对象。 - 场景:与 PO 类似,在使用 JPA 等框架时更常用 “Entity” 命名。
总结:核心区别与使用场景
| 类型 | 核心作用 | 典型使用层 | 关键词 |
|---|---|---|---|
| POJO | 所有简单 Java 对象的统称 | 全层 | 无依赖、纯数据载体 |
| PO | 映射数据库表,持久化数据 | DAO 层 | 与表一一对应 |
| DO | 业务领域的核心实体 | Service 层 | 业务概念映射 |
| VO | 前端展示数据 | Controller 层(输出) | 过滤、格式化、组合展示 |
| DTO | 跨层 / 跨系统数据传输 | 服务间 / 层间通信 | 优化传输、合并 / 裁剪字段 |
| BO | 封装业务逻辑 | Service 层 | 包含业务方法、多对象组合 |
| AO | 接收前端请求参数 | Controller 层(输入) | 对应表单 / 请求参数 |
| Query | 封装查询条件 | DAO/Service 层 | 分页、过滤条件 |
| Entity | ORM 框架中的数据库映射实体 | DAO 层 | 带 ORM 注解(如 @Entity) |
这些规范的核心目的是分离关注点,让不同层的对象各司其职,避免一个对象承担过多职责(如既映射数据库又处理业务逻辑)。实际开发中,可根据项目复杂度灵活取舍(例如简单项目中 DO 和 PO 可合并,VO 和 DTO 可混用)。
3320

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



