Java处理类转换-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。

 

用法:

1、代码自动补全

在编写映射关系target和source的过程中,按下代码提示键(我的是CTRL+ALT + /),能自动给出代码提示。

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

2、链接跳转

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

基于Maven的使用方法

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.4.1.Final</version>
        </dependency>

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.4.1.Final</version>
            <scope>provided</scope>
        </dependency>

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文件中指定编译顺序,具体如下:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.28</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.4.1.Final</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

 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());
    }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 开发中,经常会遇到需要将一个的属性转换为另一个的属性的情况。这通常需要写很多重复的代码。为了减少这些重复的代码,可以使用 MapStruct 这个工具来处理恼人的 bean 转换MapStruct 是一个基于注解的 Java Bean 映射工具,它可以根据注解自动生成 Bean 映射代码。使用 MapStruct 可以让 bean 转换变得更加简单和高效。 接下来,我将介绍如何使用 MapStruct 处理 bean 转换。 1. 添加依赖 首先,需要在项目中添加 MapStruct 的依赖。可以在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> ``` 2. 创建转换接口 创建一个转换接口,用于定义源和目标之间的映射关系。例如,如果要将 User 转换为 UserDto ,可以创建以下接口: ```java @Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); UserDto toUserDto(User user); } ``` 在接口上添加 @Mapper 注解,表示这是一个 MapStruct 映射接口。在接口中定义一个 toUserDto 方法,用于将 User 转换为 UserDto 。 3. 编写转换代码 在 toUserDto 方法中,使用 MapStruct 提供的映射注解来指定属性的映射关系。例如,以下代码将 User 的 name 属性映射到 UserDto 的 username 属性: ```java @Mapping(source = "name", target = "username") UserDto toUserDto(User user); ``` 4. 执行转换 创建一个 User 对象,并将其转换为 UserDto 对象: ```java User user = new User("Tom", 18); UserDto userDto = UserMapper.INSTANCE.toUserDto(user); ``` 使用 MapStruct 处理 bean 转换非常简单。只需定义一个转换接口,并在其中使用映射注解指定属性的映射关系,就可以自动生成 bean 映射代码。这样可以大大减少编写重复代码的工作量,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值