MapStruct 中 Java Bean 映射代码生成器的基本使用

文章目录

  • 一、简介:
  • 二、背景:
  • 三、相关概念:
    • 1、映射器(Mapper):
    • 2、映射方法(Mapping Method):
    • 3、常规映射方法(Regular Mapping Method):
    • 4、嵌套映射方法(Nested Mapping Method):
    • 5、集合映射方法(Collection Mapping Method):
  • 四、使用案例
    • 1、添加依赖:
    • 2、创建转换器接口:
    • 3、生成转换器实现类:
    • 4、使用转换器:
  • 五、MapStruct 的底层原理
    • 1、扫描映射器接口:
    • 2、解析映射方法:
    • 3、生成转换代码:
    • 4、编译器处理:
    • 5、使用转换代码:

一、简介:

MapStruct是一个Java注解处理器,用于自动生成Java bean之间的映射代码。

它可以大大简化数据转换的过程,减少手动编写转换代码的工作量。
mapstruct

二、背景:

在实际的开发中,经常会遇到需要将一个Java bean的数据转换为另一个Java bean的情况。

在没有自动转换工具的情况下,我们通常需要手动编写转换代码,将源对象的属性值逐个赋值给目标对象的对应属性。

这样的转换代码通常会非常冗长且容易出错。

为了解决这个问题,MapStruct应运而生。

它通过在Java bean类上添加注解,指定源对象和目标对象之间的映射关系,然后使用注解处理器自动生成转换代码。

这样一来,开发人员就不再需要手动编写转换代码,大大提高了开发效率和代码质量。

三、相关概念:

1、映射器(Mapper):

映射器是一个接口,用于定义源对象和目标对象之间的转换规则。我们可以在映射器接口中定义多个抽象方法,每个方法都表示一个具体的转换规则。映射器接口上需要添加@Mapper注解,以告诉MapStruct要为该接口生成转换代码。

2、映射方法(Mapping Method):

映射方法是映射器接口中的抽象方法,用于定义源对象和目标对象之间的属性映射关系。映射方法上需要添加@Mapping注解,以指定源属性和目标属性之间的映射关系。

3、常规映射方法(Regular Mapping Method):

常规映射方法用于将源对象的属性值逐个赋值给目标对象的对应属性。这是最常见的一种映射方法,它的参数列表中需要包含源对象和目标对象。

4、嵌套映射方法(Nested Mapping Method):

嵌套映射方法用于处理源对象和目标对象之间的嵌套关系。当源对象和目标对象中存在嵌套对象时,我们可以使用嵌套映射方法来处理嵌套对象之间的转换。

5、集合映射方法(Collection Mapping Method):

集合映射方法用于处理源对象和目标对象之间的集合关系。当源对象和目标对象中存在集合属性时,我们可以使用集合映射方法来处理集合属性之间的转换。

总之,MapStruct是一个方便且强大的Java转换工具,可以帮助开发人员自动生成Java bean之间的映射代码,减少手动编写转换代码的工作量。它的使用非常简单,只需添加注解并定义转换规则即可。

四、使用案例

下面给出一个源对象和目标对象属性不同的例子来说明如何使用 MapStruct 进行转换。

假设我们有以下两个类:

public class SourceObject {private String name;private int age;// getters and setters
}public class TargetObject {private String fullName;private int yearsOld;// getters and setters
}

源对象的 name 属性对应目标对象的 fullName 属性,源对象的 age 属性对应目标对象的 yearsOld 属性。

那么我们需要进行以下步骤:

1、添加依赖:

在项目的 pom.xml 文件中添加 MapStruct 依赖。

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

2、创建转换器接口:

定义一个接口,使用 @Mapper 注解标记,并且指定 componentModel 参数为 spring(如果使用 Spring 框架)。

@Mapper(componentModel = "spring")
public interface ObjectMapper {@Mapping(source = "name", target = "fullName")@Mapping(source = "age", target = "yearsOld")TargetObject sourceToTarget(SourceObject sourceObject);
}

在这个例子中,我们使用 @Mapping 注解来指定源属性和目标属性之间的映射关系。

3、生成转换器实现类:

使用 Maven 构建项目,MapStruct 将会自动生成实现转换器接口的实现类。

4、使用转换器:

在代码中使用转换器进行对象转换。

SourceObject source = new SourceObject();
source.setName("John");
source.setAge(25);ObjectMapper mapper = new ObjectMapperImpl(); // 自动生成的实现类
TargetObject target = mapper.sourceToTarget(source);System.out.println(target.getFullName()); // 输出 "John"
System.out.println(target.getYearsOld()); // 输出 25

现在,你可以看到源对象的 name 属性被映射到了目标对象的 fullName 属性,源对象的 age 属性被映射到了目标对象的 yearsOld 属性。这样,你就可以使用 MapStruct 进行源对象和目标对象属性不同的映射转换了。

五、MapStruct 的底层原理

MapStruct的底层原理是使用Java注解处理器(Annotation Processor)来生成转换代码。注解处理器是一种在编译时扫描和处理注解的工具,它可以读取源代码中的注解信息,并根据注解信息生成新的Java代码。

当我们在映射器接口上添加@Mapper注解时,注解处理器会扫描该接口及其方法上的注解信息,并根据注解信息生成转换代码。具体流程如下:

1、扫描映射器接口:

注解处理器会扫描映射器接口上的注解信息,获取源对象和目标对象的类型、映射方法等元数据。

2、解析映射方法:

注解处理器会解析映射方法上的注解信息,包括源属性和目标属性的映射关系、转换逻辑等。

