一、MapStruct
1.1何为MapStruct
要说这个东西,其实和我们刚刚讲到的Lombok相类似。其是由我们的源代码加上MapStruct经过编译后得到.class文件,文件中自动补全了代码。那么补全了什么代码?实现了什么功能?
MapStruct的产生,我们还需要看看在这之前的一些情况。对于我们的不同JavaBean之间在项目开发时总会涉及到相互转化。PO、DTO、VO之间。
方式一:BeanUtil.copyProperties:浅拷贝(相同引用、属性、名称限制、需要get、set方法、慢等)。
方式二:纯纯get、set、也可以builder,慢,冗余。
MapSturct 是一个生成类型安全, 高性能且无依赖的 JavaBean 映射代码的注解处理器(annotation processor)。
1.2添加MapStruct
导入依赖:
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.6.0.Beta1</version>
</dependency>
而在我使用的过程中发现,Lombok和MapStruct会发生版本冲突。解决:在pom.xml中配置。
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.6.0.Beta1</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugins>
如此,我们就可以同时使用Lombok和MapStruct。
1.3使用MapStruct
1.3.1简单拷贝(dto2vo、vo2dto)
步骤一:创建Mapper接口,加上@Mapper注解(注意是MapStruct包下的注解)
步骤二:书写转换方法。
步骤三:实践。
1.3.2交给IoC、创建单例
1.3.3不同字段之间的映射
@Mappings和@Mapping注解
1.3.4多对象转一个对象
- 当多个对象中, 有其中一个为 null, 则会直接返回 null
- 如一对一转换一样, 属性通过名字来自动匹配。 因此, 名称和类型相同的不需要进行特殊处理
- 当多个原对象中,有相同名字的属性时,需要通过 @Mapping 注解来具体的指定, 以免出现歧义(不指定会报错)。