是一种实体类的映射框架,能够通过Java注解将一个实体类的属性安全的赋值给另一个实体类。
VO
展示层对象,后端返回给前端的数据封装对象。数据库存储所有的字段,而前端展示时不需要所有的字段,将需要使用的封装为一个对象VO返回给前端。
PO
请求参数对象,controller在处理请求是传递给controller的请求数据封装对象。
DTO
数据传输对象,将来自不同数据源的数据进行封装,比如来自mysql的多张表、es、neo4j等。
依赖引入
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${org.mapstruct.version}</version>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
转换类示例
@Mapper(componentModel = "spring")
public interface ObjectConverter {
ObjectConverter INSTANCE = Mappers.getMapper(ObjectConverter.class);
@Mappings({
@Mapping(target = "", ignore = true)
})
ObjectDto po2DTO(ObjectPO objectPO);
}
MapStruct默认的一些映射规则
- 八种基本类型 <-> 八种基本类型的包装类 <-> String类型
- 日期类 <-> String类型
- 同名同类型的属性会自动映射赋值
@Mappings和@Mapping注解
source 源目标属性的名称 (转化前)
target 目标对象的属性名称 (转化后)
numberFormat 格式化数字类型(如:numberFormat = “#.00” 保留两位小数)
dateFormat 格式化日期类型(如:dateFormat = “yyyy-MM-dd HH:mm:ss”)
ignore 转换为的target对象忽略某个属性@Mapping(target = "color" ignore = true)
CarVO对象则不转换来自source的color属性
属性是引用类型的转换
转换类中定义抽象方法或默认方法声明引用类型属性的转换规则
// public default CarVO carDTO2CarVO(CarDTO carDTO) {}
@Mapping(source = "cid" target = "id")
@Mapping(source = "fullName" target = "name")
DriverVO DriverDTO2DriverVO(DriverDTO driverDTO);
@AfterMapping和@MappingTarget
@AfterMapping(修饰方法)表明该方法在MapStruct进行转换后调用,@MappingTarget(修饰方法参数)表明该参数已经赋值。两者配合后可以进行自定义属性的赋值。
批量转换
在converter接口中添加批量转换的方法
List<CarVO> carDTOList2CarVOList(List<CarDTO> carDTOList);
@BeanMapping注解
@BeanMapping(ignoreByDefault = true)
取消默认的映射行为,避免不需要的赋值
@InheritConfiguration
- 更新对象
CarVO updateCarVOByCarDTO2(CarVo carVo, @MappingTarget CarDTO2 carDTO2)
//用新的CarDTO2对象更新CarVO对象
@InheritInverseConfiguration注解
反向继承,name属性表示继承哪个方法的Mapping配置,由A -> B,也可实现B -> A