MapStruct学习

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还提供了一些高级功能,如集合映射、枚举映射、泛型映射等,使得映射规则更加灵活和强大。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值