问题: 我们在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接口即可!
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即可实现对应!