SpringBoot使用MapStruct生成映射代码的示例详解

 更新时间:2024年11月26日 11:06:01   作者:鹏阿鹏  
MapStruct 是一个用于 Java 的代码生成器,专门用于生成类型安全的 bean 映射代码,它通过注解处理器在编译时生成映射代码,从而避免了运行时的性能开销和潜在的错误,本文给大家介绍了SpringBoot使用MapStruct生成映射代码的示例,需要的朋友可以参考下

定义

MapStruct 是一个用于 Java 的代码生成器,专门用于生成类型安全的 bean 映射代码。它通过注解处理器在编译时生成映射代码,从而避免了运行时的性能开销和潜在的错误。

MapStruct 的主要目标是简化和加速 Java 对象之间的转换,特别是当这些对象具有相似的结构时。

相关概念

  • Mapper 接口 Mapper 接口定义了对象之间的映射方法。你可以通过在接口上使用 @Mapper
    注解来标记这个接口是一个映射器。MapStruct 会在编译时生成这个接口的实现类。
  • Mapping 注解 @Mapping 注解用于定义源对象和目标对象之间的字段映射关系。你可以在 Mapper
    接口的方法上使用这个注解来指定具体的映射规则。
  • Mappings 注解 @Mappings 注解是 @Mapping 注解的容器,用于定义多个字段映射。
  • Component Model 通过 componentModel 属性,你可以指定生成的 Mapper 实现类的组件模型,例如Spring、CDI 或默认的无组件模型。

使用示例

  1. 定义源对象和目标对象
public class Source {
    private String name;
    private int age;
    private String address;

    // getters and setters
}

public class Target {
    private String fullName;
    private int age;
    private String location;

    // getters and setters
}
  • 定义Mapper接口
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface SourceTargetMapper {

    SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);

    @Mapping(source = "name", target = "fullName")
    @Mapping(source = "address", target = "location")
    Target sourceToTarget(Source source);

    @Mapping(source = "fullName", target = "name")
    @Mapping(source = "location", target = "address")
    Source targetToSource(Target target);
}

或者,可以使用 @Mappings 注解来包含多个 @Mapping 注解。@Mappings 注解是 @Mapping 注解的容器,用于定义多个字段映射。

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

@Mapper
public interface SourceTargetMapper {

    SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);

    @Mappings({
        @Mapping(source = "name", target = "fullName"),
        @Mapping(source = "address", target = "location")
    })
    Target sourceToTarget(Source source);

    @Mappings({
        @Mapping(source = "fullName", target = "name"),
        @Mapping(source = "location", target = "address")
    })
    Source targetToSource(Target target);
}

  • 主方法
public class Main {
    public static void main(String[] args) {
        Source source = new Source();
        source.setName("John Doe");
        source.setAge(30);
        source.setAddress("123 Main St");

        SourceTargetMapper mapper = SourceTargetMapper.INSTANCE;
        Target target = mapper.sourceToTarget(source);

        System.out.println("Target Full Name: " + target.getFullName());
        System.out.println("Target Age: " + target.getAge());
        System.out.println("Target Location: " + target.getLocation());
    }
}

与Spring集成

通过设置 componentModel = "spring",你可以将生成的 Mapper 实现类作为 Spring 组件进行管理,从而在 Spring 容器中进行依赖注入。

@Mapper(componentModel = "spring")
public interface SourceTargetMapper {
    // 映射方法
}

使用如下

@Service
public class SomeService {

    private final SourceTargetMapper sourceTargetMapper;

    @Autowired
    public SomeService(SourceTargetMapper sourceTargetMapper) {
        this.sourceTargetMapper = sourceTargetMapper;
    }

    // 使用 sourceTargetMapper 进行对象转换
}

表达式功能

可以使用 expression 属性在 @Mapping 注解中指定自定义的表达式。

示例场景:假设我们有一个场景,需要将一个包含日期字符串的源对象转换为目标对象,并且需要将日期字符串解析为 java.util.Date 对象。我们将使用 java.text.SimpleDateFormat 类来解析日期字符串。

public class Source {
    private String dateString;

    // getters and setters
}

public class Target {
    private Date date;

    // getters and setters
}

定义日期解析工具类

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateParser {
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

    public static Date parse(String dateString) throws ParseException {
        return DATE_FORMAT.parse(dateString);
    }
}

定义Mapper接口,注意注解中的imports和expression

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

