MapStruct映射工具
一、mapStruct映射工具
1.1 功能
在编译时期是处理映射注解,实现类到类之间的映射
MapStruct vs BeanUtils
-
BeanUtils: 在运行时根据反射动态赋值
缺点:动态赋值,存在大量的反射调用,性能较低;内存占用多,不适合高并发应用场景
-
MapStruct:在编译时静态生成映射代码,其最终编译出来的代码和手写的代码在性能上完全一致,且有强大的注解等能力。
1.2 依赖包
org.mapstruct:mapstruct:包含了映射相关的注解,如@Mapper、@Mapping等。
org.mapstruct:mapstruct-processor:包含了注解处理器。用于处理注解相关的逻辑,如MappingProcessor等。
1.3 使用
Person类
public class Person {
private Long id;
private String name;
private String email;
private Date birthday;
private User user;
}
public class User {
private Integer age;
}
PersonDTO类
public class PersonDTO {
private Long id;
private String name;
//对应 Person.user.age
private Integer age;
private String email;
// 与 DO 里面的字段名称(birthDay)不一致
private Date birth;
//对 DO 里面的字段(birthDay)进行拓展,dateFormat 的形式
private String birthDateFormat;
//对 DO 里面的字段(birthDay)进行拓展,expression 的形式
private String birthExpressionFormat;
}
PersonConverter 转换类
@Mapper
public interface PersonConverter {
PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);
@Mappings({
@Mapping(source = "birthday", target = "birth"),
@Mapping(source = "birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),
@Mapping(target = "birthExpressionFormat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(),\"yyyy-MM-dd HH:mm:ss\"))"),
@Mapping(source = "user.age", target = "age"),
@Mapping(target = "email", ignore = true)
})
PersonDTO domain2dto(Person person);
List<PersonDTO> domain2dto(List<Person> people);
}