MapStruct使用及常用方式示例

一.MapStruct简介

1.Mapstruct是实体类的映射框架,可以直接通过Java注解将一个实体类的属性高效的赋值给另一个实体类。

2.实体类映射框架从实现原理上看大致可以分为两种,一种是基于反射动态映射实现(BeanUtils),另一种就是基于编译期动态生成getter/setter(Mapstruct).

二.MapStruct使用步骤

1.引入依赖

<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-processor</artifactId>
            <version>${mapstruct.version}</version>
        </dependency>
</dependencies>

2.定义一个映射接口并标注@Mapper注解

@Mapper public interface EntiyConverter{       
/** * 映射. */ EntiyConverter INSTANCE = Mappers.getMapper(EntiyConverter.class);

    @Mapping(source = "number", target = "myNumber")
    Target differentNameConvert(Source source);

}

三.MapStruct常用方式示例

1.同名同属性字段转换

//直接转换

Target convertToTarget(Source source)

2.不同名同属性字段转换

//需要使用@Mapping注解指定转换字段的名称

//解释:source中的number转换为tagert中的myNumber

@Mapping(source = "number", target = "myNumber")

Target differentNameConvert(Source source);

3.默认值的使用

//需使用@Mapping中的defaultValue字段进行标识

//解释:若age字段为null,则使用defaultValue的值

@Mapping(source = "age", target = "age", defaultValue = "34")

Target defaultValueConvert(Source source);

4.常量的使用

//需使用@Mapping中的constant字段进行标识

//解释:不论target中的oldNumber转换值是什么,最后都使用constant的值

@Mapping(target = "oldNumber", constant = "35")

Target constantConvert(Source source);

5.忽略某个字段转换

//需使用@Mapping中的ignore字段进行标识

//解释:忽略target中的name字段转换 不论sourcename的值是什么 最后tagert中的name值都是null

@Mapping(target = "name", ignore = true)

Target ignoreConvert(Source source);

6.单独参数转换

//需标明单独参数转换后的字段名称

//解释:将传入的sex字段传递给target中的sex

@Mapping(source = "sex", target = "sex")

Target aloneParmConvert(Integer sex);

7.更新数据源

//需使用@MappingTarget字段标明

//解释:将SonTarget中的值更新给Target 要改变谁 在谁前面加@MappingTarget

void updateTargetConvert(@MappingTarget Target target, SonTarget sonTarget);

8.自定义数据类型转换

default Target myConvert(Source source) {

    // some mapping logic

}

9.多数据源转换

//需使用@Mapping标明转换时参数传递的规则

//解释:将source中的ignore字段值传递到targetignore sourceTwoid字段值传递到target中的id

@Mappings({

        @Mapping(source = "source.ignore", target = "ignore"),

        @Mapping(source = "sourceTwo.id", target = "id")

})

SonTarget multiSourceConvert(Source source, SourceTwo sourceTwo);

10.表达式的使用

//需使用@Mapping中的expression字段标识所使用的表达式

//解释:引用Java表达式中DateTuil中的date方法处理date的转换逻辑  全路径

@Mapping(target = "stringDate", expression = "java(cn.hutool.core.date.DateUtil.date(date))")

SonTarget expressionConvert(Date date);

//解释:可在接口上面的@Mapper中引入某个类,这样就可以直接写方法,不用写全路径

@Mapper(imports = {DateUtil.class})

@Mapping(target = "date", expression = "java(DateUtil.date(date))")

SonTarget expressionConvert(Date date);

11.子父类转换

//需使用@BeanMapping指定返回的类型

//解释:SonTargetTarget的子类,该方法用父类接受,返回子类属性

@BeanMapping(resultType = SonTarget.class)

Target childenConvert(Source source);

12.逆向转换

//需使用InheritInverseConfiguration标识,该注解是根据源和目标的类型去自动识别,若存在多个相同源转换目标的方法时,需指定逆向转换的方法

//解释:将differentNameConvert方法进行逆向转换

//优点:若原differentNameConvert方法上有很多@Mapping规则的话,无需再次书写即可使用

@InheritInverseConfiguration(name = "differentNameConvert")

Source convertToSource(Target target);

13.dateFormat的使用

//需使用@mapping中的dateFormat注解进行标识转换的形式

//解释:source.date字段转换为target中的stringDate,转换格式为dateFormat指定的格式

@Mappings({

      @Mapping(source = "source.date", target = "stringDate", dateFormat = "yyyy-MM-dd HH:mm:ss"),  //Date转换成String

      @Mapping(source = "source.stringDate", target = "date", dateFormat = "yyyy-MM-dd HH:mm")  //String转换成Date

})

Target childenConvert(Source source);

14.numberFormat的使用

//解释:String转数字类型后若想指定数字类型的格式可使用numberFormat指定

@Mapping(target = "number", numberFormat = "#.00")

Target differentTypeConvert(Source source);

15.@BeforeMapping的使用

//解释:在转换之前对某个实体进行操作

@BeforeMapping

default void beforeConvert(Source source){

    // some mapping logic

}

16.@AfterMapping的使用

//解释:在转换之后对某个实体进行操作

@AfterMapping

default void afterConvert(Source source){

    // some mapping logic

}

17.集合转换-无特殊要求

//解释:直接定义转换方法即可,MapStruct会自动生成Source转换成Target的方法,然后循环去调用

List<Target> convertToTargets(List<Source> sources);

18.集合转换-需自定义规则

//解释:自定义Source转换Target规则,MapStruct会自动调用sourceConvertToTarget方法来替代他自己生成的方法

//此时自定义规则才会生效

List<Target> convertToTargets(List<Source> sources);

@Mapping(source = "name", target = "name2")

Target sourceConvertToTarget(Source source);

19.集合转换-需自定义规则(存在多个自定义规则)

//解释:存在多个转换方法时,MapStruct无法自动选择,此时需使用@IterableMapping@Named联合指定

//qualifiedByName指定调用的转换规则,@Named标明被调用的名称,这里的两个名称需一致

@IterableMapping(qualifiedByName = "sourceTwoConvertToTarget")

List<Target> convertToTargets(List<SourceTwo> sourceTwos);

@Mapping(source = "name", target = "name2")

@Named("sourceTwoConvertToTarget")

Target sourceTwoConvertToTarget(SourceTwo sourceTwo);

Target sourceTwoConvertToTarge2(SourceTwo sourceTwo);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值