1. mapstruct简介
不同的转化工具类的描述:
工具 | 描述 |
---|---|
org.mapstruct | 基于jsr269实现在编译期间生成代码,性能高,精细控制,解耦 |
net.sf.dozer | 最后更新在2014年,对新的类型映射不了,如:java.time.LocalDateTime |
org.springframework.beans.BeanUtils | 简单易用,不能对属性进行定制处理 |
2. mapstruct使用
2.1 添加依赖
<mapstruct.version>1.5.3.Final</mapstruct.version>
<!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<scope>provided</scope>
<version>${mapstruct.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-processor -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
2.2 @Mapper
默认映射规则:
- 同类型且同名的属性,会自动映射
- mapstruct会自动进行类型转换
- 8种基本类型和对应的包装类型之间会自动转换
- 8种基本类型和对应的包装类型 与 String类型会自动转换
- 日期类型(Date,LocalDate,LocalDateTime)与String之间会自动转换
2.2.1 使用Spring获取bean的方式获取转换器
@Mapper(componentModel = "spring")
注意,此时就无需配置Converter INSTANCE = Mappers.getMapper(Converter.class);
原理就是在生成的实现类中加上@Component
2.3 @Mapping和@Mappings
指定属性之间的映射关系
2.3.1 指定保留两位小数
@Mapping(source = "price", target = "price", numberFormat = "#.00")
2.3.2 日期格式化
@Mapping(source = "date", target = "date", dateFromat = "yyyy-MM-dd HH:mm:ss")
2.3.3 忽略
@Mapping(target = "createUser", ignore = true)
2.3.4 属性名称不同
@Mapping(source = "brand", target = "brandName")
2.3.4 属性是引用对象的处理
2.3.4.1 如果引用对象之间的属性名相同,则不需要其他处理
@Mapping(target = "computerVo", source = "computerDto")
ThemeVo dtoToVo(ThemeDto themeDto);
2.3.4.2 如果引用对象之间的属性名不相同,则需要再写一个转换方法
@Mapping(target = "computerVo", source = "computerDto")
ThemeVo dtoToVo(ThemeDto themeDto);
@Mapping(target = "voId", source = "dtoId")
@Mapping(target = "voName", source = "dtoName")
ComputerVo computerDtoToComputerVo(ComputerDto computerDto);
2.4 @AfterMapping 和 @MappingTarget
在映射最后一步对属性的自定义映射处理
2.5 @BeanMapping
@BeanMapping(ignoreByDefault = true)
忽略mapstruct的默认映射行为,只映射@Mapping
配置的属性
2.6 @InheritInverseConfiguration
继承已有映射,注意:只继承@Mapping注解,不会继承@BeanMapping
@InheritInverseConfiguration(name = "需要继承的方法名")