一、Mapstruct使用教程
Mapstruct是一个Java基于注解的Bean映射工具,它可以通过注解为不同类型的Java Bean自动生成映射器代码,以实现不同类型Java Bean之间属性的复制。下面我们来看一下如何在项目中使用Mapstruct:
1、添加依赖
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.1.Final</version>
</dependency>
</dependencies>
2、配置Maven插件
在pom.xml文件中添加Mapstruct的Maven插件,以在编译时自动生成映射器代码:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
3、定义映射器接口
创建一个接口,使用MapStruct注解定义映射关系和转换规则。
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
CarDTO carToCarDTO(Car car);
List<CarDTO> carsToCarDTOs(List<Car> cars);
}
4、使用映射器接口
现在可以使用在上一步中定义的映射器接口进行转换。比如:
public class CarService {
public CarDTO getCarById(int id) {
Car car = carDao.getCarById(id);
return CarMapper.INSTANCE.carToCarDTO(car);
}
}
二、Mapstruct原理
MapStruct是通过自动生成Java映射器实现属性映射的。它的工作原理如下:
1、生成源代码
在编译时,MapStruct会扫描所有使用@Mapper注解的接口,然后自动生成Java代码来实现这些接口。这些Java代码包括源Bean和目标Bean之间属性的映射代码。
2、生成映射器实例
编译后,MapStruct会将生成的Java代码打包成一个.jar文件,然后被添加到项目的classpath中。这时,就可以使用Mappers.getMapper()静态方法获取映射器实例来实现Bean属性映射。
3、根据注解生成Mapper代码
在定义@Mapper注解时,使用source和target属性来指定映射源Bean和目标Bean。使用@Mapping注解来规定源Bean和目标Bean属性之间的映射关系。同时,MapStruct允许开发者自定义映射规则,比如类型转换等。
三、Mapstruct用法
1、使用默认规则
MapStruct具有一些默认规则,比如基本类型之间的映射,容器之间的映射等。如果源Bean和目标Bean的属性名称相同且类型相同,就无需额外的映射定义。
2、使用@Mapper注解
在过程中,可以使用@Mapper注解来定义属性映射规则。在@Mapper注解上设置componentModel属性的值为spring,可以使用@Autowired来注入Mapper。
@Mapper(componentModel = "spring")
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(source = "numberOfSeats", target = "seatCount")
CarDTO carToCarDTO(Car car);
List<CarDTO> carsToCarDTOs(List<Car> cars);
}
3、使用@MapperConfig注解
可以在使用@Mapper注解的类上使用@MapperConfig注解设置映射器的通用配置,从而省略每个映射器的相同重复代码。
@MapperConfig(
componentModel = "spring",
nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
public interface MappingConfig {}
4、使用@Mappings注解
@Mappings注解用于集中配置常用的@Mapping注解规则,以避免在每个映射器中都重复编写单个规则。
@Mapper(componentModel = "spring")
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mappings({
@Mapping(source = "numberOfSeats", target = "seatCount"),
@Mapping(source = "type", target = "model"),
@Mapping(source = "price", target = "price", numberFormat = "$#.00")
})
CarDTO carToCarDTO(Car car);
}
5、Spring Boot配置生命周期回调
在Spring Boot应用程序中使用MapStruct时,可以实现映射器接口上的SpringBean映射,使用@PostConstruct启动映射器。
@Mapper(componentModel = "spring")
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@PostConstruct
default void init() {
// Do Some initialization work
}
...
}
四、Mapstruct设置默认值
1、使用@DefaultValue注解
可以使用@DefaultValue注解在源Bean属性为空时设置默认值。
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(source = "numberOfSeats", target = "seatCount")
@Mapping(source = "type", target = "model")
@Mapping(target = "price", numberFormat = "$#.00")
@Mapping(target = "description", defaultValue = "This car has no description.")
CarDTO carToCarDTO(Car car);
}
2、使用@CollectionMapping注解
在@CollectionMapping注解中,通过使用@IterableMapping或者@MapMapping注解可以设置集合属性的默认值。
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(source = "numberOfSeats", target = "seatCount")
@IterableMapping(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
List<String> featuresToFeatureNames(List<Feature> features);
}
以上就是关于Mapstruct使用的详细讲解。它可以让我们在编写JavaBean之间复制属性时更加方便,提高了开发效率。在实际项目中使用Mapstruct,可以让我们更加专注于业务逻辑的实现。
原创文章,作者:SSLRK,如若转载,请注明出处:https://www.506064.com/n/330937.html