在深入學習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負責數據之間的共享。