3、生成转换代码:

根据源对象和目标对象的类型以及映射方法的注解信息,注解处理器会生成转换代码,将源对象的属性值赋值给目标对象的对应属性。

4、编译器处理:

生成的转换代码会被注解处理器写入到编译器的输出流中,编译器会将这些代码编译为字节码文件。

5、使用转换代码:

在实际运行时,我们可以直接使用生成的转换代码,调用映射方法进行对象之间的转换。

通过使用注解处理器,MapStruct能够在编译时自动生成转换代码,避免了运行时的性能开销,提高了转换的效率。同时,由于是在编译时生成代码,所以生成的转换代码可以在开发阶段进行验证和调试,减少了编写手动转换代码的出错可能性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/66850.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端开发:数组对象判断重复的方法详解

前言 在前端开发过程中,关于数据处理是非常常用的操作,尤其是通过算法处理从后端获取的数据甚为重要。而且在前端开发中,两大类型的数据处理是必备的:数组和对象。与其说是数据处理,不如说是数组和对象的处理。实际开发中,关于数组数据的处理所占比例更高,尤其是涉及到表…

新增守护进程管理、支持添加MySQL远程数据库,支持PHP版本切换,1Panel开源面板v1.5.0发布

2023年8月14日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.5.0版本。 在这个版本中&#xff0c;1Panel新增了守护进程管理功能&#xff1b;支持添加MySQL远程数据库&#xff1b;支持添加FTP/S和WebDAV的SFTP服务&#xff1b;支持PHP版本切换。此外&am…

字节原来这么容易进,是面试官放水,还是公司实在是太缺人?

本人211非科班&#xff0c;之前在字节和腾讯实习过&#xff0c;这次其实没抱着什么特别大的希望投递&#xff0c;没想到字节可以再给我一次机会&#xff0c;还是挺开心的。 本来以为有个机会就不错啦&#xff01;没想到能成功上岸&#xff0c;在这里要特别感谢帮我内推的同学&…

selenium自动化测试之搭建测试环境

自动化测试环境&#xff1a; Python3.7Selenium3.141谷歌浏览器76.0/火狐浏览器 1、安装Python并配置环境变量。 下载并安装&#xff1a;配置环境变量&#xff1a;C:\Python37;C:\Python37\Scripts; 2、安装Pycharm开发工具。 下载地址&#xff1a; 注意下载&#xff1a;Co…

数据库内日期类型数据大于小于条件查找注意事项

只传date格式的日期取查datetime的字段的话默认是 00:00:00 日期类型字符串需要使用 ’ ’ 单引号括住 使用大于小于条件查询某一天的日期数据 前后判断条件不能是同一天 一个例子 数据库内数据&#xff1a; 查询2023-08-14之后的数据&#xff1a; select * from tetst…

Debian10:安装PHPVirtualBox

PHPVirtualBox 是一个用 PHP 编写&#xff0c;用于管理 VirtualBox 的 Web 前端&#xff08;由AJAX实现&#xff09;。 参考文章&#xff1a;VirtualBoxPHPVirtualBox部署_骡子先生的博客-CSDN博客php virualbox,浏览器远程控制VBox 虚拟机phpVirtualBox_weixin_39815879的博客…

单源最短路

目录 Dijkstra求最短路 I Dijkstra求最短路 II&#xff08;堆优化版&#xff09; spfa求最短路 spfa判断负环 信使 香甜的黄油 最小花费 最优乘车 昂贵的聘礼 最重要的是问题的转化和抽象 把问题转化成最短路的模板 无负环 Dijkstra 迪杰斯特拉算法 采用的贪心的策略 每…

添加SQLCipher 到项目中

文章目录 一、克隆下载SQLCipher二、手动导入1. 生成sqlite3.c2. 在项目中添加命令3. 添加 Security.framework 三、CocoaPods导入 SQLCipher官方地址 一、克隆下载SQLCipher $ cd ~/Documents/code $ git clone https://github.com/sqlcipher/sqlcipher.git二、手动导入 1.…

【刷题笔记8.13】【动态规划相关】LeetCode题目:斐波那契数列、爬楼梯

【动态规划相关】LeetCode题目&#xff1a;斐波那契数列、爬楼梯 &#xff08;一&#xff09;爬楼梯 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 提示&#xff1a; 1 < n <…

android 如何分析应用的内存(十七)——使用MAT查看Android堆

android 如何分析应用的内存&#xff08;十七&#xff09;——使用MAT查看Android堆 前一篇文章&#xff0c;介绍了使用Android profiler中的memory profiler来查看Android的堆情况。 如Android 堆中有哪些对象&#xff0c;这些对象的引用情况是什么样子的。 可是我们依然面临…

用python来爬取某鱼的商品信息(2/2)

目录 上一篇文章 本章内容 设置浏览器为运行结束后不关闭&#xff08;可选&#xff09; 定位到搜索框的xpath地址 执行动作 获取cookie 保存为json文件 修改cookie的sameSite值并且导入cookie 导入cookie&#xff08;出错&#xff09; 导入cookie&#xff08;修改后&…

arcgis pro3.0-3.0.1-3.0.2安装教程大全及安装包下载

一. 产品介绍&#xff1a; ArcGIS Pro 这一功能强大的单桌面 GIS 应用程序是一款功能丰富的软件&#xff0c;采用 ArcGIS Pro 用户社区提供的增强功能和创意进行开发。 ArcGIS Pro 支持 2D、3D 和 4D 模式下的数据可视化、高级分析和权威数据维护。 支持通过 Web GIS 在一系列 …