一 什么是MapStruct?
在开发中你可曾遇到如下这样的问题?MyBtatis从数据库中查询的数据映射到domain的实体类上,然后有时候需要将domain的实体类映射给前端的VO类,用于展示。 如下所示,假如User是domain,而给前端展示的为UserVO。
@Test
public void test001() {
User user = new User();
user.setId(1).setEmail("84519548@qq.com").setUserName("tang").setBirthday(new Date()).setTel("18774149799");
UserVo userVo = new UserVo();
userVo.setId(userVo.getId());
userVo.setEmail(userVo.getEmail());
}
有没有什么优雅的解决方式呢?可能你的第一反应就是使用Spring的BeanUtils.copyProperties (),但是BeanUtils.copyProperties ()只能转换类中字段名字一样且类型一样的字段。
由于BeanUtils.copyProperties ()采用的是反射,实际上当重复调用时效率是比较低的。(实际测试实际测试Spring的BeanUtils在生成 次数为1000000时需要1.6秒,而使用MapStruct仅需要69毫秒)
idea也为我们提供了插件mapstruct suppor
支持
二 如何使用MapStruct
2.1 引入MapStruct依赖
<properties>
<lombok.version>1.18.12</lombok.version>
<mapstruct.version>1.4.2.Final</mapstruct.version>
</properties>
<!--MapStruct相关依赖-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>compile</scope>
</dependency>
<!--需要加上下面这个插件,不然会报错ClassNotFoundException-->
<build>
<plugins>
<!-- MapStruct 编译器插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
2.2 创建我们所需要的案例实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class User {
private Integer id ;//用户id
private String userName;//用户名
private String password; //密码
private Date<