MapStruct 实现 bean 高效复制

官方文档 :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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值