-
参考视频 ------ 参考demo ------- mapStruct官方文档
-
概述:
1).mapStruct和beanUtils一样,都是浅复制,具体参照本人深/浅复制文章
2).mapStruct相对于beanUtils,可以复制更为复杂的属性,不同类型,不同名之间也可以映射,以及可以实现实体的批量转换 -
具体使用:
1).注意事项:
①lombok版本必须是1.16.16以上,推荐1.18.10
②mapstract 版本推荐 1.3.1.Final 及以上
③低于以上的版本会出现各种各样的问题,这都是本人踩过的坑
2)准备工具:
①编译器必须安装lombok插件,导入的lombok相关jar包才能正常使用
②可以安装mapStruct插件来简化代码,本人没有安装,下面代码也是在无mapStruct插件情况下的代码
3)注解及相关介绍
1.默认的映射规则:
1).同类型且同名的属性,会自动映射
2).同名但类型不同,会自动进行类型转换,支持的类型有:
①8种基本类型以及包装类型,String类型之间的转换;
②日期类型和String之间;
2.@Mapper(componentModel = “spring”) 注意这个mapper是mapStruct包下面的,不是mybatis下的
实质就是加了@comment注解
添加componentModel=“spring”就可以是使工具类和Spring结合,利用注入来使用,不添加的话是不会被注入到spring中的
但是@mapper必须要加,这是工具类的入口
添加componentModel=“spring”后,就可以在工具类里使用spring的资源,如controller,server,mapper等资源,其他类也可以像调用controller,server,mapper等那样,利用@Autowired的方式,去定义调用
@Mappings 多个映射规则的集合
@Mapping 映射规则集合中的某一个规则
source 源类中的属性名
target 目标类中的属性名
dateFormat 源→目标日期格式化 使用方式:dateFormat = “yyyy-MM-dd HH:mm:ss”
numberFormat 源→目标数字格式化 使用方式:numberFormat = “#.00”
ignore 忽略掉某属性的复制 使用方式:ignore = true 则该属性被复制忽略
@AfterMapping 表示让mapstruct在调用完自动转换方法之后,会来自动调用本方法
@MappingTarget:表示传来的实体是已经转换后的,是赋值后的,配合AfterMapping 一起使用
@BeanMapping(ignoreByDefault = true) 禁止默认配置,只支持自定义的映射行为 即上述的默认规则失效,配合@Mapping来完成自定义的复制效果
@InheritConfiguration 继承上一转换的配置 如果上一次转换屏蔽了默认的配置规则,那么这次也会屏蔽掉默认的配置规则,如果上一次定义了其他规则,那么这一次也会执行该规则
@InheritInverseConfiguration(name = “XXX”)指定继承那个方法的配置,XXX为某方法名,该注解只会继承指定方法,source和target之间的映射关系,也可以反着,但是不会继承@BeanMapping(ignoreByDefault = true)之类的配置
4)使用步骤
概述:其实就是创建一个配置类,用这个配置类去实现相关属性的映射
①.导入依赖
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.1.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</dependency>
</dependencies>
②.2.新建一个抽象类或者接口,作为映射的配置类,并标注@mapper-----mapstruct包下的注解 ,来表示这是mapStruct的映射配置
③.写对应的转换方法和映射规则,并创建本类的静态调用实现
④.获取对象并实现。
5)相关注解的使用例子
①.首先是例子中要用到的实体
package com.example.demo.beans;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class CarDTO {
private Long id;
private String vin;
//添加可变类,验证是否是深复制
private StringBuilder name;
private double price;
private double totalPrice;
private Date publishDate;
private String color;
private String brand;
private List<PartDTO> partsDTOS;
private DriverDTO driverDTO;
}
package com.example.demo.beans;
import lombok.Data;
@Data
public class DriverDTO {
private Long id;
private String name;
}
package com.example.demo.beans;
import lombok.Data;
@Data
public class PartDTO {
private Long partId;
private String partName;
}
package com.example.demo.vo;
import lombok.*;
@Data
public class CarVO {
private Long id;
private String vin;
//添加可变类,验证是否是深复制
private StringBuilder name;
private Double price;
private String totalPrice;
private String publishDate;
private String color;
private String brandName;
private Boolean hasPart;
private DriverVO deiverVO;
}
package com.example.demo.vo;
import lombok.Data;
@Data
public class DriverVO {
private Long deiverId;
private String fullName;
}