MapStruct高性能bean转换


前言

BeanUtil.copyProperties
MapStruct


一、为什么用MapStruct?

实体类类copy效率对比
官方:20倍
实测:30左右倍

二、使用步骤

1.引入库

代码如下(示例):

		<dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>1.2.0.Beta2</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.2.0.Beta2</version>
        </dependency>

2.读入数据

源dto代码如下(示例):

package study;

import lombok.Data;

import java.util.Date;

/**
 * @program: ruoyi
 * @description:
 * @author: yangyang
 * @create: 2023-10-27 15:22
 **/
@Data
public class UserPo {
    private Long id;
    private String name;
    private Date createTime;
    private String userNick;
}

目标dto代码如下(示例):

import lombok.Data;

import java.util.Date;

/**
 * @program: ruoyi
 * @description:
 * @author: yangyang
 * @create: 2023-10-27 15:22
 **/
@Data
public class UserEntity {
    private Long id;
    private String name;

    @Alias("createTime")
    private Date createTime1;

    @Alias("userNick")
    private String userNick1;
}

Convent转换器 代码如下(示例):

package study;

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

/**
 * @program: ruoyi
 * @description:
 * @author: yangyang
 * @create: 2023-10-27 15:23
 **/
@Mapper(componentModel = "spring")
public interface PersonConvent {

    PersonConvent INSTANCT = Mappers.getMapper(PersonConvent.class);

//    @Mapping(target = "userNick1", source = "userNick")
    @Mappings({
            @Mapping(source = "userNick", target = "userNick1"),
            @Mapping(source = "createTime", target = "createTime1")
    })
    UserEntity to(UserPo userPo);
}

测试类代码如下(示例):

package study;

import cn.hutool.core.bean.BeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.Date;

/**
 * @program: ruoyi
 * @description:
 * @author: yangyang
 * @create: 2023-10-27 15:25
 **/
@Slf4j
public class MapStructTest {


    @Test
    public void MapStructTest() {
        UserPo userPo = new UserPo();
        userPo.setId(1L);
        userPo.setName("tt");
        userPo.setCreateTime(new Date());
        userPo.setUserNick("测试mapstruct");

        UserEntity userEntity = new UserEntity();
        long startTime = System.currentTimeMillis();
        BeanUtil.copyProperties(userPo, userEntity);
        long endTime = System.currentTimeMillis();
        long elapsedTime = endTime - startTime;
        log.info("BeanUtil耗时:{}", elapsedTime);

        long startTime1 = System.currentTimeMillis();
        UserEntity user = PersonConvent.INSTANCT.to(userPo);
        long endTime1 = System.currentTimeMillis();
        long elapsedTime1 = endTime1 - startTime1;
        log.info("MapStruct耗时:{}", elapsedTime1);
        System.err.println("BeanUtil转换:" + userEntity);
        System.err.println("MapStruct转换" + user);
    }

}

总结

测试结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值