概述
What is it?
MapStruct是一个代码生成器,它基于约定优于配置的方法极大地简化了Java bean类型之间映射的实现。
生成的映射代码使用简单的方法调用,因此快速,类型安全且易于理解。
Why?
多层应用程序通常需要在不同的对象模型(例如实体和DTO)之间进行映射。编写此类映射代码是一项繁琐且容易出错的任务。MapStruct旨在通过使其尽可能自动化来简化这项工作。
与其他映射框架相比,MapStruct在编译时生成Bean映射,以确保高性能,允许快速的开发人员反馈和彻底的错误检查。
How?
MapStruct是一个注释处理器,已插入Java编译器,可用于命令行构建(Maven,Gradle等),也可用于您首选的IDE中。
MapStruct使用合理的默认值,但是在配置或实现特殊行为时会避开您的使用。
以上内容引用自MapStruct官网。
项目整合
1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</dependency>
2、创建实体类与转换类
@Data
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class UserInfo {
private String name;
private Integer userId;
private String email;
private String info;
}
@Data
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class UserInfoDto {
private String name;
private Integer userId;
private String email;
private String value;
}
简化学习成本,只有一个字段不同。。
3、编写Mapper接口
要生成一个UserInfoDto 与UserInfo 对象相互转换的映射器,我们需要定义一个mapper接口。像这两个实体类有些属性不一样时,我们可以通过@Mapping注解来进行转换。
@Mapper注解标记这个接口作为一个映射接口,并且是编译时MapStruct处理器的入口。
@Mapping解决源对象和目标对象中,属性名字不同的情况。
Mappers.getMapper自动生成的接口的实现可以通过Mapper的class对象获取,从而让客户端可以访问Mapper接口的实现。
@Mapper
public interface UserMapper {
UserMapper USER_MAPPER = Mappers.getMapper(UserMapper.class);
/**
* @author
* @date 2020-12-01 19:54
* @param userInfo
* @return com.mapstructsdemo.mapstructs.dto.UserInfoDto
* @throws
* @description
* source 代表转换的源。这里就是UserInfo 。
* target 代表转换的目标。这里是UserInfoDto 。
*/
@Mapping(target = "value" ,source = "info")
UserInfoDto userInfo2UserInfoDto(UserInfo userInfo);
}
4、运行SpringBoot项目
也可以使用maven编译。在项目运行启动后,可以在项目的target目录下,发现自动生成了一个实现类,如图:
内容如下:
public class UserMapperImpl implements UserMapper {
public UserMapperImpl() {
}
public UserInfoDto userInfo2UserInfoDto(UserInfo userInfo) {
if (userInfo == null) {
return null;
} else {
UserInfoDto userInfoDto = new UserInfoDto();
userInfoDto.setValue(userInfo.getInfo());
userInfoDto.setName(userInfo.getName());
userInfoDto.setUserId(userInfo.getUserId());
userInfoDto.setEmail(userInfo.getEmail());
return userInfoDto;
}
}
}
5、测试
public class MapStructsTest {
public static void main(String[] args) {
UserInfo userInfo = new UserInfo("xiaowang",1,"123@qq.com","haha");
UserInfoDto userInfoDto = UserMapper.USER_MAPPER.userInfo2UserInfoDto(userInfo);
System.out.println(userInfoDto.toString());
}
}
执行main方法后,可以看到控制台打印结果: