MapStruct是一个用于Java开发的开源库,它用于将Java对象映射到其他Java对象,例如将DTO(Data Transfer Object)映射到实体类或将实体类映射到DTO。MapStruct使用注解来定义映射规则,这些规则可以用于自动生成映射代码,从而减少了手动编写映射代码的工作量。
MapStruct提供了许多注解,例如@Mapper、@Mapping、@Mappings、@InheritInverse、@Qualifier等,这些注解可以用于定义映射规则。MapStruct还支持自定义映射规则,例如自定义转换器、自定义类型映射器等。
MapStruct的使用非常简单,只需要在Java项目中添加MapStruct依赖,然后使用MapStruct提供的注解定义映射规则即可。MapStruct可以与Spring框架集成,也可以独立使用。
1、 MapStruct 的基本使用步骤:
1.1 添加依赖
在项目的 pom.xml 文件中添加 MapStruct 的依赖:
(1)Lombok 1.18.12 版本以下: annotationProcessorPaths中mapstruct、projectlombok顺序不受影响。
(2)Lombok 1.18.16 版本以上: annotationProcessorPaths中mapstruct、lombok顺序受影响,mapstruct应该遵循lombok路径。
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.5.Final</version>
</dependency>
<!-- lombok 大于 1.18.12-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</path>
<!-- This is needed when using Lombok 1.18.16 and above -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>0.2.0</version>
</path>
<!-- Mapstruct should follow the lombok path(s) -->
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.5.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
1.2 创建映射接口
(1)通用接口
package com.cmb.lu31.ybx.dtx.mapper;
import java.util.List;
public interface BaseMapper<D, E> {
/**
* DTO转Entity
*
* @param dto /
* @return /
*/
E toEntity(D dto);
/**
* Entity转DTO
*
* @param entity /
* @return /
*/
D toDto(E entity);
/**
* DTO集合转Entity集合
*
* @param dtoList /
* @return /
*/
List<E> toEntity(List<D> dtoList);
/**
* Entity集合转DTO集合
*
* @param entityList /
* @return /
*/
List<D> toDto(List<E> entityList);
}
(2)具体映射:创建一个接口,用于定义源对象和目标对象之间的映射关系。例如,将一个 SysPamEntity对象映射到 BrowserResultDTO对象:
package com.cmb.lu31.ybx.dtx.mapper;
import com.cmb.lu31.ybx.dtx.dto.system.pam.BrowserResultDTO;
import com.cmb.lu31.ybx.dtx.entity.SysPamEntity;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
* @author 肖章艳/80317164
* @date 2024/1/22 15:02
*/
@Mapper
public interface SysPamTranMapper extends BaseMapper<BrowserResultDTO, SysPamEntity> {
SysPamTranMapper INSTANCE = Mappers.getMapper(SysPamTranMapper.class);
@Override
@Mappings({
@Mapping(target = "systemCode", source = "ybxSysCod"),
@Mapping(target = "fileType", source = "ybxFilTyp"),
@Mapping(target = "businessCode", source = "ybxBusCod"),
@Mapping(target = "wkeCode", source = "ybxWkeCod"),
@Mapping(target = "requireUrl", source = "ybxReqUrl"),
@Mapping(target = "requireType", source = "ybxReqTyp"),
@Mapping(target = "fileDirecter", source = "ybxFilDrc"),
@Mapping(target = "messageType", source = "ybxMsgTyp"),
@Mapping(target = "structureType", source = "ybxSctTyp"),
@Mapping(target = "connectTime", source = "ybxCntTmt"),
@Mapping(target = "readTime", source = "ybxRadTmt"),
@Mapping(target = "descriptor", source = "ybxDscInf")
})
BrowserResultDTO toDto(SysPamEntity entity);
}
在上面的代码中,我们使用了 @Mapper 注解来定义一个映射接口。SysPamTranMapper.INSTANCE 是一个单例对象,用于访问映射接口的实例。
1.3 使用映射接口
在需要使用映射的代码中,可以通过调用映射接口的方法来进行映射。例如,将 SysPamEntity对象映射到 BrowserResultDTO对象:
SysPamEntity sysPamEntity = new SysPamEntity();
BrowserResultDTO browserResultDTO = SysPamTranMapper.INSTANCE.toDto(sysPamEntity);
SysPamEntity sysPamEntity = new SysPamEntity();
BrowserResultDTO browserResultDTO = SysPamTranMapper.INSTANCE.toDto(sysPamEntity);
以上就是使用 MapStruct 的基本步骤。MapStruct 还提供了许多高级特性,例如集合映射、自定义映射等,可以根据实际需求进行使用。
1.4 生成的实现类
package com.cmb.lu31.ybx.dtx.mapper;
import com.cmb.lu31.ybx.dtx.dto.system.pam.BrowserResultDTO;
import com.cmb.lu31.ybx.dtx.entity.SysPamEntity;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2024-01-22T17:18:31+0800",
comments = "version: 1.5.5.Final, compiler: javac, environment: Java 1.8.0_121 (Oracle Corporation)"
)
@Component
public class SysPamTranMapperImpl implements SysPamTranMapper {
@Override
public BrowserResultDTO toDto(SysPamEntity entity) {
if ( entity == null ) {
return null;
}
BrowserResultDTO browserResultDTO = new BrowserResultDTO();
browserResultDTO.setSystemCode( entity.getYbxSysCod() );
browserResultDTO.setFileType( entity.getYbxFilTyp() );
browserResultDTO.setBusinessCode( entity.getYbxBusCod() );
browserResultDTO.setWkeCode( entity.getYbxWkeCod() );
return browserResultDTO;
}
@Override
public List<BrowserResultDTO> toDto(List<SysPamEntity> entity) {
if ( entity == null ) {
return null;
}
List<BrowserResultDTO> list = new ArrayList<BrowserResultDTO>( entity.size() );
for ( SysPamEntity sysPamEntity : entity ) {
list.add( toDto( sysPamEntity ) );
}
return list;
}
@Override
public SysPamEntity toEntity(BrowserResultDTO dto) {
if ( dto == null ) {
return null;
}
SysPamEntity sysPamEntity = new SysPamEntity();
sysPamEntity.setYbxSysCod( dto.getSystemCode() );
sysPamEntity.setYbxFilTyp( dto.getFileType() );
sysPamEntity.setYbxBusCod( dto.getBusinessCode() );
sysPamEntity.setYbxWkeCod( dto.getWkeCode() );
}
2、注解说明
MapStruct是一个用于将Java对象之间进行映射的库。它使用注解来定义映射规则,使得在Java对象之间进行映射变得非常简单。下面是MapStruct注解的详细介绍:
@Mapper
@Mapper注解用于定义一个映射器类。映射器类包含一系列映射方法,用于将一个Java对象映射到另一个Java对象。
@Mapping
@Mapping注解用于定义一个映射方法。映射方法用于将一个Java对象映射到另一个Java对象。
1、支持名称转换
@Mapping(target = "descriptor", source = "ybxDscInf")
2、支持格式转换
@Mapping(target = "saleTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
@Mapping(target = "price", numberFormat = "#.00元")
3、自定义映射器
@Component
public class MapStructConverterUtil {
@Named("getNormalImage")
public String get(){}
}
@Mapper(componentModel = "spring", uses = {MapStructConverterUtil.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface ActivityUserDetailMapper extends BaseMapper<ActivityUserDetailDTO, Activity> {
@Override
@Mappings({
@Mapping(target = "img1", source = "images", qualifiedByName = "getNormalImage")
})
ActivityUserDetailDTO toDto(Activity entity);
}
4、Map映射
@Mapper(componentModel = "spring", uses = {ConverterUtil.class}, unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface SourceTargetMapper {
@MapMapping(keyQualifiedByName = "getValue", valueDateFormat = "dd.MM.yyyy")
Map<String, String> longDateMapToStringStringMap(Map<Long, Date> source);
}
5、复杂映射
@Mapper(componentModel = "spring", imports = DecimalUtils.class)
public interface Demo16Assembler {
@Mapping(target = "price", expression = "java(product.getPrice1() + product.getPrice2())")
@Mapping(target = "price2", expression = "java(DecimalUtils.add(product.getPrice1(), product.getPrice2()))")
ProductDTO toDTO(Product product);
}
@Mappings
@Mappings注解用于定义多个映射方法。这些映射方法可以用于将一个Java对象映射到多个Java对象。
@Named
@Named注解用于为映射器类中的映射方法指定一个名称。这样可以在调用映射方法时使用名称来代替映射器类和方法名。
@AfterMapping
@AfterMapping注解用于定义一个在映射完成后执行的方法。这个方法可以用于对映射结果进行一些额外的处理。
@BeforeMapping
@BeforeMapping注解用于定义一个在映射开始前执行的方法。这个方法可以用于对源对象进行一些额外的处理。
@AfterMapping
@AfterMapping注解用于定义一个在映射完成后执行的方法。这个方法可以用于对映射结果进行一些额外的处理。
@Qualifier
@Qualifier注解用于指定一个映射器类中的特定映射方法。这样可以在调用映射方法时使用特定的映射方法。
@InheritConfiguration
@InheritConfiguration注解用于继承父类中的映射器配置。这样可以避免在子类中重复定义映射器配置。
@Context
@Context注解用于在映射方法中注入一个上下文对象。这个上下文对象可以用于在映射方法中访问一些外部资源。
这些注解可以组合使用,以便在Java对象之间进行复杂的映射。MapStruct还提供了一些高级功能,如集合映射、枚举映射、泛型映射等,使得映射规则更加灵活和强大。