前言
在我们日常开发的分层结构的应用程序中,为了各层之间互相解耦,一般都会定义不同的对象用来在不同层之间传递数据,因此,就有了各种 XXXDTO
、XXXVO
、XXXBO
等基于数据库对象派生出来的对象,当在不同层之间传输数据时,不可避免地经常需要将这些对象进行相互转换。
此时一般处理两种处理方式:① 直接使用 Setter
和 Getter
方法转换、② 使用一些工具类进行转换(e.g. BeanUtil.copyProperties
)。第一种方式如果对象属性比较多时,需要写很多的 Getter/Setter
代码。第二种方式看起来虽然比第一种方式要简单很多,但是因为其使用了反射,性能不太好,而且在使用中也有很多陷阱。而今天要介绍的主角 MapStruct 在不影响性能的情况下,同时解决了这两种方式存在的缺点。
介绍
MapStruct
是一个代码生成器,它基于约定优于配置方法极大地简化了 Java bean
类型之间映射的实现。自动生成的映射转换代码只使用简单的方法调用,因此速度快、类型安全而且易于理解阅读,源码仓库 Github
地址 MapStruct。总的来说,有如下三个特点:
- 基于注解
- 在编译期自动生成映射转换代码
- 类型安全、高性能、无依赖性
使用
① 引入依赖
org.mapstructmapstruct1.5.2.Finalorg.mapstructmapstruct-processor1.5.2.Final
② 创建相关转换对象
1、实体类
2、DTO类
③ 创建转换器类(Mapper)
需要注意的是,转换器不一定都要使用 Mapper
作为结尾,只是官方示例推荐以 XXXMapper
格式命名转换器名称,这里举例的是最简单的映射情况(字段名称和类型都完全匹配),只需要在转换器类上添加 @Mapper
注解即可,转换器代码如下所示
启动程序
我去,怎么编译不了,启动失败
不要慌,这是mapstruct版本问题,我们只需要配置一下IDEA就好了