mapStruct 之 基本使用

简介

mapstrct是一个很好注释处理的框架,解决繁琐domain之间值的转换,节约开发的时间,同时相对应copyProperty的好处是没有使用反射技术,使性能更优。mapstrut一共两个主要的包,org.mapstruct.mapstruct包含里面常用的注释,org.mapstruct.mapstruct-processor处理注释的实现。

官方文档

文档传送门

maven引入

<!-- 指定版本 -->
<properties>
	<org.mapstruct.version>1.3.0.Final</org.mapstruct.version>
</properties>

<!-- 引入依赖 -->
<dependencies>
	<!--mapstruct主键-->
	<dependency>
		<groupId>org.mapstruct</groupId>
		<artifactId>mapstruct</artifactId>
		<version>${org.mapstruct.version}</version>
	</dependency>
	<!-- mapstruct插件 可以直接点击查看mapstruct的实现类 -->
	<dependency>
		<groupId>org.mapstruct</groupId>
		<artifactId>mapstruct-jdk8</artifactId>
		<version>${org.mapstruct.version}</version>
	<dependency>
	<!-- mapstruct实现类执行器 -->
	<dependency>
		<groupId>org.mapstruct</groupId>
		<artifactId>mapstruct-processor</artifactId>
		<version>${org.mapstruct.version}</version>
		<scope>private</scope>
	</dependency>
</dependencies>

基本使用

  1. 定义一个接口,使用 @Mapper
  2. 定义一个转换的方法。方法上常用的注解
@Mapping(target="",source="")@Mappings({@Mapping(target="",source=""),@Mapping(target="",source="")})

ps:如果target和source字段名相同则无需使用注解,mapstruct会自动为我们copy值的
3. @BeanMapping(ignoreByDefault=true)忽略自动注解功能
4. 例子

@Data
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class Item {
    Long itemId;
    String title;
}

@Data
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class Sku {
    Long skuId;
    String code;
    Integer price;
}

@Data
@NoArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@AllArgsConstructor
public class SkuDTO {
    Long skuId;
    String skuCode;
    Integer skuPrice;
    Long itemId;
    String itemName;
}

@Mapper
public interface ItemConvert {

    ItemConvert INSTANCE = Mappers.getMapper(ItemConvert.class);

    @BeanMapping(ignoreByDefault = true)
    @Mappings({
           @Mapping(source = "sku.code", target = "skuCode"),
           @Mapping(source = "sku.price", target = "skuPrice"),
           @Mapping(source = "item.title", target = "itemName")
    })
    SkuDTO domain2Dto(Sku sku, Item item);
}
  • mapstruct自动实现
@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2019-07-30T18:14:08+0800",
    comments = "version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_101 (Oracle Corporation)"
)
public class ItemConvertImpl implements ItemConvert {

    @Override
    public SkuDTO domain2Dto(Sku sku, Item item) {
        if ( sku == null && item == null ) {
            return null;
        }

        SkuDTO skuDTO = new SkuDTO();

        if ( sku != null ) {
            skuDTO.setSkuPrice( sku.getPrice() );
            skuDTO.setSkuCode( sku.getCode() );
        }
        if ( item != null ) {
            skuDTO.setItemName( item.getTitle() );
        }

        return skuDTO;
    }
}
  • 特别说明,因为使用了@BeanMapping,所有只有我们需要转换的才会转换,但是如果去掉BeanMapping,那么他的实现就是这样的
@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2019-07-30T18:17:19+0800",
    comments = "version: 1.3.0.Final, compiler: javac, environment: Java 1.8.0_101 (Oracle Corporation)"
)
public class ItemConvertImpl implements ItemConvert {

    @Override
    public SkuDTO domain2Dto(Sku sku, Item item) {
        if ( sku == null && item == null ) {
            return null;
        }

        SkuDTO skuDTO = new SkuDTO();

        if ( sku != null ) {
            skuDTO.setSkuPrice( sku.getPrice() );
            skuDTO.setSkuCode( sku.getCode() );
            skuDTO.setSkuId( sku.getSkuId() );
        }
        if ( item != null ) {
            skuDTO.setItemName( item.getTitle() );
            skuDTO.setItemId( item.getItemId() );
        }
        
        return skuDTO;
    }
}

多个入参

mapstruct支持多个参数的,如果名字一样则会自动映射,不同则需要使用@Mapping,如果多个参数的都有target的属性名需要制定是哪个source的属性名,否则会报错

  • 多个POJO作为入参
@Mapper
public interface CarAssertApiMapper {

    CarAssertApiMapper INSTANCE = Mappers.getMapper(CarAssertApiMapper.class);

    /**
     * 两个do转成一个dto
     *
     * @param purchaseBillItemDO 采购明细单
     * @param carManageDO        车型
     * @return 目的dto
     */
    @Mappings({
            @Mapping(target = "modelCode", source = "carManageDO.modelCode"),
            @Mapping(target = "modelName", source = "carManageDO.modelName"),
            @Mapping(target = "modelColor", source = "carManageDO.modelColor"),
            @Mapping(target = "modelColorCode", source = "carManageDO.modelColorCode"),
            @Mapping(target = "interiorColor", source = "carManageDO.interiorColor"),
            @Mapping(target = "interiorColorCode", source = "carManageDO.interiorColorCode"),
            @Mapping(target = "purchaseBillItemId", source = "purchaseBillItemDO.billItemId")
    })
    PurchaseCreateDTO doToDto(PurchaseBillItemDO purchaseBillItemDO, CarManageDO carManageDO);
}

车型信息,purchaseBillItemDO和carManageDO都有这个字段,所以需要具体制定到是哪个实体类的字段,否则mapstruct不知道是用哪个

  • 基本类型或者常见的java类型作为入参

mapstruct可以直接将一个基本类型的字段直接映射对应的bean字段

@Mapper
public interface CarMapper {

    CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);

    /**
     * 多个参数转换为targetDTO
     *
     * @param carDO       source car DO
     * @param warehouseDO source warehouse DO
     * @param userName    操作人 这个会直接映射到目标bean的相同字段属性上,
     *                    若是属性名不一致,则需要使用@Mapping
     * @return target DTO
     * ps:多个mapping可能使用Mappings更方便
     * @Mappings({
     * @Mapping(source = "warehouseDO.plate_cities", target = "plateCities")
     * })
     */
    @Mapping(source = "warehouseDO.plate_cities", target = "plateCities")
    CarDTO severalSourceToDTo(CarDO carDO, WarehouseDO warehouseDO, String userName);
}

更新POJO

mapstruct不仅仅可以create instance, 也可以更新instance,使用@MappingTarget

@Mapper
public interface CarMapper {

    CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);

  /**
     * 更新DTO里的值
     *
     * @param carDTO      target update instance
     * @param inventoryDO source do
     */
    void updateCarDTO(@MappingTarget CarDTO carDTO, InventoryDO inventoryDO);
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MapStruct Support插件是一个用于提升使用MapStruct的开发效率的插件,它并非必需,但非常实用。对于基于Maven的项目,您可以通过将相关依赖添加到您的POM文件中来使用MapStruct。具体操作如下: 1. 添加mapstruct核心依赖和mapstruct编译依赖到POM文件中: ``` <!--mapStruct依赖 高性能对象映射--> <!--mapstruct核心--> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.0.Beta1</version> </dependency> <!--mapstruct编译--> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.0.Beta1</version> </dependency> ``` 2. 如果您使用的是IntelliJ IDEA开发工具,您可以下载并安装MapStruct Support插件,这不是必需的,但会提供更好的支持。在安装完插件后,您可以通过按住Ctrl并点击相关参数,自动进入参数所在的类文件。此外,您还可以定义一个映射器,包括基本映射等功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [01-MapStruct插件:MapStruct Support](https://blog.csdn.net/xutaocss/article/details/127771595)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Mapstruct 使用教程](https://blog.csdn.net/qq_44732146/article/details/119968376)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值