MapStruct是一个代码生成器,它极大地简化了基于约定而非配置方法的Java bean类型之间映射的实现。生成的映射代码使用简单的方法调用,因此快速、类型安全且易于理解。
与动态映射框架相比,MapStruct 具有以下优势:(1)通过使用普通方法getter、setter调用,而不是反射来快速执行,效率很高。(2)编译时类型安全:只能映射相互映射的对象和属性,不会将其余模型属性进行映射。
多层应用程序通常需要在不同的对象模型(例如实体和DTO)之间进行映射。编写这样的映射代码是一项乏味且容易出错的任务。MapStruct旨在通过尽可能自动化来简化这项工作。 与其他映射框架相比,MapStruct在编译时生成bean映射,这确保了高性能,允许快速的开发人员反馈和彻底的错误检查。
MapStruct是一个插入Java编译器的注释处理器,可以在命令行构建(Maven、Gradle等)中使用,也可以在首选IDE中使用。 MapStruct使用了合理的默认值,但在配置或实现特殊行为时会避开您。
MapStruct的性能远远大于BeanUtils的性能;
使用场景:当你要想使用BeanUtils进行对象拷贝映射时,就可以使用MapStruct;
使用:
导入maven:
<!--mapstruct-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>
创建要拷贝的对象
@Data
public class PatrolA implements Serializable {
@Serial
private static final long serialVersionUID = 825820175244192571L;
@ApiModelProperty("字段A")
private String a;
@ApiModelProperty("字段B")
private Integer b;
@ApiModelProperty("字段C")
private String c;
@ApiModelProperty("字段D")
private String d;
@ApiModelProperty("字段E")
private String e;
}
@Data
public class PatrolB implements Serializable {
@Serial
private static final long serialVersionUID = 825820175544192571L;
@ApiModelProperty("字段A")
private String A;
@ApiModelProperty("字段B")
private Integer b;
@ApiModelProperty("字段C")
private String csdsdsdsdsd;
@ApiModelProperty("字段D")
private String d;
@ApiModelProperty("字段E")
private Date e;
}
创建一个映射器,只需使用所需的映射方法定义一个 Java 接口并使用注释对其进行org.mapstruct.Mapper注释:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PatrolMapStructMapper {
PatrolMapStructMapper INSTANCE = Mappers.getMapper(PatrolMapStructMapper.class);
@Mapping(dateFormat = "yyyy-MM-dd",source = "e", target = "e")
@Mapping(source = "a", target = "A")
@Mapping(source = "c", target = "csdsdsdsdsd")
PatrolB patrolCopy(PatrolA model);
}
MapStruct 还支持具有多个源参数的映射方法。这很有用,例如,为了将多个实体组合成一个数据传输对象。
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface OtherMapStructMapper {
OtherMapStructMapper INSTANCE = Mappers.getMapper(OtherMapStructMapper.class);
@Mapping(target = "description", source = "person.description")
@Mapping(target = "houseNumber", source = "address.houseNo")
DeliveryDto personAndAddressToDeliveryDto(Person person, Address address);
}
底层实现举例:
使用举例:
//数据拷贝转换
PatrolB copy = PatrolMapStructMapper.INSTANCE.patrolCopy(patrolA);
其他高阶用法请参考官方文档