MapStruct的基本使用

前置—java注释处理器

Java注释处理器(Annotation Processor)是一种工具,用于在编译时处理Java源代码中的注解信息。作为Java编译器的一部分,负责扫描源代码中的注解,并根据这些注解生成额外的Java代码或执行其他与注解相关的操作

MapStruct的使用场景

当从数据库中查出来的PO对象中包含很多字段,但是在业务处理过程中需要处理的DTO包含PO中的部分字段,或者返回给前端的VO为DTO的部分字段,这就需要Class类转化,如果用构造器或者get()/set()方法,将会写大量冗余代码并且容易出错

面对这样的场景,采用MapStruct插件处理类转换是一个绝佳的选择。
 

MapStruct是什么?

MapStruct是一个Java注释处理器,用于简化Java Bean映射(对象之间的数据转换)的过程。

它允许开发人员定义映射规则,并自动生成映射代码,从而减少手动编写重复的映射代码的工作量。

MapStruct的目标是提供高性能、类型安全和可维护的映射代码,以简化开发人员在对象之间进行数据转换。

以下是MapStruct的一些关键特性和用途:

  1. 注解驱动:MapStruct使用注解来定义映射规则,开发人员可以使用注解来指定源对象到目标对象的映射方式。

  2. 编译时生成代码:MapStruct在编译时生成映射代码,这意味着生成的代码是类型安全的,不会导致运行时的类型错误。(注意:编译时生成)

  3. 支持自定义映射方法:除了自动生成的映射代码外,开发人员还可以编写自定义映射方法,以处理更复杂的映射场景。

  4. 支持集合映射:MapStruct可以自动处理集合(如List、Set、Map等)之间的映射,从而简化了集合数据的转换。支持集合类

  5. 性能优化:生成的映射代码经过优化,以提高映射操作的性能。

  6. 支持多个目标对象:MapStruct可以将数据从一个源对象映射到多个不同类型的目标对象,从而提高代码的重用性。

一个典型的映射器接口

@Mapper
public interface SourceToTargetMapper {
    SourceToTargetMapper INSTANCE = Mappers.getMapper(SourceToTargetMapper.class);
    TargetTest toDTO(SourceTest st);

}

使用MapStruct

idea 插件(可选)

IDEA中搜索"MapStruct Support"插件,进行安装,安装成功后重启IDEA。

 MapStruct的基本使用_第1张图片

用法:

1、代码自动补全

在编写映射关系target和source的过程中,按下代码提示键(我的是CTRL+ALT + /),能自动给出代码提示。MapStruct的基本使用_第2张图片

注意:这里原本的代码提示快捷键是CTRL+ENTER,但是和中文系统的输入法切换冲突,所以得换一下快捷键。更换快捷键

2、链接跳转

在参数上,按住 CTRL + 鼠标左键,能够自动进入参数所在类文件。

基于Maven的使用方法

        
            org.mapstruct
            mapstruct
            1.4.1.Final
        

        
            org.mapstruct
            mapstruct-processor
            1.4.1.Final
            provided
        

1、org.mapstruct:mapstruct:1.4.1.Final:这是MapStruct框架的主要依赖。它包含了MapStruct的运行时库。

2、org.mapstruct:mapstruct-processor:1.4.1.Final:这是MapStruct的注解处理器依赖。它是一个Maven的"provided"(提供的)依赖,这意味着它只在编译时需要,而不会包含在最终的构建输出中。MapStruct注解处理器负责在编译时扫描源代码,查找MapStruct的注解并生成映射代码

注意:这两个库都要引入,避免报错

mapstruct和lombok同时使用,若没有指定编译顺序,mapstruct先编译,lombok后编译,get和set方法还没有编译出来,mapstruct当然无法通过get set去生成实现类,会报错。

在这种情况下要在Pom文件中指定编译顺序,具体如下:

    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                
                    
                        
                            org.projectlombok
                            lombok
                            1.18.28
                        
                        
                            org.mapstruct
                            mapstruct-processor
                            1.4.1.Final
                        
                    
                
            
        
    

 MapStruct使用案例

创建源类

package com.example.demo.entity;
import lombok.Data;

@Data
public class SourceTest {
    Integer Id;
    String Name;
}

 创建目标类

package com.example.demo.entity;
import lombok.Data;

@Data
public class TargetTest {
    Integer Id;
    String Name;
}

创建转换器

package com.example.demo.Convert;

import com.example.demo.entity.SourceTest;
import com.example.demo.entity.TargetTest;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public interface SourceToTargetMapper {
    SourceToTargetMapper INSTANCE = Mappers.getMapper(SourceToTargetMapper.class);
    TargetTest toDTO(SourceTest st);

}

注意:这里引用的Mapper注解是org.mapstruct.Mapper,同时Mappers.getMapper()不写接收的变量时会爆红,当写完Instance后,正常。

    @Test
    void testConvert() {
        Integer id = 9527;
        String name = "mghio";
        SourceTest st = new SourceTest();
        st.setId(id);
        st.setName(name);
        TargetTest tt = SourceToTargetMapper.INSTANCE.toDTO(st);
        System.out.println(id==tt.getId());
        assertEquals(id, tt.getId());
        assertEquals(name, tt.getName());
    }

测试结果,相当于把原类型转换成了目标类型。测试通过。

你可能感兴趣的:(java,开发语言)