概述
MapStruct 是一个代码生成器,它基于约定优于配置方法极大地简化了 Java bean 类型之间映射的实现。生成的映射代码使用简单的方法调用,因此速度快、类型安全且易于理解。
为什么使用它?
多层应用程序通常需要在不同的对象模型(例如实体和 DTO)之间进行映射。编写这样的映射代码是一项乏味且容易出错的任务。MapStruct 旨在通过尽可能自动化来简化这项工作。
与其他映射框架相比,MapStruct 在编译时生成 bean 映射,以确保高性能,允许快速的开发人员反馈和彻底的错误检查。
mapstruct官网:https://mapstruct.org/
1、mapstruct使用步骤
1、引入Maven依赖
<!-- 统一管理jar包版本 -->
<properties>
<mapstruct.version>1.4.2.Final</mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
</dependencies>
2、新建一个抽象类或者接口并标注@Mapper
package com.zx.server.converter;
import org.mapstruct.*;
import static org.mapstruct.factory.Mappers.*;
@Mapper
public interface ImagesConverter {
ImagesConverter INSTANCE = getMapper(ImagesConverter.class);
}
3、写一个转换方法 方法可以任意
/**
* @Description:输入类型转ES原型
* @Author: zcm
* @Version:v.1.0.0
* @Date:2021/7/19 16:49
*/
@Mappings({})
ImagesES dtoToEs(ImagesDto dto);
4、获取该接口的实现类并使用
ImagesES imagesES = ImagesConverter.INSTANCE.dtoToEs(dto);
2、@Mapper
-
同名同类型的属性,会自动映射
-
mapstruct会自动类型转化
1、8种基本类型和它的包装类之间
2、8种基础类型包含类和String之间
3、日期类型和String类之间
3、@Mappings和@Mapping
-
指定属性之间的映射关系
-
source或者target多余的属性对方没有,不会报错的
-
ignore 设置忽略
@Mapping(target="popTemp",ignore = true)
-
属性是引用的对象的映射处理
@Mappings({
@Mapping(source = "tempEs",target="tempVo")//对象属性映射
})
PopupContentVo esToVo(PopupContentES es);
/**
* @Description:对象之间的引用
* @Author: zcm
* @Version:v.1.0
* @Date:2021/7/29 10:59
*/
@Mapping(source = "id", target = "tempId")
@Mapping(source = "name", target = "tempName")
TemplateVo tempEsToTempVo(TemplateES es);
-
批量映射处理
/**
* @Description:ES转输出类型
* @Author: zcm
* @Version:v.1.0.0
* @Date:2021/7/19 16:49
*/
@Mappings({
@Mapping(source = "createTime", target = "createTime", dateFormat = DatePattern.UTC_SIMPLE_PATTERN)
// ,@Mapping(target="popTemp",ignore = true)//忽略此字段不映射
})
PopupContentVo esToVo(PopupContentES es);
/**
* @Description:批量转化
* @Author: zcm
* @Version:v.1.0.0
* @Date:2021/7/19 16:50
*/
List<PopupContentVo> esListToVoList(List<PopupContentES> list);
4、@AfterMaping和@MappingTarget
-
@AfterReturning:在自动映射的最后一步对对属性的自定义映射处理
-
@MappingTarget:标识传过来的VO已经经过了映射处理
@AfterReturning
public void voAfter(PopupContentES es, @MappingTarget PopupContentVo vo){
String sysJson = es.getSysJson();
int b = StringUtils.isEmpty(sysJson) ? -1 : 1;
vo.setType(b);
}
5、@BeanMapping
-
ignoreByDefault:避免不需要的赋值、避免属性覆盖
/**
* @Description:忽略mapstruct默认映射行为,只为配置@Mapping映射值
* @Author: zcm
* @Version:v.2.7.9
* @Date:2021/7/29 11:36
*/
@BeanMapping(ignoreByDefault = true)
@Mapping(source = "id",target = "id")
PopupContentVo es2ToVo(PopupContentES es);
6、InheritConfiguration
-
更新场景,避免同样的配置重复写
/**
* @Description:继承父类的配置,更新属性
* @Author: zcm
* @Version:v.1.0
* @Date:2021/7/29 11:48
*/
@InheritConfiguration
void updateVo(PopupContentES es, @MappingTarget PopupContentVo vo);
7、@InheritInverseConfiguration
-
反向继承配置
8、mapstruct结合spring使用
@Mapper(componentModel = "spring") //实质就是加了@Component注解,让spring容器能够找到类