介绍
项目中遇到数据库返回的字段不想全部返回给前端,一个一个 setter 挺麻烦,不够优雅。市面上有挺多映射框架如 Dozer,Orika,MapStruct,ModelMapper,JMapper 等,其中 MapStruct 只是代码生成器,使用纯 Java 的方法调用源对象和目标对象之间进行映射,并非 Java 反射机制,所以其性能最好。
实现
Maven 依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
...
<properties>
<org.mapstruct.version>1.3.1.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.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
...
|
如果项目中有用到 lombok 的话,MapStruct 也支持,添加如下即可。
1
2
3
4
5
6
7
|
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
|
普通调用
MapStruct 定义非常简单,因为它完全基于代码生成。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface MapStructConverter {
MapStructConverter MAPPER = Mappers.getMapper(MapStructConverter.class);
@Mapping(source = "status", target = "orderStatus")
@Override
Order convert(SourceOrder sourceOrder);
@Override
DestinationCode convert(SourceCode sourceCode);
}
|
调用也很简单。
1
|
DestinationCode destinationCode = MapStructConverter.MAPPER.convert(sourceCode);
|
Spring 注解调用
Spring 项目的话可以如下参数实现依赖注入。
1
2
3
|
@Mapper(componentModel = "spring")
public interface MapStructConverter {
}
|
@Autowired 注入调用更方便。
1
2
3
4
|
@Autowired
private MapStructConverter mapStructConverter;
DestinationCode destinationCode = mapStructConverter.convert(sourceCode);
|
尾巴
其实这个问题困扰我很久了,之前一直想着用多态方式实现,没找到解决方法后也就用一个一个 setter 方式实现,现在想来很懒,以后还是多思考,多找找轮子,尽可能少写垃圾代码。
参考: