共计 4137 个字符,预计需要花费 11 分钟才能阅读完成。
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 {
@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 我的项目中,咱们能够将 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> {
}