1 基础

POJO(Plain Ordinary Java Object)

POJO(Plain Ordinary Java Object) 的缩写,表示一个简单 java 对象。上面说的 PO、VO、DTO 都是典型的 POJO。而 DAO、BO 一般都不是 POJO,只提供一些调用方法。

2 数据库相关

2.1 PO(Persistant Object)

PO是 Persistant Object 的缩写,用于表示数据库中的一条记录映射成的 java 对象。
PO 仅仅用于表示数据,没有任何数据操作。通常遵守 Java Bean 的规范,拥有 getter/setter 方法。

2.2 DO(Data Object)

在《阿里巴巴Java开发规范里面》
DO(Data Object)
此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。

2.3 DAO(Data Access Object)

DAO 是 Data Access Object 的缩写,用于表示一个数据访问对象。使用 DAO 访问数据库,包括插入、更新、删除、查询等操作,与 PO 一起使用。DAO 一般在持久层,完全封装数据库操作,对外暴露的方法使得上层应用不需要关注数据库相关的任何信息。

3 传输相关

3.1 VO(View/Value Object)

VO 是 Value Object(或View Object) 的缩写,用于表示一个与前端进行交互的 java 对象。有的朋友也许有疑问,这里可不可以使用 PO 传递数据?实际上,这里的 VO 只包含前端需要展示的数据即可,对于前端不需要的数据,比如数据创建和修改的时间等字段,出于减少传输数据量大小和保护数据库结构不外泄的目的,不应该在 VO 中体现出来。通常遵守 Java Bean 的规范,拥有 getter/setter 方法。

3.2 TO/DTO(Data/Transfer Object)

DTO是Data Transfer Object 的缩写,用于表示一个数据传输对象。DTO 通常用于不同服务或服务不同分层之间的数据传输。DTO 与 VO 概念相似,并且通常情况下字段也基本一致。但 DTO 与 VO 又有一些不同,这个不同主要是设计理念上的,比如 API 服务需要使用的 DTO 就可能与 VO 存在差异。通常遵守 Java Bean 的规范,拥有 getter/setter 方法。
常用语微服务器接口之间传输(如Feign的使用)

4 业务相关

BO(Business Object)

BO是 Business Object 的缩写,用于表示一个业务对象。BO 包括了业务逻辑,常常封装了对 DAO、RPC 等的调用,可以进行 PO 与 VO/DTO 之间的转换。BO 通常位于业务层,要区别于直接对外提供服务的服务层:BO 提供了基本业务单元的基本业务操作,在设计上属于被服务层业务流程调用的对象,一个业务流程可能需要调用多个 BO 来完成。

5 应用与案例

应用

不同类型的对象在架构设计中用于不同的用途,如下的分层架构表示了各个 POJO 的用途。为什么要在分层架构中,定义这些 POJO 对象呢?主要是为了确保各个分层能够很好地封装自己的服务,有效地控制信息的传播。
image.png

案例

以一个实例来探讨下 POJO 的使用。
假设我们有一个面试系统,数据库中存储了很多面试题,通过 web 和 API 提供服务。可能会做如下的设计:
数据表:表中的面试题包括编号、题目、选项、答案、创建时间、修改时间;
PO:包括题目、选项、答案、创建时间、修改时间;
VO:题目、选项、答案、上一题URL、下一题URL;
DTO:编号、题目、选项、答案、上一题编号、下一题编号;
DAO:数据库增删改查方法;
BO:业务基本操作。
可以看到,进行 POJO 划分后,我们得到了一个设计良好的架构,各层数据对象的修改完全可以控制在有限的范围内。