Java注释处理器(Annotation Processor)是一种工具,用于在编译时处理Java源代码中的注解信息。作为Java编译器的一部分,负责扫描源代码中的注解,并根据这些注解生成额外的Java代码或执行其他与注解相关的操作。
当从数据库中查出来的PO对象中包含很多字段,但是在业务处理过程中需要处理的DTO包含PO中的部分字段,或者返回给前端的VO为DTO的部分字段,这就需要Class类转化,如果用构造器或者get()/set()方法,将会写大量冗余代码并且容易出错。
面对这样的场景,采用MapStruct插件处理类转换是一个绝佳的选择。
MapStruct是一个Java注释处理器,用于简化Java Bean映射(对象之间的数据转换)的过程。
它允许开发人员定义映射规则,并自动生成映射代码,从而减少手动编写重复的映射代码的工作量。
MapStruct的目标是提供高性能、类型安全和可维护的映射代码,以简化开发人员在对象之间进行数据转换。
以下是MapStruct的一些关键特性和用途:
注解驱动:MapStruct使用注解来定义映射规则,开发人员可以使用注解来指定源对象到目标对象的映射方式。
编译时生成代码:MapStruct在编译时生成映射代码,这意味着生成的代码是类型安全的,不会导致运行时的类型错误。(注意:编译时生成)
支持自定义映射方法:除了自动生成的映射代码外,开发人员还可以编写自定义映射方法,以处理更复杂的映射场景。
支持集合映射:MapStruct可以自动处理集合(如List、Set、Map等)之间的映射,从而简化了集合数据的转换。支持集合类
性能优化:生成的映射代码经过优化,以提高映射操作的性能。
支持多个目标对象:MapStruct可以将数据从一个源对象映射到多个不同类型的目标对象,从而提高代码的重用性。
一个典型的映射器接口
@Mapper
public interface SourceToTargetMapper {
SourceToTargetMapper INSTANCE = Mappers.getMapper(SourceToTargetMapper.class);
TargetTest toDTO(SourceTest st);
}
IDEA中搜索"MapStruct Support"插件,进行安装,安装成功后重启IDEA。
用法:
在编写映射关系target和source的过程中,按下代码提示键(我的是CTRL+ALT + /),能自动给出代码提示。
注意:这里原本的代码提示快捷键是CTRL+ENTER,但是和中文系统的输入法切换冲突,所以得换一下快捷键。更换快捷键
在参数上,按住 CTRL + 鼠标左键,能够自动进入参数所在类文件。
org.mapstruct
mapstruct
1.4.1.Final
org.mapstruct
mapstruct-processor
1.4.1.Final
provided
1、org.mapstruct:mapstruct:1.4.1.Final
:这是MapStruct框架的主要依赖。它包含了MapStruct的运行时库。
2、org.mapstruct:mapstruct-processor:1.4.1.Final
:这是MapStruct的注解处理器依赖。它是一个Maven的"provided"(提供的)依赖,这意味着它只在编译时需要,而不会包含在最终的构建输出中。MapStruct注解处理器负责在编译时扫描源代码,查找MapStruct的注解并生成映射代码。
注意:这两个库都要引入,避免报错
mapstruct和lombok同时使用,若没有指定编译顺序,mapstruct先编译,lombok后编译,get和set方法还没有编译出来,mapstruct当然无法通过get set去生成实现类,会报错。
在这种情况下要在Pom文件中指定编译顺序,具体如下:
org.apache.maven.plugins
maven-compiler-plugin
org.projectlombok
lombok
1.18.28
org.mapstruct
mapstruct-processor
1.4.1.Final
创建源类
package com.example.demo.entity;
import lombok.Data;
@Data
public class SourceTest {
Integer Id;
String Name;
}
创建目标类
package com.example.demo.entity;
import lombok.Data;
@Data
public class TargetTest {
Integer Id;
String Name;
}
创建转换器
package com.example.demo.Convert;
import com.example.demo.entity.SourceTest;
import com.example.demo.entity.TargetTest;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface SourceToTargetMapper {
SourceToTargetMapper INSTANCE = Mappers.getMapper(SourceToTargetMapper.class);
TargetTest toDTO(SourceTest st);
}
注意:这里引用的Mapper注解是org.mapstruct.Mapper,同时Mappers.getMapper()不写接收的变量时会爆红,当写完Instance后,正常。
@Test
void testConvert() {
Integer id = 9527;
String name = "mghio";
SourceTest st = new SourceTest();
st.setId(id);
st.setName(name);
TargetTest tt = SourceToTargetMapper.INSTANCE.toDTO(st);
System.out.println(id==tt.getId());
assertEquals(id, tt.getId());
assertEquals(name, tt.getName());
}
测试结果,相当于把原类型转换成了目标类型。测试通过。