官方文档 :https://mapstruct.org/documentation/stable/reference/html/
MapStruct是一个注释处理器,用于生成类型安全、性能良好和无依赖关系的bean映射代码,自动生成get、set方法;
maven 依赖
<properties>
<org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
</properties>
...
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
示例代码
首先需要定义一个接口类,其中 componentModel = "spring" 表示是个类使用springIOC容器进行托管,我们就可以通过 @Autowired 使用;
1、接口第一个方法注解中的 source = "make", target = "manufacturer",表示把 car 中的 make 字段赋值给 manufacturer 字段,适用于2个转换对象中不同名的字段;
2、接口第二个方法注解中的 target = "addr", expression = "java(decode(userInfo.getAddr())" 表示把 UserInfoDto 中的 addr 字段 使用 TestMapper 类中的 decode方法赋值,decode方法入参是 userInfo.getAddr();
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper(componentModel = "spring")
public interface TestMapper {
@Mapping(source = "make", target = "manufacturer")
@Mapping(source = "numberOfSeats", target = "seatCount")
CarDto carToCarDto(Car car);
@Mapping(target = "addr", expression = "java(decode(userInfo.getAddr())")
UserInfoDto userToUserInfoDto(UserInfo userInfo);
/**
* 数据库的中地址解密
*
* @param addr 加密过的地址
* @return 解密的地址
*/
default String decode(String addr) {
if (addr == null) {
return addr;
}
return EncryptUtils.getDedoce(addr);
}
}
编译后会在target目录下看到生成好get、set内容类;
Bean拷贝工具对比
工具 | 十个对象复制1次 | 一万个对象复制1次 | 一百万个对象复制1次 | 一百万个对象复制5次 |
mapStruct | 0ms | 3ms | 96ms | 281ms |
hutools的BeanUtil | 23ms | 102ms | 1734ms | 8316ms |
spring的BeanUtils | 2ms | 47ms | 726ms | 3676ms |
apache的BeanUtils | 20ms | 156ms | 10658ms | 52355ms |
apache的PropertyUtils | 5ms | 68ms | 6767ms | 30694ms |