在编译时期是处理映射注解,实现类到类之间的映射
MapStruct vs BeanUtils
BeanUtils: 在运行时根据反射动态赋值
缺点:动态赋值,存在大量的反射调用,性能较低;内存占用多,不适合高并发应用场景
MapStruct:在编译时静态生成映射代码,其最终编译出来的代码和手写的代码在性能上完全一致,且有强大的注解等能力。
org.mapstruct:mapstruct:包含了映射相关的注解,如@Mapper、@Mapping等。 org.mapstruct:mapstruct-processor:包含了注解处理器。用于处理注解相关的逻辑,如MappingProcessor等。
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); }