MapStruct 帮你节省60%的代码,提高开发效率

95 阅读2分钟

图片

MapStruct 是一个基于 Java 注解的代码生成器,它用于在 Java Bean 类型之间自动转换。它极大地简化了对象之间的映射工作,特别是在处理复杂对象图时。MapStruct 通过在编译时生成类型安全的映射代码来避免运行时反射,从而提高了性能和类型安全性。

MapStruct 的主要特点

  1. 类型安全:MapStruct 在编译时生成映射代码,因此类型错误在编译时就能被发现。
  2. 高性能:由于映射代码是在编译时生成的,因此避免了反射带来的性能开销。
  3. 易于使用:通过简单的注解和接口定义,即可实现复杂的映射逻辑。
  4. 可扩展:支持自定义映射逻辑和表达式。

使用 MapStruct 的基本步骤

  1. 添加依赖:首先,你需要在你的项目中添加 MapStruct 的依赖。如果你使用 Maven,可以在 pom.xml 中添加如下依赖(注意替换为最新版本):

    <dependency>  
        <groupId>org.mapstruct</groupId>  
        <artifactId>mapstruct</artifactId>  
        <version>你的版本号</version>  
        <scope>provided</scope>  
    </dependency>  
    <dependency>  
        <groupId>org.mapstruct</groupId>  
        <artifactId>mapstruct-processor</artifactId>  
        <version>你的版本号</version>  
        <scope>provided</scope>  
    </dependency>
    

    对于 Gradle,可以在 build.gradle 文件中添加:

    implementation 'org.mapstruct:mapstruct:你的版本号'  
    annotationProcessor 'org.mapstruct:mapstruct-processor:你的版本号'
    
  2. 定义 Mapper 接口:创建一个接口,并使用 @Mapper 注解标记它。然后,在该接口中定义映射方法。MapStruct 会自动生成这个接口的实现。

  3. 使用 Mapper:在你的代码中,直接注入 Mapper 接口(如果你使用 Spring,可以通过 @Autowired 注入),并调用其映射方法。

使用示例

假设我们有两个简单的 Java Bean:CarCarDto

public class Car {  
    private String make;  
    private int numberOfSeats;  
    // 省略构造器、getter 和 setter  
}  
  
public class CarDto {  
    private String manufacturer;  
    private int seatCount;  
    // 省略构造器、getter 和 setter  
}

我们可以定义一个 Mapper 接口来映射 CarCarDto

@Mapper  
public interface CarMapper {  
  
    CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);  
  
    @Mapping(source = "make", target = "manufacturer")  
    @Mapping(source = "numberOfSeats", target = "seatCount")  
    CarDto carToCarDto(Car car);  
  
    // 如果需要,也可以定义反向映射  
    @Mapping(source = "manufacturer", target = "make")  
    @Mapping(source = "seatCount", target = "numberOfSeats")  
    Car carDtoToCar(CarDto carDto);  
}

在这个例子中,@Mapping 注解用于指定源属性和目标属性之间的映射关系。MapStruct 会自动生成 CarMapper 接口的实现,并在编译时生成映射代码。

注意事项

  • 确保你的 IDE 或构建工具(如 Maven 或 Gradle)配置了注解处理器,以便在编译时生成 MapStruct 的实现代码。

  • MapStruct 生成的代码是依赖于你的 Mapper 接口定义的,因此任何对 Mapper 接口的修改都需要重新编译项目。

  • MapStruct 支持复杂的映射逻辑,包括嵌套对象、集合、条件映射等。你可以通过自定义方法、表达式或 @AfterMapping@BeforeMapping 注解来扩展映射逻辑。

更多资源请关注微信公众号:IT技术馆