关于MapStruct的使用教程

 更新时间:2025年02月08日 15:28:09   作者:wujiada001  
MapStruct 是一个用于 Java Bean 映射的代码生成器,通过注解处理器自动生成映射代码,以下是 MapStruct 的基本使用方法:添加依赖、定义映射接口、使用映射方法、定义自定义映射方法、处理复杂映射、集成 Spring 等

MapStruct的使用

MapStruct 是一个代码生成器,它使用注解处理器来实现 Java bean 之间的映射。

MapStruct 通过在编译时自动生成映射代码,减少了手动编写映射代码的工作量,并帮助保持代码的一致性和准确性。

以下是 MapStruct 的基本使用方法:

1. 添加依赖

首先,你需要在项目的构建配置中添加 MapStruct 的依赖。对于 Maven 和 Gradle,添加如下依赖:

  • Maven:
<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.4.2.Final</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.4.2.Final</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>
  • Gradle:
dependencies {
    implementation 'org.mapstruct:mapstruct:1.4.2.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
}

2. 定义映射接口

创建一个接口,并使用 @Mapper 注解标注,这个接口将定义源对象和目标对象之间的映射规则。

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public interface MyMapper {
    MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);

    // 定义从源对象到目标对象的映射方法
    TargetObject map(SourceObject source);
}

3. 使用映射方法

在业务逻辑中,你可以使用定义的映射接口来转换对象。

public class MyService {
    public TargetObject convert(SourceObject source) {
        return MyMapper.INSTANCE.map(source);
    }
}

4. 定义自定义映射方法

如果需要自定义映射逻辑,可以定义一个带有 @Mapping 注解的方法,并在其中指定映射规则。

@Mapper
public interface MyMapper {
    @Mapping(target = "targetProperty", source = "sourceProperty")
    @Mapping(target = "targetProperty2", expression = "java(String.valueOf(source.getSourceProperty2()))")
    TargetObject map(SourceObject source);
}

5. 处理复杂映射

在这个例子中,@Mapping注解用于指定源对象和目标对象之间的属性映射关系。source属性指定源对象的属性名,target属性指定目标对象的属性名。

@Mapper
public interface MyMapper {
    @Mapping(target = "dateOfBirth", source = "birthYear", qualifiedByName = "yearToCalendar")
    TargetObject map(SourceObject source);

    @Named("yearToCalendar")
    default Date yearToCalendar(int year) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, Calendar.JANUARY, 1);
        return calendar.getTime();
    }
}

对于更复杂的映射场景,比如需要转换数据类型或者调用方法,MapStruct 也提供了相应的注解来支持。

  1. 自定义映射:可以使用@Mapping注解的expressionqualifiedByName属性来自定义映射逻辑。
  2. 集合映射:可以使用@IterableMapping@MapMapping注解来处理集合类型的映射。
  3. 枚举映射:可以直接映射枚举类型,或者通过@Mapping注解的enumNamed属性来指定枚举的映射规则。
  4. 使用构造函数映射:如果目标类有构造函数,可以使用@Mapping注解的constructor属性来指定使用构造函数进行映射。
  5. 嵌套属性映射:可以映射嵌套的对象属性。
  6. 反向映射:可以定义一个反向映射方法,并使用@Mapping注解的inverse属性来引用正向映射方法。
  7. 使用装饰器增强Mapper:可以使用@DecoratedWith注解来装饰Mapper接口,以实现更复杂的映射逻辑。
  8. 映射继承:可以通过继承来共享映射配置。
  9. 使用@BeforeMapping和@AfterMapping进行预处理和后处理:可以在映射方法执行前后执行自定义的逻辑。
  10. 使用@Context传递上下文参数:可以在映射方法中传递额外的上下文参数。

6. 集成 Spring

MapStruct还可以与Spring框架集成,允许在映射器中注入Spring管理的bean。

这需要在Mapper接口上使用@Mapper(componentModel = "spring")注解来指定Spring作为组件模型。然后,可以使用@Autowired注解来注入Spring管理的bean。

@Mapper(componentModel = "spring")
public interface MyMapper {
    TargetObject map(SourceObject source);
}

这样,MapStruct 映射器就可以作为 Spring Bean 进行自动装配。

通过使用 MapStruct,你可以减少手动编写的样板代码,提高开发效率,并减少因手动映射而产生的错误。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IDEA安装阿里巴巴编码规范插件的两种方式详解(在线安装和离线安装)

    IDEA安装阿里巴巴编码规范插件的两种方式详解(在线安装和离线安装)

    这篇文章主要介绍了IDEA安装阿里巴巴编码规范插件的两种方式详解(在线安装和离线安装),本文通过截图给大家展示的非常详细,需要的朋友可以参考下
    2021-09-09
  • Java中常见的XML解析方法与应用详解

    Java中常见的XML解析方法与应用详解

    XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,被广泛应用于表示和交换独立于应用程序和硬件平台的结构化信息,下面我们就来看看它的常见解析方法有哪些吧
    2024-01-01
  • Java使用字节流复制文件的方法

    Java使用字节流复制文件的方法

    这篇文章主要为大家详细介绍了Java使用字节流复制文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java中泛型的使用和优点解析

    Java中泛型的使用和优点解析

    这篇文章主要介绍了Java中泛型的使用和优点解析,泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法,需要的朋友可以参考下
    2023-09-09
  • Maven中Could not find artifact XXXX的错误解决

    Maven中Could not find artifact XXXX的错误解决

    本文主要介绍了Maven中Could not find artifact XXXX的错误解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 在SpringBoot中,如何使用Netty实现远程调用方法总结

    在SpringBoot中,如何使用Netty实现远程调用方法总结

    我们在进行网络连接的时候,建立套接字连接是一个非常消耗性能的事情,特别是在分布式的情况下,用线程池去保持多个客户端连接,是一种非常消耗线程的行为.那么我们该通过什么技术去解决上述的问题呢,那么就不得不提一个网络连接的利器——Netty,需要的朋友可以参考下
    2021-06-06
  • Spring Boot与Spring Security的跨域问题解决方案

    Spring Boot与Spring Security的跨域问题解决方案

    跨域问题是指在Web开发中,浏览器出于安全考虑,限制了不同域名之间的资源访问,本文重点给大家介绍Spring Boot与Spring Security的跨域问题解决方案,感兴趣的朋友一起看看吧
    2023-09-09
  • MyBatis如何实现多表查询(多对一、一对多)

    MyBatis如何实现多表查询(多对一、一对多)

    这篇文章主要给大家介绍了关于MyBatis如何实现多表查询(多对一、一对多)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 解决java数值范围以及float与double精度丢失的问题

    解决java数值范围以及float与double精度丢失的问题

    下面小编就为大家带来一篇解决java数值范围以及float与double精度丢失的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • IDEA中安装testng插件过程

    IDEA中安装testng插件过程

    这篇文章主要介绍了IDEA中安装testng插件过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论