Java實體映射工具MapStruct使用方法詳解
1.序
通常在后端開發(fā)中經(jīng)常不直接返回實體Entity類,經(jīng)過處理轉換返回前端,前端提交過來的對象也需要經(jīng)過轉換Entity實體才做存儲;通常使用的BeanUtils.copyProperties方法也比較粗暴,不僅效率低下(使用反射)而且僅映射相同名的屬性,多數(shù)情況下還需要手動編寫對應的轉換方法實現(xiàn)。
插件MapStruct以接口方法結合注解優(yōu)雅實現(xiàn)對象轉換,MapStruct生成器生成代碼以更貼近原生的Setter、Getter方法處理屬性映射更為高效。
https://github.com/mapstruct/mapstruct/
https://github.com/mapstruct/mapstruct-examples
2.簡單用例
實體對象User
@Data @AllArgsConstructor public class User { private int id; private String name; private int age; private String address; }
轉換對象UserVO
@Mapper public interface UserConvert { UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); @Mapping(source = "name", target = "userName") UserVO toVO(User entity); }
轉換接口
@Test public void contextLoads() { User user = new User(0, "Tester", 1, "上海市徐匯區(qū)"); UserVO userVO = UserConvert.INSTANCE.toVO(user); }
使用示例
@Test public void contextLoads() { User user = new User(0, "Tester", 1, "上海市徐匯區(qū)"); UserVO userVO = UserConvert.INSTANCE.toVO(user); }
3.使用詳解
1)關于接口注解@Mapper幾種屬性用法詳解
uses 使用其他手動編寫的或者其他Mapper接口覆寫相關的轉換方法,不能循環(huán)引用
@Mapper(uses=DateMapper.class)
imports 引用相關類,允許通過mapping.expression()、mapping.defaultExpression()直接使用這些類型
@Mapper(imports = DateUtil.class) public interface UserConvert { UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); @Mappings({ @Mapping(source = "name", target = "userName"), // 以指定方法轉換屬性,這里如果不使用imports,則需要寫全引用類包路徑 @Mapping(target = "birthday", expression = "java(DateUtil.formatDate(entity.getBirthday()))") }) UserVO toVO(User entity); }
unmappedSourcePolicy、unmappedTargetPolicy 針對源類型/目標類型中未映射屬性的反饋策略
typeConversionPolicy 針對有損轉換的反饋策略,例如Long轉Integer
反饋策略主要有三種:IGNORE,默認值,忽略未映射的字段。WARN,警告。ERROR,報錯
@Mapper(unmappedSourcePolicy = ReportingPolicy.ERROR)
componentModel 指定生成映射器實例的模式,主要有四種:
default,不主動生成實例,通常以Mappers.getMapper(Class)實例化。
cdi,以CDI標準實例化映射器,使用@Inject注入相關實例,
spring,Spring Bean方式實例化,
jsr330,jsr330標準實例化
@Mapper(componentModel = "spring") public interface UserConvert { @Mapping(source = "name", target = "userName") UserVO toVO(User entity); }
@Autowired private UserConvert userConvert;
implementationName 指定實現(xiàn)類名稱,映射生成器接口會自動生成實現(xiàn)類<CLASS_NAME>Impl,使用此屬性可避免類沖突
implementationPackage 指定實現(xiàn)類包路徑
config 指定配置類,由指定的@MapperConfig配置類,config導入相關配置
配置類
@MapperConfig( uses = DateUtil.class, unmappedSourcePolicy = ReportingPolicy.WARN ) public interface UserConfig { }
導入配置類
@Mapper(componentModel = "spring", config = UserConfig.class)
collectionMappingStrategy 集合映射策略,這里注意集合映射時,如果集合中的類型已有對應轉換方法,集合轉換時會優(yōu)先使用
@Mappings({ @Mapping(source = "name", target = "userName"), @Mapping(target = "birthday", expression = "java(DateUtil.formatDate(entity.getBirthday()))") }) UserVO toVO(User entity); List<UserVO> collectionCvt(List<User> entities);
GENERATED CODE 生成器生成代碼
public List<UserVO> collectionCvt(List<User> entities) { if (entities == null) { return null; } else { List<UserVO> list = new ArrayList(entities.size()); Iterator var3 = entities.iterator(); while(var3.hasNext()) { User user = (User)var3.next(); // 集合轉換時優(yōu)先使用了已定義的toVO方法 list.add(this.toVO(user)); } return list; } }
nullValueMappingStrategy null作為源值映射策略;RETURN_NULL默認返回null, RETURN_DEFAULT返回默認值,對于對象會通過構造器自動構造對象返回,集合會返回空集合
當值為RETURN_DEFAULT時,如果映射規(guī)則中包含Mapping.expression、Mapping.constant必須手動判空處理,否則NPE
@MapperConfig(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
NullValuePropertyMappingStrategy null作為源屬性映射策略;SET_TO_NULL默認返回null,SET_TO_DEFAULT返回默認值,IGNORE 忽略該值,以目標對象已存在的值為準
MappingInheritanceStrategy 繼承方法級映射配置策略:EXPLICIT 顯示使用InheritConfiguration生效。
AUTO_INHERIT_FROM_CONFIG 自動繼承正向轉換的配置。AUTO_INHERIT_REVERSE_FROM_CONFIG 自動繼承反向轉換的配置。AUTO_INHERIT_ALL_FROM_CONFIG 都繼承
@MapperConfig( mappingInheritanceStrategy = MappingInheritanceStrategy.EXPLICIT )
@InheritConfiguration void cvtVO(User entity, @MappingTarget UserVO vo);
nullValueCheckStrategy 空值監(jiān)測策略
2) 其他方法級別注解
@InheritInverseConfiguration 反向轉換時繼承映射規(guī)則
@Mapping 配置類型屬性的映射規(guī)則;
dateFormat 格式化日期
@Mapping(target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss")
numberFormat 數(shù)字格式化
@Mapping(target = "price", numberFormat = "$#.00")
constant 常量
@Mapping(target = "age", constant = "0")
總結
到此這篇關于Java實體映射工具MapStruct使用的文章就介紹到這了,更多相關Java實體映射工具MapStruct內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?boot?自定義?Starter及自動配置的方法
Starter?組件是?Spring?boot?的一個核心特性,Starter組件的出現(xiàn)極大的簡化了項目開發(fā),這篇文章主要介紹了Spring?boot?自定義?Starter?及?自動配置,需要的朋友可以參考下2022-12-12