Java中的VO,BO,PO,DO,DTO
随着现在后端编程标准化程度越来越高,各种编程模型层出不穷。作为Java开发人员,大部分人不免要接触VO,BO,PO,DO,DTO之类的,但很多人对这些概念一直以来都是云里雾里,团队开发过程中也总是处于混乱的状态,抓起来就用,本来是规范性的东西,却反而导致更加混乱了。
今天我们把这些概念掰开揉碎来讲解一下,力求有一个清晰的理解,在开发中能有所助益。文中又理解不到位的,也欢迎大家斧正。
概念
- VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
- DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,更符合泛指用于展示层与服务层之间的数据传输对象。
- BO(Business Object):业务对象,把业务逻辑封装为一个对象,这个对象可以包括一个或多个其它的对象。
- PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
- DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
如果光看这些概念,可能大部分人都理解,但还是很绕,具体用的时候还是不能很好区分,我们来横向做个比较,理解会加深一些。
易混点一:VO和DTO
首先VO是最常用的,但对于这个概念,网上也是众说纷纭,value object 或 view object,一般说视图对象或者值对象,我更倾向理解为视图对象。说白了它就是展示用的,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看到的,我们就把它封装为VO。
VO比较容易混淆的是DTO,DTO是展示层与服务层之间传递数据的对象,可以这样说,对于绝大部分的应用场景来说,DTO和VO的属性值基本是一致的,而且他们通常都是POJO,那么既然有了VO,为什么还需要DTO呢?
我们举例来说明一下:
某公司有一个后台服务,服务层有一个getUser的方法返回一个系统用户,包含sex(性别)、年龄。对于服务层来说,DTO只从语义上定义,可能是这样的:
{"gender":"男","age":35
}
但这个服务同时供多个客户端使用(不同门户),而不同的客户端对于表现层的要求有所不同,比如管理端要求显示准确的年龄,而应用端为了保护客户隐私,只需要显示一个年龄段即可。
管理端VO:
{"gender":"男","age":35
}
应用端VO:
{"gender":"男","age":30~40
}
从这个例子可以看出,DTO很有存在的必要,根据职责单一原则,服务层只负责业务,与具体的表现形式无关,DTO不应该出现与表现形式的耦合,DTO定义的是原始数据,VO再对DTO数据进行解释。这下VO和DTO用法就清晰很多了。
易混点二:BO和PO
PO是持久对象,这个很好理解,就是实体和数据库字段的对应,一个PO的数据结构对应着库中表的结构,表中的一条记录就是一个PO属性,大多数情况下,PO仅仅作为PO只是用来增删改使用。
PO比较容易混淆的是BO,BO是业务对象,对应的是某个具体的业务块,可以包含多个属性、对象。简单点来说,我们可以把BO看作是PO的组合。
我们举例来说明一下:
PO-1是交易记录对象,PO-2是登录记录对象,PO-3是商品浏览记录对象,PO-4是添加购物车记录对象,PO-5是搜索记录对象,BO是个人网站行为对象,BO对象:{PO-1;PO-2;PO-3;PO-4;PO-5}。这样做的优点不言而喻,维护代码的时候查看BO,就能知道这块逻辑涉及多少表(PO)。
易混点三:BO和DTO
搞清楚了BO和PO各自的用途后,我们会发现BO和DTO有重叠功能,一样可以对PO进行排列组合,那BO的存在的意义是什么呢?
从用途上进行根本的区别,BO是业务对象,DTO是数据传输对象,虽然BO也可以排列组合数据,但它的功能是对内的,比如上个例子中的BO对象包括{PO-1;PO-2;PO-3;PO-4;PO-5}还有其他字段属性,但在提供对外接口时,BO对象中的某些属性对象可能用不到或者不方便对外暴露,那么此时DTO只需要在BO的基础上,抽取自己需要的数据,然后对外提供。
在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成。
DO
DO是领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。事实上,DO和PO在绝大部分情况下是一一对应的。阿里巴巴的开发手册中的定义DO等同于PO,即与数据库表结构一一对应,通过DAO层向上传输数据源对象。
上一张图,更加直观的展示这些名词使用的节点:
总结
VO,BO,PO,DTO这样分层还是很有意义的。尤其在团队成员较多的情况下,结构更加一目了然,同时也能很大程度避免多端系统数据所需不一致时,有人修改属性影响其他页面。但也完全没有必要教条主义,把这些全部用上,需要根据所开发的业务复杂度来取舍,如果本身业务逻辑不负责,照搬全上反而让开发变的更复杂。
例如业务不复杂,根本没有多端展示的差异化,VO可以直接拿掉,直接使用DTO传输到前端数据即可。
同时在使用过程中,最重要的是要在团队中达成共识,概念一致,如果使用了这些,但各按各的理解来,甚至抓起来就直接用,反而会让代码变得更乱,还不如直接POJO、DTO打天下。
另附这些概念命名规范:
- 数据对象:xxxPO,xxx即为数据表名。(也可DO)
- 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
- 展示对象:xxxVO,xxx一般为网页名称。
- 业务对象:xxxBO,xxx是业务名称。
Java中的VO,BO,PO,DO,DTO相关推荐
- VO BO PO DO DTO DAO POJO概念及区别
VO BO PO DO DTO DAO POJO 概念及区别 1.VO( value object) 即值对象 VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看 ...
- java web分层和层间数据传递 vo bo po (转载)
还记得97年左右开始的胖客户机和瘦客户机之争吗?之后又是CS和BS之争,然后又是两层和多层之争...,十年之后的今天我们再回过头看这些争论,一切似乎看起来都那么理所应当:程序怎么能不分层啊?可是再想一 ...
- java web分层和层间数据传递 vo bo po
还记得97年左右开始的胖客户机和瘦客户机之争吗?之后又是CS和BS之争,然后又是两层和多层之争...,十年之后的今天我们再回过头看这些争论,一切似乎看起来都那么理所应当:程序怎么能不分层啊?可是再想一 ...
- 转贴一个关于DTO DAO VO BO PO POJO的^_^
DTO DAO VO BO PO POJO- - potian 写道: 辨别一些名词: 1.VO:实际上很模糊,通常指ValueObject和ViewObject 2. ViewObject,界面展现 ...
- POJO/DTO/DO/EO/VO/BO/PO/AO的含义和使用
关于POJO/DTO/DO/EO/VO/BO/PO/AO 本文讨论 POJO/DTO/DO/EO/VO/BO/PO/AO 的定义,另外讨论了这些xO在controller.service.dao/ma ...
- vo、po、dto、bo、pojo、entity、mode如何区分
Java Bean:一种可重用组件,即"一次编写,任何地方执行,任何地方重用".满足三个条件 类必须是具体的和公共的 具有无参构造器 提供一致性设计模式的公共方法将内部域或暴露成员 ...
- bo JAVA是什么意思_entity、bo、vo、po、dto、pojo如何理解和区分?
Java开发过程中,基本实体类包都以entity或者model来称呼,可是不少项目中,却以Bo.Vo来命名,面试的时候,也有可能被问到这些问题.那么,这几者分别代表什么意思呢? Entity 最常用实 ...
- java中各种vo举例_了解JAVA中的POJO,Entity,PO,VO,DTO,DM包括代码举例展示
标签: 首先是从概念上来说 POJO,全称Plain Ordinary Java Object,我理解为极其单纯的Java对象 一般只有属性字段,无参构造以及get和set方法,也是指那些没有从任何类 ...
- java中的vo 、dto 、dao--转
原文地址:http://yinchunjian.iteye.com/blog/758196 O是跟数据库里表的映射,一个表对应一个VO DAO是用VO来访问真实的表,对数据库的操作都在DAO中完成 ...
最新文章
- JQuery中的queue()及dequeue()
- SimpleDateFormat和DateFormat类不是线程安全的。
- python3中异常处理_python中的五种异常处理机制介绍|python3教程|python入门|python教程...
- 3-V2-类和对象 -- const内联 静态成员 友元
- [ NOIP 1998 ] TG
- linux 窗口管理器_您最喜欢的Linux窗口管理器是什么?
- 2013q3 android ios 用户接入网络方式pv占比分布,2012年移动互联网发展分析.pdf
- matlab画爱心代码分享
- different intergers
- 模仿笔迹最好的软件_模仿签名代写签字行业进入战国时代,乱战模式开启!
- 深度学习TF—8.经典CNN模型—LeNet-5、VGG13、AlexNet、GoogLeNet、ResNet、DenseNet
- [2019杭电多校第四场][hdu6623]Minimal Power of Prime
- Python: 爬虫与一个好美国股票数据网站---英为财情,
- 新装的电脑没有打开图片的软件怎么办?教你打开Windows照片查看器
- Android:如何优雅的开发马甲包?
- MSDC 4.3 接口规范(10)
- 【web前端特效源码】使用HTML5+CSS3+JavaScript制作一个扁平化风格css螃蟹图形~~适合初学者~超简单~ |前端开发|IT软件
- iOS新知识学习之React Native开发工具集
- Mac(Big Sur系统)安装tunnelblick(vpn)步骤
- java 多个PDF合成一个