Bean自动映射工具对比及VO、DTO、PO、DO对象之间的转换

简介: 在实际的开发过程中,常常遇到各个层之间对象转换,比如 VO、DTO、PO、DO 等,而如果都是手动set、get,一旦属性较多时,操作起来不仅麻烦,而且浪费时间,因此经常会使用一些工具类,进行对象之间的转换,下面将对象与对象之间转换的方式进行对比,一级对象间的使用进行总结。

一、在实际的开发过程中,各个层对象之间的转换是尤为常见的,一个好的转换工具在开发过程中不仅更为方便,而且对性能也是有影响的,如图,在开发过程中常用的一些转换方式。
image.png

1、get\set
image.png
这种方式也是日常使用的最多的,性能也是最高的。但是一旦对象的属性较多时,操作起来有点麻烦,因此在实际的开发中比较麻烦。
2、json2Json
image.png
把对象转JSON串,再把JSON转另外一个对象。
3、Apache copyProperties
image.png
Introspector机制获取到类的属性来进行赋值操作。
4、Spring copyProperties
image.png
反射的属性拷贝。
5、Bean Mapping
image.png
基于属性拷贝
6、Bean Mapping ASM
image.png
基于ASM字节码框架实现
7、BeanCopier
image.png
基于CGlib字节码操作生成get、set方法。
8、Orika
image.png
基于字节码生成映射对象
9、Dozer
image.png
属性映射框架,递归的方式复制对象。
10、ModelMapper
image.png
基于ASM字节码实现。
11、JMapper
image.png
基于映射,速度还可以,但操作起来比较麻烦
12、MapStruct
image.png

对象属性转换的操作无非是基于反射、AOP、CGlib、ASM、Javassist 在编译时和运行期进行处理,再有好的思路就是在编译前生成出对应的get、set,就像手写出来的一样。通过以上对接发现MapStruct用起来方便而且性能也是不错的。

二、在实际的开发中VO、DTO、DO、BO之间的转换也是常见的,对于这种这样的转换该怎样正确的使用呢,下面进行说明。
1.VO (View Object),表示一个与前端进行交互的视图对象,即用于某个接口返回前端页面的视图对象。

  (1)前到后: 用户发出请求,传递给后台controller接受的对象;
  (2)后到前:后端返回个前端的对象,可以 XXVO。

2.DTO(Data Transfer Object),用于表示一个数据传输对象,DTO 通常用于展示层(Controller)和服务层(Service)之间的数据传输对象。

  (XXController)把VO转换为服务层(XXServiceImpl)对应方法参数所要求的DTO,传送给服务层(XXServiceImpl)。

3.DO(Data Object) ,持久化对象,它跟持久层(Dao)的数据结构形成一一对应的映射关系。如果持久层是关系型数据库,那么数据库表中的每个字段就对应PO的一个属性,常是entity实体类。

服务层(XXServiceImpl)根据方法参数DTO的数据构造(或重建)出一个DO;然后,调用DO的业务方法完成具体业务。

4.BO(Business Object):业务对象,就是从现实世界中抽象出来的有形或无形的业务实体。

把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。

在开发过程中,有时为了偷懒或者方便,直接将DTO对象返回给前端,这样显得接口输出数据多余,和不安全性,dto作为数据传输对象一般是公用的,VO才是个性化,一旦前端说要说要增加或删字段返回给前端的dto对象 ,就会影响其他业务。因此,总整体性结构而言:vo是必须存在的,不能把dto直接返回给前端。高内聚,低耦合。
VO作为个性化视图对象,一般不建议复用。一般的数据传递是,前端传递VO给接口(Controller),接口将VO转为DTO传递给service,service将DTO分解为DO,调用领域服务进行调度,然后逆向转为VO或者其他的返回结果,传递给前台。
image.png

相关文章
|
存储 前端开发 Java
一文理解什么是DTO、VO、BO、PO、DO,并推荐一款IDEA转换插件
一文理解什么是DTO、VO、BO、PO、DO,并推荐一款IDEA转换插件
1631 0
一文理解什么是DTO、VO、BO、PO、DO,并推荐一款IDEA转换插件
|
设计模式 开发框架 前端开发
项目开发中,真的有必要定义VO,BO,PO,DO,DTO这些吗?
存在即是合理的,业务复杂,人员协同性要求高的场景下,这些规范性的东西不按着来虽然不会出错,程序照样跑,但是遵守规范会让程序更具扩展性和可读性,都是前辈血淋淋的宝贵经验,为什么不用?
|
设计模式 前端开发 Java
DTO和VO的区别及使用场景详解
DTO和VO的区别及使用场景详解
7187 1
|
前端开发 数据库 微服务
JavaWeb - 我们的开发规范(VO、DTO、BO、PO、DO、POJO)
JavaWeb - 我们的开发规范(VO、DTO、BO、PO、DO、POJO)
2106 0
JavaWeb - 我们的开发规范(VO、DTO、BO、PO、DO、POJO)
|
4月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 > Java系统属性 > application.properties > application.yml > application.yaml。
851 0
|
7月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,处理前后端日期交互是一个常见问题。本文通过 **@DateTimeFormat** 和 **@JsonFormat** 两个注解,详细讲解了如何解析前端传来的日期字符串以及以指定格式返回日期数据。文章从实际案例出发,结合代码演示两者的使用场景与注意事项,解决解析失败、时区偏差等问题,并提供全局配置与局部注解的实践经验。帮助开发者高效应对日期时间格式化需求,提升开发效率。
1941 2
|
SQL 缓存 安全
深入解析MyBatis-Plus LambdaQueryWrapper与QueryWrapper:高效数据查询的秘密
深入解析MyBatis-Plus LambdaQueryWrapper与QueryWrapper:高效数据查询的秘密
13651 2
|
JSON 安全 API
11条军规,让你的接口设计无可挑剔
后端工程师需重视接口设计,提供清晰规范的接口文档以节省合作时间,避免纠纷。关键点包括:1) 接口名称应直观明了;2) 接口路径规整,能反映接口功能;3) 使用恰当的请求方式(GET, POST, PUT, PATCH, DELETE);4) 提供详细接口说明和示例;5) 实施接口版本管理,更新文档以适应变更;6) 明确请求头信息;7) 关注接口安全,进行参数加密和授权;8) 编写测试案例和错误码定义,方便调用者理解和测试。
508 0
11条军规,让你的接口设计无可挑剔
|
JSON 数据格式
jackson使用@JsonSerialize格式化BigDecimal解决.00不显示问题
jackson使用@JsonSerialize格式化BigDecimal解决.00不显示问题
1167 0
|
Java API
Java反射(通过反射获取构造函数、方法、属性)
1.通过反射获取构造函数,2.通过反射获取方法,3.通过反射调用成员属性
751 0