PO VO DTO 高效、优雅的对象Copy之MapStruct入门到精通

MapStruct 是一个 Java 注解处理器框架,用于生成类型安全的 Bean 映射代码。它可以自动生成源对象和目标对象之间的映射代码,从而简化了开发者在对象转换方面的工作。通过在接口方法上添加注解来指定映射规则,MapStruct 可以自动创建实现该接口的类。

MapStruct 的主要优点包括:

  1. 类型安全:MapStruct 会检查源对象和目标对象之间的类型,以确保类型匹配。
  2. 简单易用:MapStruct 提供了简洁的注解来定义映射规则,使得开发人员可以轻松地为复杂的对象建立映射。
  3. 性能高效:由于 MapStruct 生成的是原生 Java 代码,因此它的运行速度非常快。
  4. 可扩展性强:MapStruct 提供了许多扩展点,允许开发人员自定义映射逻辑或提供自定义的转换器。

MapStruct 不仅支持基本数据类型、Java 标准库和第三方库中的对象之间的映射,还支持自定义类型转换和多个对象之间的映射。

2、以下是几个使用 MapStruct 进行对象映射的示例:

  1. 简单映射

假设我们有两个类 SourceTarget,它们的属性类型一致且名称相同。我们可以通过以下方式进行简单的映射:

@Mapper
public interface SimpleMapper {
    SimpleMapper INSTANCE = Mappers.getMapper(SimpleMapper.class);
 
    Target sourceToTarget(Source source);
}

上面的代码中,我们使用了 MapStruct 提供的 @Mapper 注解标注了接口,并定义了一个方法 sourceToTarget(),它将 Source 对象转换为 Target 对象。

  1. 自定义映射

假设我们想将 Source 中的 id 属性映射到 Targetidentifier 属性中。我们可以通过在 @Mapping 注解中指定源属性和目标属性的名称来实现:

@Mapper
public interface CustomMapper {
    CustomMapper INSTANCE = Mappers.getMapper(CustomMapper.class);
 
    @Mapping(source = "id", target = "identifier")
    Target sourceToTarget(Source source);
}
  1. 使用表达式进行映射

假设我们有一个 Source 类,其中包含一个日期字符串 dateStr,我们需要将其转换为 LocalDate 类型的属性 date。我们可以使用表达式来完成这项任务:

@Mapper
public interface ExpressionMapper {
    ExpressionMapper INSTANCE = Mappers.getMapper(ExpressionMapper.class);
 
    @Mapping(target = "date", expression = "java(java.time.LocalDate.parse(source.getDateStr()))")
    Target sourceToTarget(Source source);
}

在上面的代码中,我们使用了 expression 属性来指定映射规则,并调用了 java.time.LocalDate.parse() 方法将日期字符串转换为 LocalDate 类型。

这些示例只是 MapStruct 的一个小部分功能。还有很多其他的注解和选项可以帮助您完成更复杂的对象映射任务。

3、简单示例:

  1. 首先,需要在项目的 pom.xml 文件中添加 MapStruct 依赖:
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.4.2.Final</version>
</dependency>
  1. 创建一个源对象和目标对象,例如:
public class SourceObject {
    private String name;
    private int age;
    // getter and setter
}
 
public class TargetObject {
    private String name;
    private int age;
    // getter and setter
}
  1. 创建一个 Mapper 接口,其中定义了源对象和目标对象之间的转换方法:
@Mapper
public interface MyMapper {
    MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);
    TargetObject sourceToTarget(SourceObject source);
}
  1. 实现 Mapper 接口中的方法:
public class MyMapperImpl implements MyMapper {
 
    @Override
    public TargetObject sourceToTarget(SourceObject source) {
        TargetObject target = new TargetObject();
        target.setName(source.getName());
        target.setAge(source.getAge());
        return target;
    }
}
  1. 在应用程序中使用 Mapper 接口进行对象映射:
SourceObject source = new SourceObject();
source.setName("Bob");
source.setAge(30);
 
TargetObject target = MyMapper.INSTANCE.sourceToTarget(source);
 
System.out.println(target.getName()); // 输出 "Bob"
System.out.println(target.getAge()); // 输出 30
请登录后发表评论

    没有回复内容