@Mapper(componentModel = "spring", imports = {DateParser.class, ParseException.class})
public interface SourceTargetMapper {

    SourceTargetMapper INSTANCE = Mappers.getMapper(SourceTargetMapper.class);

    @Mappings({
        @Mapping(target = "date", expression = "java(DateParser.parse(source.getDateString()))")
    })
    Target sourceToTarget(Source source) throws ParseException;
}

在这个 Mapper接口中,使用了 imports 属性导入了 DateParser 和 ParseException 类。然后在 @Mapping 注解的 expression 属性中,通过 DateParser.parse(source.getDateString()) 来将 dateString 转换为 Date 对象。

public class Main {
    public static void main(String[] args) {
        Source source = new Source();
        source.setDateString("2024-11-25");

        SourceTargetMapper mapper = SourceTargetMapper.INSTANCE;
        try {
            Target target = mapper.sourceToTarget(source);
            System.out.println("Target Date: " + target.getDate());
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,创建了一个包含日期字符串的 Source 对象,并使用 SourceTargetMapper 将其转换为 Target 对象。转换过程中,DateParser 类的 parse 方法被调用,将日期字符串解析为 Date 对象。

依赖:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.5.Final</version> <!-- 请根据需要替换为最新版本 -->
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.5.5.Final</version> <!-- 请根据需要替换为最新版本 -->
    <scope>provided</scope>
</dependency>

以上就是SpringBoot使用MapStruct生成映射代码的示例详解的详细内容,更多关于SpringBoot MapStruct生成映射的资料请关注脚本之家其它相关文章!

相关文章

  • Java 格式化输出JSON字符串的2种实现操作

    Java 格式化输出JSON字符串的2种实现操作

    这篇文章主要介绍了Java 格式化输出JSON字符串的2种实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • springboot自定义starter示例代码

    springboot自定义starter示例代码

    SpringBoot自定义Starter项目的命名建议遵循xxx-spring-boot-starter格式,以避免与官方或第三方Starter产生冲突,核心规范包括自动装配文件的配置,旨在通过spring.factories或spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
    2024-11-11
  • Spring Boot的filter(过滤器)简单使用实例详解

    Spring Boot的filter(过滤器)简单使用实例详解

    过滤器(Filter)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册,下面通过实例给大家介绍Spring Boot的filter(过滤器)简单使用,一起看看吧
    2017-04-04
  • Java详细分析讲解自动装箱自动拆箱与Integer缓存的使用

    Java详细分析讲解自动装箱自动拆箱与Integer缓存的使用

    装箱就是把基本类型转换成包装类,拆箱就是把包装类转换成基本类型,下面这篇文章主要给大家介绍Java中自动装箱、自动拆箱与Integer缓存,需要的朋友可以参考下
    2022-04-04
  • Mybatis-Plus逻辑删除的用法详解

    Mybatis-Plus逻辑删除的用法详解

    这篇文章主要为大家详细介绍了Mybatis-Plus 逻辑删除的用法,文中有详细的代码示例,对我们的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-07-07
  • java取某段/某个时间段的值的方法

    java取某段/某个时间段的值的方法

    这篇文章主要介绍了java取某段/某个时间段的值的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Java扩展库RxJava的基本结构与适用场景小结

    Java扩展库RxJava的基本结构与适用场景小结

    RxJava(GitHub: https://github.com/ReactiveX/RxJava)能够帮助Java进行异步与事务驱动的程序编写,这里我们来作一个Java扩展库RxJava的基本结构与适用场景小结,刚接触RxJava的同学不妨看一下^^
    2016-06-06
  • 浅谈JAVA设计模式之享元模式

    浅谈JAVA设计模式之享元模式

    这篇文章主要介绍了JAVA设计模式之享元模式的的相关资料,文中详细的介绍了享元模式的概念以及使用方法,感兴趣的朋友可以了解下
    2020-06-06
  • JavaWeb通过IDEA配置Servlet操作流程详解

    JavaWeb通过IDEA配置Servlet操作流程详解

    这篇文章主要介绍了JavaWeb通过IDEA配置Servlet实现流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • springboot集成mybaits-generator自动生成代码的流程分析

    springboot集成mybaits-generator自动生成代码的流程分析

    这篇文章主要介绍了springboot集成mybaits-generator自动生成代码的流程分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,感兴趣的朋友一起看看吧
    2025-04-04

最新评论