MapStruct使用教程(一)

1,182 阅读2分钟

image.png

简介

MapStruct是一个Java注解处理器,用于生成类型安全的bean映射类。使用MapStruct只需要定义一个映射器接口,声明任何所需的映射方法。在编译时,MapStruct将生成此接口的实现。此实现使用普通的Java方法调用,在源对象和目标对象之间进行映射,即没有反射或类似操作,和lombok类似在编译时生成代码。

优点

  • 与自己手动写映射代码相比,MapStruct通过生成繁琐且容易出错的代码,给开发人员节省大量时间。采用约定大于配置的方式,使用合理的默认值,但在配置或实现特殊行为时不会阻碍开发人员。
  • 与动态映射框架相比,MapStruct具有以下优点:
    • 用普通方法调用而不是反射,执行速度快
    • 编译时类型安全:只能映射相互映射的对象和属性,不会意外将订单实体映射到客户DTO等。
    • 在build时出现映射不完整(not all target properties are mapped),映射不正确(annot find a proper mapping method or type conversion)时会清晰地给出错误提示。

官方文档:mapstruct.org/documentati…
官方示例:github.com/mapstruct/m…

简单使用

安装

使用maven方式:

<properties>
  <org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${org.mapstruct.version}</version>
    </dependency>
</dependencies>

<build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.1</version>
              <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
                  <annotationProcessorPaths>
                      <path>
                          <groupId>org.projectlombok</groupId>
                          <artifactId>lombok</artifactId>
                          <version>${lombok.version}</version>
                      </path>
                      <path>
                          <groupId>org.mapstruct</groupId>
                          <artifactId>mapstruct-processor</artifactId>
                          <version>${org.mapstruct.version}</version>
                      </path>
                  </annotationProcessorPaths>
              </configuration>
          </plugin>
      </plugins>
  </build>

该版本基于jdk1.8+

准备测试数据

  1. 源对象
@Getter
@Setter
@AllArgsConstructor
public class User {
    private Long id;

    private String name;

    private Integer age;
}
  1. 目标对象
@Data
public class UserDTO {
    private Long id;
    private String name;
    private Integer age;
}

注意:源对象和目标对象都需要get,set方法,此处使用的lombok生成

定义映射接口

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserConverter {
    UserConverter MAPPER = Mappers.getMapper(UserConverter.class);

    /**
     * 默认相同名称进行隐式转换
     *
     * @param user
     * @return
     */
    UserDTO convert(User user);
}

@Mapper注解中unmappedTargetPolicy:表示目标对象未映射策略,默认是ReportingPolicy.WARN即有未映射的属性会在build的时候给出警告,示例中使用ReportingPolicy.IGNORE 表示忽略未映射的目标属性。默认名称相同的属性进行隐式转换。

应用

    @Test
    void testUser() {
        User user = new User(111L, "小城", 25);
        UserDTO dto = UserConverter.MAPPER.convert(user);
        System.out.println(dto); //结果:UserDTO(id=111, name=小城, age=25)
    }