Java 后端开发中的VO,DO,DTO到底是什么

在日常Java后端开发中,经常会接触到VO,DO,DTO等概念,在这里总结一下他们分别代表的含义以及正确使用姿势。

简单总结:在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应于数据库中存储的数据(数据表),DTO对应于除二者之外需要进行传递的数据。

概念

VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。表现层对象。通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不。这根据业务的需要而定。对于页面上要展示的对象,可以封装一个VO对象,将所需数据封装进去。

DTO(Data Transfer Object):数据传输对象,主要用于远程调用等需要大量传输对象的地方。这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。

比如一张表有 100 个字段,那么对应的 PO 就有 100 个属性。 但是界面上只要显示 10 个字段, 客户端用 WEB service 来获取数据,没有必要把整个 PO 对象传递到客户端,
这时就可以用只有这 10 个属性的 DTO 来传递结果到客户端,这样也不会暴露服务端表结构 . 到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为 VO。

DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。PO是一些属性,以及set和get方法组成。一般情况下,一个表对应一个PO,直接与操作数据库的crud相关。

模型

下面以一个时序图建立简单模型来描述上述对象在三层架构应用中的位置

  • 用户发出请求(可能是填写表单),表单的数据在展示层被匹配为VO。

  • 展示层把VO转换为服务层对应方法所要求的DTO,传送给服务层。

  • 服务层首先根据DTO的数据构造(或重建)一个DO,调用DO的业务方法完成具体业务。

  • 服务层把DO转换为持久层对应的PO(可以使用ORM工具,也可以不用),调用持久层的持久化方法,把PO传递给它,完成持久化操作。

  • 对于一个逆向操作,如读取数据,也是用类似的方式转换和传递,略。

     

总结

  • VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
  • DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,更符合泛指用于展示层与服务层之间的数据传输对象。
  • BO(Business Object):业务对象,把业务逻辑封装为一个对象,这个对象可以包括一个或多个其它的对象。
  • PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
  • DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

项目中的实体类

项目中常见的实体类有VO,DO和DTO,命名规则也常是以相应字符串结尾,如*VO.Java。但是DTO不总是遵循这个规则,而通常与他的用途有关,如写成*Query.Java,表示存储了一个查询条件。项目中实体类出现的业务层次也没有这么严格,例如我们可以在视图层就组装一个DO,也可以将一个VO从持久层传出来,所以与业务分层相关联的划分方法显得有些冗余。从项目代码中抽象出的理解是:VO对应于页面上需要显示的数据,DO对应于数据库中存储的数据,DTO对应于除二者之外需要进行传递的数据。

微信关注

编程那点事儿

阅读剩余
THE END