提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- VO、DTO、DO、BO
- 1.概念
- 阿里Java开发手册分层领域模型:
- 2. VO 和 DTO 使用场景
- 以下是一个使用VO和DTO的典型案例:
- 3.BO和DTO的区别
- 案例
VO、DTO、DO、BO
- POJO的定义是无规则简单的对象,在日常的代码分层中pojo会被分为VO、BO、 PO、DTO。通过各层POJO的使用,有助于提高代码的可读性和可维护性。
概念看似简单,但是想区分好或者理解好也不容易
1.概念
-
Pojo(Plain Ordinary Java Object):纯的传统意义的java对象 最基本的javaBean只有属性加上属性的get和set方法。Pojo可以转化为PO、DTO、VO。比如POJO在传输过程中就是DTO。
-
VO (View Object),用于表示一个与前端进行交互的视图对象,它的作用是把某个指定页面(或组件)的所有数据封装起来。实际上,这里的VO只包含前端需要展示的数据,对于前端不需要的数据,比如数据创建和修改的时间等字段,出于减少传输数据量大小和保护数据库结构不外泄的目的,不应该在VO 中体现出来。
-
DTO(Data Transfer Object),用于表示一个数据传输对象,DTO通常用于展示层(Controller)和服务层(Service)之间的数据传输对象。DTO 与 VO概念相似,并且通常情况下字段也基本一致。但 DTO 与 VO 又有一些不同,这个不同主要是设计理念上的,比如 API 服务需要使用的 DTO 就可能与 VO 存在差异。
-
DO(Data Object) ,持久化对象,它跟持久层(Dao)的数据结构形成一一对应的映射关系。如果持久层是关系型数据库,那么数据库表中的每个字段就对应PO的一个属性,常是entity实体类。
-
DAO(Data Access Object):数据访问对象 是sun公司的一个标准j2ee设计模式的接口之一,负责持久层的操作。Dao和其他的O区别最大,基本没有互相转化的可能性和必要,主要用来封装对数据的访问,而不是对数据库的访问。
-
PO(Persistant Object):持久层对象,对应数据库中表的字段,数据库中表中的记录在java对象中的显示状态,即一个PO就是数据库中的一条记录。
-
BO(Business Object):业务对象,就是从现实世界中抽象出来的有形或无形的业务实体。
阿里Java开发手册分层领域模型:
2. VO 和 DTO 使用场景
在软件开发中,VO和DTO都是常见的数据传输对象,但它们的使用场景有所不同。
VO(View Object)
- 通常用于与前端交互,封装前端调用某个接口之后所需的所有数据
- 在前后端分离的时代,VO主要应用于表示视图层的类。
DTO(Data Transfer Object)
-
则主要应用于数据传输层,特别是在Controller层和Service层。
-
在Controller层,DTO用于接收参数,无论是单个参数还是多个参数,都可以通过创建一个DTO对象来进行接收。
-
使用DTO传参相比使用注解(@RequestParam等)具有更高的可读性和维护性。在Service层,处理复杂的逻辑后,将处理好的DTO进行copyBean即可无伤转换为持久化对象(Bo)。
总的来说,VO和DTO都是为了实现程序中的数据传输和交互,但它们的使用场景不同。前端与后端交互时,使用VO;而在服务层之间传输数据时,使用DTO。
以下是一个使用VO和DTO的典型案例:
假设你正在开发一个电子商务网站,用户可以在网站上购买商品。在这个场景中,你可以创建以下对象:
- UserVO:这是一个视图对象,用于展示用户信息。它可能包括用户名、电子邮件、地址等信息。这个对象主要用于前端页面,例如用户登录页面和购物车页面。
- UserDTO:这是一个数据传输对象,用于在服务层之间传输用户数据。它可能包括用户ID、用户名和购买商品的数量等信息。这个对象主要用于在Controller层和Service层之间传输数据,例如在用户提交订单时,Controller层会将UserDTO传递给Service层进行处理。
在前端页面上,例如用户登录页面,你可能会创建一个表单,用户需要输入用户名和密码。当用户提交表单时,前端会将用户输入的数据传递给后端。在后端,Controller层会接收到一个UserDTO对象,该对象包含用户输入的用户名和密码等信息。然后,Controller层将UserDTO传递给Service层进行处理。
在Service层,Service层会根据业务逻辑对UserDTO进行处理,例如验证用户名和密码是否正确,并返回一个UserDTO表示处理结果。如果验证失败,UserDTO将包含错误信息,例如“用户名或密码不正确”。然后,Controller层将根据返回的UserDTO做出相应的处理,例如显示错误信息给用户。
在整个过程中,前端只需要关心UserVO对象,而服务层只需要关心UserDTO对象。因此,通过使用VO和DTO,你可以实现前端和后端的解耦,使程序更加清晰和易于维护。
3.BO和DTO的区别
主要区别为字段的删减
- BO对内,为了进行业务计算,需要辅助数据,或者是一个业务有多个对外的接口,BO可能会含有很多接口对外所不需要的数据,因此DTO需要在BO的基础上,只要自己需要的数据,然后对外提供在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成。
案例
有一个博客系统,数据库中存储了很多篇博客。我们会做如下设计:
-
数据库表:表中的博客包括编号、博客标题、博客内容、博客标签、博客分类、博客状态、创建时间、修改时间等。
-
PO:包括编号、博客标题、博客内容、博客标签、博客分类、博客状态、创建时间、修改时间等。(与数据库表中的字段一样。)
-
VO:在客户端浏览器展示的页面数据,博客标题、博客内容、博客标签、博客分类、创建时间、上一篇博客URL、下一篇博客URL。
-
DTO:在服务端数据传输的对象,编号、博客标题、博客内容、博客标签、博客分类、创建时间、上一篇博客编号、下一篇博客编号。
-
DAO:数据库增删改查的方法,例如新增博客、删除博客、查询所有博客、更新博客。
-
BO:基本业务操作,如管理分类、管理标签、修改博客状态等,是我们常说的service层操作。