mapstruct

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.Finalmapstruct.version>


<dependency>
    <groupId>org.mapstructgroupId>
    <artifactId>mapstructartifactId>
    <scope>providedscope>
    <version>${mapstruct.version}version>
dependency>

<dependency>
    <groupId>org.mapstructgroupId>
    <artifactId>mapstruct-processorartifactId>
    <version>${mapstruct.version}version>
    <scope>providedscope>
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 = "需要继承的方法名")

你可能感兴趣的:(java)