
前言Java 里有很多“欧”这些“欧”看得一头雾水先对齐一下颗粒度做个名词黑话解释翻译成人话。POPersistant ObjectPersistant Object 持久对象。用于表示数据库中的一条记录映射成的 java 对象。仅仅用于表示数据没有任何数据操作。因为要和数据库表字段对应所以类中应该都是基本数据类型和String而不是更复杂的类型。可以理解是一个PO就是数据库中的一条记录。通常遵守 Java Bean 的规范拥有 getter/setter 方法。DOData ObjectData Object 数据对象。数据对象与数据库表结构一一对应通过 DAO 层向上传输数据对象属性和 PO 中的基本一致。看了很多文章社区也有很多人回答发现 PO 和 BO 一般用一个就行了传统意义上命名为 PO如果编程风格上往 DDD 靠拢就命名成 DO。名字不同而已没什么大的讲究。BOBusiness ObjectBusiness Object 业务对象。较复杂的业务对象会参与业务逻辑的处理操作里面可能包含多个类主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。例如用户可以拥有宠物在这里把用户对应一个 PO、宠物对应一个 PO那么建立一个对应的 BO 对象来处理用户和宠物的关系每个 BO 都包含用户 PO 和宠物 PO而处理逻辑时针对 BO 去处理。通常遵守 Java Bean 的规范拥有 getter/setter 方法。例如注User 和 Pet 都是 PO 对象但会放进 BO 中形成一个复杂的业务对象public class UserPetBO { private User user; private Pet pet; public UserPetBo() { } }再补充一点BO 包括了业务逻辑常常封装了对 DAO、RPC 等的调用可以进行 PO 与 VO/DTO 之间的转换。通常位于 Service 层但要区别于直接对外提供服务的服务层BO 提供了基本业务单元的基本业务操作在设计上属于被服务层业务流程调用的对象。一个业务流程可能需要调用多个 BO 来完成。VOView ObjectView Object 视图对象。VO 对象主要用于前端界面显示的数据是与前端进行交互的 Java 对象。为什么不用 PO 传递数据呢因为PO 包括数据库表中的所有字段对于前端来说我们只需要显示一部分字段就可以了例如我们的用户表 user 中的 password 字段是没有必要也不能显示在前端界面的。通常遵守 Java Bean 的规范拥有 getter/setter 方法。DTOData Transfer ObjectData Transfer Object 数据传输对象。数据传输对象是在传递给前端时使用的如一张表有 100 个字段那么对应的 PO 就有 100 个属性但是我们的前端界面只需要显示 10 个字段所以我们没必要把所有字段的 PO 对象传递到客户端我们只需要把只有这 10 个属性的 DTO 对象传递到客户端不会暴露服务端的表结构到达客户端后如果这个对象用于界面表示那么它的身份就是 VO 对象。DTO 和 VO 概念相似通常情况下字段也基本一致。但有所不同DTO 表示一个数据传输对象是在服务端用于不同服务或不同层之间的数据传输例如 DAO 层到 Service 层Service 层到 Controller 层而VO是在客户端浏览器显示的表现对象用于在浏览器界面数据的显示。但 DTO 除了可以充当 VO 的功能把数据传递给客户端以外又有一些不同它涉及的面更广。上面说的是DAO 层 - Service 层 - Controller 层那么反过来呢比如在 Controller 层传递到 Service 层这里 DTO 也可以作为传输对象。通常遵守 Java Bean 的规范拥有 getter/setter 方法。DAOData access objectData access object 数据访问对象。虽然名字也带“欧”但和上面几个“欧”区别最大基本没有互相转化的可能性和必要。主要用来封装对数据库的访问例如 UserDao 封装的就是对 user 表的增删改查操作。通过它可以把 POJO 持久化为 PO用 PO 组装出来 VO、DTO。DAO 一般在持久层完全封装数据库操作对外暴露的方法的使得上层不需要关注数据库的相关信息只需要插入、删除、更新、查询即可。POJOPlain ordinary java object 简单java 对象。表示一个个简单的 Java 对象PO、VO、DTO 都是典型的 POJO。DAO 和 BO 一般不是 POJO只是提供了一些调用方法。案例说明有一个博客系统数据库中存储了很多篇博客。我们会做如下设计数据库表表中的博客包括编号、博客标题、博客内容、博客标签、博客分类、博客状态、创建时间、修改时间等。PO包括编号、博客标题、博客内容、博客标签、博客分类、博客状态、创建时间、修改时间等。与数据库表中的字段一致VO在客户端浏览器展示的页面数据博客标题、博客内容、博客标签、博客分类、创建时间、上一篇博客URL、下一篇博客URL。DTO在服务端数据传输的对象编号、博客标题、博客内容、博客标签、博客分类、创建时间、上一篇博客编号、下一篇博客编号。DAO数据库增删改查的方法例如新增博客、删除博客、查询所有博客、更新博客。BO基本业务操作如管理分类、管理标签、修改博客状态等是我们常说的 Service 层操作。总结引用网上的一张图来表示各个“欧”之间的传递关系。 福利时间如果你正在备战面试或者想要学习其他知识给大家推荐一个宝藏知识库作者整理了一些列 Java 程序员需要掌握的核心知识有需要的自取不谢。知识库地址https://farerboy.com/