本文正在参与「金石方案」

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 用于标示接口办法或许参数,指示源特点与目标特点之间的映射联系。可以经过sourcetarget特点指定源和目标特点的称号。
@Mappings 用于标示多个@Mapping注解,方便在一个接口办法中界说多个特点的映射联系。

@Mapper注解常用特点:

  • componentModel特点:默认值为default。在Spring项目中经过主动注入的办法运用MapStruct Mapper类,需要将componentModel特点的特点值改为spring
  • unmappedTargetPolicy特点:指定目标目标中未映射特点的处理战略。默以为IGNORE,表示疏忽未映射的特点。其他可选值包括WARNERRORREPORT

集成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 {
	@Resource
	private UserMapper userMapper;
	@Test
	public 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 | 集成MapStruct实现不同类型Java对象间的自动转换

简略封装

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> {
}