集成MapStruct

77 阅读1分钟

问题: 我们在ReqToDto和DtoToPo的时候,我们使用BeanUtils来进行属性的复制,其实这种方案的性能是很低的,那么我们如何提高性能呢?

想法: 如果我们能够采用set(get)方法的形式,那么效率必然是最高的

新问题产生: 但是这种写法如果字段过多,那么我们需要进行书写的代码工作量就会巨大

思考: 有没有不需要我们手动写set(get)方法,就能够自动生成的方案呢?

解决方案: 集成 MapStruct

1. 引入 MapStruct 相关依赖

<!-- 引入MapStruct依赖,实现实体拷贝 -->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.4.2.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.4.2.Final</version>
</dependency>

2. 定义相关接口

说明: 创建一个convert文件包,在其下创建相关的Convert接口即可!

image.png

package com.ssm.user.convert;

import com.ssm.user.entity.dto.UserDto;
import com.ssm.user.entity.dto.UserPageDto;
import com.ssm.user.entity.po.UserPo;
import com.ssm.user.entity.req.UserPageReq;
import com.ssm.user.entity.req.UserReq;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper //mapstruct下的mapper非mybatis
public interface UserConvert {
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class); //获取代理

    //UserReq转UserDto(返回值类型为dto)
    UserDto convertReqToDto(UserReq userReq);

    //UserDto转UserPo
    UserPo convertDtoToPo(UserDto userDto);

    //UserPageReq转UserPageDto
    UserPageDto convertPageReqToPageDto(UserPageReq userPageReq);

    //UserPageDto转UserPo
    UserPo convertPageDtoToPo(UserPageDto userPageDto);
}

3.使用

userReq转userDto

UserDto userDto = UserConvert.INSTANCE.convertReqToDto(userReq);

4. 优化: 字段不对应情况

说明: 如果源表和目标表的字段名不对应,用@Mapping即可实现对应!

image.png