DO、DTO、BO、AO、VO、POJO定义和转换的正确姿势
一、引言
DO、DTO、BO、AO、VO、POJO的概念看似简单,但是想区分好或者理解好也不容易,本文简单梳理一下。
通过各层POJO的使用,有助于提高代码的可读性和可维护性。
------------------------------------------------------------------------------------------------------------------------------------------------------
二、区别
《阿里巴巴Java开发规范》关于领域模型的部分介绍如下:
分层领域模型规约:
DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。
BO(Business Object):业务对象,由 Service 层输出的封装业务逻辑的对象。
AO(ApplicationObject):应用对象,在Web层与Service层之间抽象的复用对象模型, 极为贴近展示层,复用度不高。
VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
Query:数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止
使用 Map 类来传输。
------------------------------------------------------------------------------------------------------------------------------------------------------
最难理解的是BO,大致这么理解:
BO这个对象可以包括一个或多个其它的对象。
比如一个简历,有教育经历、工作经历、社会关系等等。
我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。
建立一个对应简历的BO对象处理简历,每个BO包含这些PO。这样处理业务逻辑时,我们就可以针对BO去处理。
------------------------------------------------------------------------------------------------------------------------------------------------------
大致的示例代码:
Controller层
public List<UserVO> getUsers(UserQuery userQuery);
此层常见的转换为:DTO转VO
Service层、Manager层
// 普通的service层接口
List<UserDTO> getUsers(UserQuery userQuery);
然后在Service内部使用UserBO封装中间所需的逻辑对象
// 来自前端的请求
List<UserDTO> getUsers(UserAO userAo);
此层常见的转换为:DO转BO、BO转DTO
DAO层
List<UserDO> getUsers(UserQuery userQuery);
------------------------------------------------------------------------------------------------------------------------------------------------------
三、各种对象该怎么转换?
那么这里又涉及到另外一个问题,各种对象转换该怎么办呢?
常见的写一个转换方法,然后手动调用get/set方法,属性太多非常痛苦,容易遗漏或者重复,而且效率非常低下。
推荐两种方式:
(1)一种是通过IDEA插件实现快速自动生成转换代码.
如Generate All setters插件,参见https://blog.csdn.net/w605283073/article/details/89163627
定义好参数和返回值,使用快捷方式可以轻松生成转换的代码。
(2)一种是通过第三方转换库来转换。
Apache org.apache.commons.beanutils.PropertyUtils.copyProperties
Apache org.apache.commons.beanutils.BeanUtils.copyProperties
Spring org.springframework.beans.BeanUtils.copyProperties
Cglib BeanCopier
Dozer
orika
对应的maven依赖(已经给出了maven地址,建议用最新版本)
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.6.RELEASE</version>
</dependency> <!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.11</version>
</dependency> <!-- https://mvnrepository.com/artifact/net.sf.dozer/dozer -->
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency> <!-- https://mvnrepository.com/artifact/ma.glasnost.orika/orika-core -->
<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<version>1.5.4</version>
</dependency>
从效率来讲,读过其他文章,综合而言cglib应该最高,其次是orika。
因为
cglib用的是asm,直接操作内存对象的字节码增强技术。
orika用的是javassist, 通过动态字节码生成实现对象转换。
具体用法在这里就不介绍了,需要的话去官网看看文档也可以去github看下demo。
我的看法:
第二种代码实现对象转换简洁并且功能强大,但是我个人非常推崇第一种写转换方法的方式,因为这种方式对象属性改变可以直观反映到代码上,也可以避免因为粗心和增删属性等出现的莫名其妙的错误。
————————————————
版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/w605283073/article/details/89715188
DO、DTO、BO、AO、VO、POJO定义和转换的正确姿势的更多相关文章
- 阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义
分层领域模型规约: DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象. DTO( Data Transfer Object):数据传输对象,Service或Ma ...
- Java中PO、BO、VO、DTO、POJO、DAO概念及其作用和项目实例图(转)
PO(bean.entity等命名): Persistant Object持久对象,数据库表中的记录在java对象中的显示状态 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作 ...
- 什么是DO / DTO / BO / VO /AO ?
转载:https://blog.csdn.net/ouzhuangzhuang/article/details/86644476 POJO 是 DO / DTO / BO / VO 的统称. DO(D ...
- PO、BO、VO、DTO、POJO、DAO的区别
PO: 基本上就是Entity了 persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. ---- ...
- vo bo po dao pojo dto
Recommended for you: Get network issues from WhatsUp Gold. Not end users. DAO: Data access object d ...
- JAVA vo pojo javabean dto区别
JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性 ...
- JAVA vo pojo javabean dto的区别
JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性 ...
- 什么是DO,DTO,VO,POJO
俗话说,没有规矩不成方圆,今天来说一下 Java 中的各种 O(bject). 为什么会出现这些 O? 我们知道,这些 O 不管叫什么名字,其本质都还是对象(Object),既然本质都一样,为什么非要 ...
- Java 中的PO VO DTO BO
PO 持久对象,数据: BO 业务对象,封装对象.复杂对象 ,里面可能包含多个类:DTO 传输对象,前端调用时传输 :VO 表现对象,前端界面展示. 当你业务足够简单时,一个POJO 也完全当做PO ...
- ArcGIS中的坐标系定义与转换 (转载)
原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念: GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐 ...
随机推荐
- 正确处理 CSV 文件的引号和逗号
CSV(Comma-Separated Values,逗号分割值),就是用纯文本的形式存储表格数据,最大的特点就是方便. 作为开发,我们经常面临导数据的问题,特别是后台系统,产品或者运营的同事常常会提 ...
- [Spring+SpringMVC+Mybatis]框架学习笔记(五):SpringAOP_顾问
上一章:[Spring+SpringMVC+Mybatis]框架学习笔记(四):Spring实现AOP 下一章:[Spring+SpringMVC+Mybatis]框架学习笔记(六):Spring_A ...
- 结合ReentrantLock来看AQS的原理
AQS的定义 队列同步器 AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个 int 成员变量表示同步状态,通过内置的 F ...
- Jenkins-Pipline实现原理
Jenkins-Pipline原理 本文仅探讨jenkins pipline 的原理,是流水线的一个demo版本实现,不能代表Jenkins pipline的具体实现,仅供参考. 1. Jenkins ...
- RocketMq消费原理及源码解析
消费原理概览 先简单说下常见的rocketMq的部署方式,上图中broker为真正计算和存储消息的地方,而nameServer负责维护broker地 图中右侧consume message部分即是本文 ...
- nlp入门(三)基于贝叶斯算法的拼写错误检测器
源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (gitee.com) 数据来源:norvig.com/big.txt 贝叶斯原理可看这里:机器学习算法学习笔记 - 过客匆匆,沉沉浮浮 ...
- python实现在函数中捕获某个异常,然后将异常的具体信息写入error.txt文件中;
在程序开发中,如果对某些代码的执行不能确定(程序语法完全正确) 可以增加try来捕获异常 try这个关键字来捕获异常try:尝试执行的代码except:出现错误的处理 def func(): try: ...
- 服务端不回应客户端的syn握手,连接建立失败原因排查
背景 测试环境有一个后台服务,部署在内网服务器A上(无外网地址),给app提供接口.app访问这个后台服务时,ip地址是公网地址,那这个请求是如何到达我们的内网服务器A呢,这块我咨询了网络同事,我画了 ...
- Java应用堆外内存泄露问题排查
问题是怎么发现的 最近有个java应用在做压力测试 压测环境配置: CentOS系统 4核CPU 8g内存 jdk1.6.0_25,jvm配置-server -Xms2048m -Xmx2048m 出 ...
- ubuntu/linux 好用的截图工具 搜狗输入法自带的截图快捷键,自己觉得不方便的话,修改为自己习惯的快捷键即可
公司要求使用ubuntu开发,在安装完必要得开发工具之后,按照我在windows平台的习惯,就准备安装一个好用的截图工具了,我比较推荐的是snipaste([https://zh.snipaste.c ...