MapStruct简介

MapStruct is a code generator that greatly simplifies the implementation of mappings between Java bean types based on a convention over configuration approach.
The generated mapping code uses plain method invocations and thus is fast, type-safe and easy to understand.
—— 引自MapStruct官网

MapStruct是一个开源的代码生成器,极大地简化了从一种Java对象到另一种Java对象的转换过程。
MapStruct罕用注解

注解阐明@Mapper用于标注Mapper接口,MapStruct依据接口定义主动生成Mapper实现类。@Mapping用于标注接口办法或者参数,批示源属性与指标属性之间的映射关系。能够通过source和target属性指定源和指标属性的名称。@Mappings用于标注多个@Mapping注解,不便在一个接口办法中定义多个属性的映射关系。
@Mapper注解罕用属性:

componentModel属性:默认值为default。在Spring我的项目中通过主动注入的形式应用MapStruct Mapper类,须要将componentModel属性的属性值改为spring。
unmappedTargetPolicy属性:指定指标对象中未映射属性的解决策略。默认为IGNORE,示意疏忽未映射的属性。其余可选值包含WARN、ERROR和REPORT。

集成MapStruct
增加MapStruct依赖
批改pom.xml文件,增加如下代码:
...
<properties>
<java.version>1.8</java.version>
<lombok.version>1.18.24</lombok.version>
<mapstruct.version>1.5.3.Final</mapstruct.version>
</properties>
...
<dependencies>
<dependency>

<groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version>

</dependency>
<dependency>

<groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${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>${java.version}</source>    <target>${java.version}</target>    <annotationProcessorPaths>      <path>        <groupId>org.mapstruct</groupId>        <artifactId>mapstruct-processor</artifactId>        <version>${mapstruct.version}</version>      </path>      <path>        <groupId>org.projectlombok</groupId>        <artifactId>lombok</artifactId>        <version>${lombok.version}</version>      </path>      <path>        <groupId>org.projectlombok</groupId>        <artifactId>lombok-mapstruct-binding</artifactId>        <version>0.2.0</version>      </path>    </annotationProcessorPaths>  </configuration></plugin>

</plugins>
</build>
复制代码
阐明:

mapstruct-processor:MapStruct注解处理器。

入门示例:属性完全相同
1、创立一个实体类 —— User.java
package cn.ddcherry.springboot.demo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class User {

private String id;private String usercode;private String name;

}
复制代码
2、创立一个DTO类 —— UserDto.java
package cn.ddcherry.springboot.demo.dto;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class UserDto {

private String id;private String usercode;private String name;

}
复制代码
阐明:
实体类和DTO类的属性(类型、名称)完全相同。
3、创立一个转换器类 —— UserMapper.java
package cn.ddcherry.springboot.demo.mapper;

import cn.ddcherry.springboot.demo.dto.UserDto;
import cn.ddcherry.springboot.demo.entity.User;
import org.mapstruct.Mapper;

import java.util.List;

@Mapper(componentModel = "spring")
public interface UserMapper {

UserDto toDto(User entity);User toEntity(UserDto dto);List<UserDto> toDto(List<User> entityList);List<User> toEntity(List<UserDto> dtoList);

}
复制代码
4、创立一个测试类 —— UserMapperTest.java
package cn.ddcherry.springboot.demo;

import cn.ddcherry.springboot.demo.dto.UserDto;
import cn.ddcherry.springboot.demo.entity.User;
import cn.ddcherry.springboot.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
public class UserMapperTest {

@Resourceprivate UserMapper userMapper;@Testpublic void testEntityToDto() {    User user = new User("001", "user-001", "嗨皮汪小成");    UserDto dto = userMapper.toDto(user);    System.out.println(dto);}

}
复制代码
输入后果:
UserDto(id=001, usercode=user-001, name=嗨皮汪小成)
复制代码
程序运行胜利后,咱们能够在IDEA中关上target目录下的class文件,看一下MapStruct主动生成的转换器实现。笔者汪小成截取了toDto(...)和toDtoList(...)两个办法的实现,如下图:

简略封装
在Spring Boot我的项目中,咱们能够将Entity与DTO间转换的办法提取到一个根底转换器中,其它所有须要进行Entity与DTO转换的类都继承这个类。
根底转换器类 —— BaseMapper.java
package cn.ddcherry.springboot.demo.mapper;

import java.util.List;

public interface BaseMapper<D, E> {

D toDto(E entity);E toEntity(D dto);List<D> toDto(List<E> entityList);List<E> toEntity(List<D> dtoList);

}
复制代码
一个具体转换器类 —— UserMapper.java
package cn.ddcherry.springboot.demo.mapper;

import cn.ddcherry.springboot.demo.dto.UserDto;
import cn.ddcherry.springboot.demo.entity.User;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;

@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserMapper extends BaseMapper<UserDto, User> {
}