MapStruct简单使用说明

1,098 阅读1分钟

1、原理

编译期 动态生成set/get代码的class文件 ,在运行时直接调用该class文件。* 该方式实际上扔会存在set/get代码,只是不需要自己写了

2、使用方式

2.1、引入依赖

   <properties>
        <org.mapstruct.version>1.3.1.Final</org.mapstruct.version>
    </properties>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>

2.2、静态使用

public interface ItemInfoConvert { 
//静态方法   
ItemInfoConvert INSTANCE = Mappers.getMapper(ItemInfoConvert.class); 
}
 调用: Person person= ItemInfoConvert.INSTANCE.deliveryDO2DTO(cart);


2.3、spring容器注入(推荐使用)

//使用@Mapper(componentModel = "spring") 整合
@Mapper(componentModel = "spring") 
 public interface ItemInfoConvert { };
调用:
//直接接口注入,方法调用即可
 @Autowired  private ItemInfoConvert itemInfoConvert;  
Person person = itemInfoConvert.deliveryDO2DTO(cart); 

3、扩展

主要通过各种注解来实现bean映射时的一些转换操作,比如字段名不一致,数据类型不一致等问题 部分如下:

@Mappings({
            //忽略 categoryId 的转换
            @Mapping(target = "categoryId",ignore = true),
            //源数据类中的集合应用 --> 目标类中的数据引用--转换List
            @Mapping(target = "trees",source = "colors"),
            //嵌套类的属性简单传递转换
            @Mapping(target = "run",source = "cart.animal.run"),
           //numberFormat的格式化Number类型 --> Number或String或者String或Number才有效;其余情况无效。
            //string -->Double :*.0(12.0);有效长度16位更精确。
            //string -->Float :单精度,有效长度8位,如果超出会胜率后面的数字;12.00033452或者12.00033456都会转成12.00033452
            @Mapping(target = "numberPerson", source = "cart.number", numberFormat = "0.00", defaultValue = "0"),
            //用到的机会很少不做说明
            @Mapping(target = "birthday", source = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),
    })
    Person deliveryDO2DTO(Cart cart);
    

3、使用举例

image.png 下面是编译生成的代码,每次更新接口时,clean-compile image.png