mapstruct使用详解

概述

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容器能够找到类

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值