MapStruct:Java对象映射的自动化利器

作者: adm 分类: java 发布时间: 2024-05-07

1. 概述
MapStruct是一个用于Java Bean之间映射的代码生成器,它可以帮助我们在不同类型的Java对象之间进行转换,而无需手动编写转换代码。MapStruct能够自动生成类型安全的转换代码,减少了手动编写的工作量,提高了代码的可维护性。

2. 用途
MapStruct主要用于以下场景:

DTO与Entity转换:在分层架构中,DTO(数据传输对象)用于服务层与客户端之间的数据交换,而Entity则是持久层的数据模型。MapStruct能够自动将Entity转换为DTO,或将DTO转换为Entity,从而简化了数据交换的过程。
ViewModel与Model转换:在Web开发中,ViewModel通常用于前端展示,而Model则是后端的数据模型。MapStruct可以方便地将Model转换为ViewModel,或进行反向转换。
任意Java Bean之间的转换:MapStruct不仅限于上述场景,它还可以用于任意Java Bean之间的转换,只要这些Bean的字段之间存在映射关系。
3. 常用方法
@Mapper:标记一个接口为MapStruct的映射器接口。可以通过componentModel属性指定生成的实现类的类型(如Spring的组件)。
@Mapping:定义字段之间的映射关系。可以指定source(源字段)、target(目标字段)以及expression(表达式)等属性。
@Mappings:包含多个@Mapping注解,用于定义多个字段的映射关系。
@IterableMapping:用于定义集合类型的映射关系。
@BeanMapping:用于定义整个Bean的映射关系,可以包含ignoreUnmappedSourceProperties、ignoreUnmappedTargetProperties等属性。
4. 参数说明
source:指定源对象的字段名。
target:指定目标对象的字段名。
expression:用于定义字段映射的表达式,可以是Java方法调用、字符串连接等。
ignore:当设置为true时,忽略源字段的映射。
nullValueCheckStrategy:定义空值检查的策略。
5. 示例代码
假设有两个简单的Java Bean:Car和CarDto。
依赖

  
    org.mapstruct  
    mapstruct  
    1.2.0.Final  
  
public class Car {  
    private String make;  
    private int numberOfSeats;  
    // getters and setters  
}  
  
public class CarDto {  
    private String make;  
    private int seatCount;  
    // getters and setters  
}

11
使用MapStruct进行映射的接口定义

@Mapper(componentModel = "spring")  
public interface CarMapper {  
  
    @Mapping(source = "numberOfSeats", target = "seatCount")  
    CarDto carToCarDto(Car car);  
  
    @Mapping(source = "seatCount", target = "numberOfSeats")  
    Car carDtoToCar(CarDto carDto);  
}

在Spring Boot应用中,可以这样使用它

@Service  
public class CarService {  
  
    @Autowired  
    private CarMapper carMapper;  
  
    public CarDto getCarDtoById(Long id) {  
        Car car = carRepository.findById(id).orElse(null);  
        if (car != null) {  
            return carMapper.carToCarDto(car);  
        }  
        return null;  
    }  
  
    public Car saveCarFromDto(CarDto carDto) {  
        Car car = carMapper.carDtoToCar(carDto);  
        return carRepository.save(car);  
    }  
}

在上面的示例中,CarMapper接口被标记为Spring组件,因此Spring会自动扫描并创建它的实现。然后,在CarService中,通过自动装配的方式注入CarMapper,并使用它来进行对象之间的映射。
6. 总结
MapStruct通过注解驱动的方式,为Java对象之间的映射提供了一个高效且类型安全的解决方案。它极大地简化了手动编写映射代码的繁琐过程,提高了开发效率,并确保了代码的可维护性和可读性。无论是DTO与Entity之间的转换,还是其他Java Bean之间的映射,MapStruct都能轻松应对,成为Java开发者在对象映射领域的得力助手。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!