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、使用举例
下面是编译生成的代码,每次更新接口时,clean-compile