在深入学习MapStruct之前,我们先设想下实体转换场景,在一般的实体转换的场景下,我们需要考虑一下的问题:
1、字段名称之间的映射,比如:Person实体中的name属性需要映射到PersonDto实体中的name属性
2、属性值之间的映射,比如:Person实体中age属性为short,PersonDto实体中的age属性为int。两个类型之间的转换存在数据的缺失
3、空值问题
4、类的聚合问题。比如Person中还有country实体,两个实体间的country怎么映射
5、部分属性之间不想被映射:比如deptName不需要转换
@Data public class Person{ String name ; short age ;
String deptName ;
Country country; }
@Data public class PersonDto{ String name ; int age ;
Country country; }
MapStruct具有强大的注解,我们通过注解均可以解决上述问题。
@Mapper public interface SourceTargetMapper { @Mapping(source = "name",target = "name") @Mapping(source = "age",target = "age") @Mapping(target = "deptName" , ignore = true) PersonDto toDto(Person person); }
编译完成后,MapStruct会自动生成代码,方便我们调试程序,我们在target中可以找到相应的程序代码。
Mapper注解:表示这个接口做为一个转换器,Mapping:表示字段之间的映射关系。当然框架中还有更多的注解,下面是我做的思维导图。
下面是对MapStruct的注解做的思维导图,方便对此框架的理解。
重点介绍下:BeforeMapping 、 AfterMapping 、 ObjectFactory 、Context
1、BeforeMapping、AfterMapping:表示的是转换动作之前或是之后需要执行的动作
2、ObjectFactory:由于我们转换到目标对象,一般执行都是目标对象的默认构造函数。此方法帮助我们生成一个对象
3、Context:我们在转换动作之前或是之后需要执行一系列的动作,那么数据怎么传送。context负责数据之间的共享。