零配置,零麻烦:MapStruct 的轻松对象映射之旅

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

零配置,零麻烦:MapStruct 的轻松对象映射之旅

    • 前言
    • MapStruct是什么
    • 快速上手:基础映射
    • 高级映射技巧
      • 1. 针对复杂类型的映射:
      • 2. 自定义映射逻辑:
    • MapStruct 的进阶用法
      • 1. 构造函数映射:
      • 2. 嵌套映射:
      • 3. 集合映射:
    • 伪出错
      • 结语:

前言

你是否曾为繁琐的对象映射代码而感到头疼?MapStruct 登场了!它不仅是 Java 开发者的得力助手,更是一个能够消除样板代码的魔法师。在这篇博客中,我们将一同踏上 MapStruct 的奇妙之旅,解锁它的神奇技能,让你的代码更为简洁、高效。

MapStruct是什么

MapStruct 是一个用于 Java 编程语言的对象映射框架,它的主要目标是简化 Java bean 类型之间的映射过程。在软件开发中,经常需要将一个对象的数据映射到另一个对象,而 MapStruct 通过注解处理器的方式,根据开发者提供的映射规则自动生成映射代码,从而减少手动编写重复、繁琐的映射代码的工作。

MapStruct 的定位是提供一种高性能、可扩展、易用的对象映射解决方案。相比其他对象映射框架,MapStruct 有以下优势:

  1. 性能优越: 由于 MapStruct 生成的映射代码是静态的,在编译期间就已经生成,因此它的性能通常比运行时反射的映射框架更高效。

  2. 可读性和维护性: MapStruct 生成的映射代码相对清晰简洁,易于阅读和维护。生成的代码包含了开发者定义的映射规则,也支持自定义转换逻辑。

  3. 类型安全: MapStruct 在编译期间就能够检测到潜在的映射错误,提供了类型安全性,减少了在运行时可能发生的错误。

  4. 灵活性: 支持自定义转换器,开发者可以通过注解指定特定的映射规则,也可以手动编写转换器以满足特定需求。

总体而言,MapStruct 是一款强大的对象映射框架,适用于各种 Java 项目,尤其在需要处理大量对象映射的场景下,能够提高开发效率并保证映射代码的质量。

快速上手:基础映射

快速上手 MapStruct 的基础映射需要完成一些简单的步骤。以下是一个基本的示例,演示如何创建一个简单的映射。

假设有两个类 SourceTarget,它们具有相似的字段,我们希望将一个对象映射到另一个对象。

  1. 引入 MapStruct 依赖:

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

    <dependencies><!-- 其他依赖 --><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.4.2.Final</version> <!-- 查看最新版本 --></dependency>
    </dependencies>
    
  2. 配置 Maven 插件:

    pom.xml 中,添加 MapStruct 的 Maven 插件配置:

    <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source> <!-- 适配你的 Java 版本 --><target>1.8</target> <!-- 适配你的 Java 版本 --></configuration></plugin><plugin><groupId>org.mapstruct</groupId><artifactId>mapstruct-maven-plugin</artifactId><version>1.4.2.Final</version> <!-- 查看最新版本 --><executions><execution><goals><goal>compile</goal></goals><configuration><sourceDirectory>src/main/java</sourceDirectory><targetDirectory>target/generated-sources/mapstruct</targetDirectory></configuration></execution></executions></plugin></plugins>
    </build>
    
  3. 创建源和目标类:

    // Source 类
    public class Source {private String name;private int age;// Getters and setters
    }
    
    // Target 类
    public class Target {private String name;private int age;// Getters and setters
    }
    
  4. 创建映射接口:

    import org.mapstruct.Mapper;
    import org.mapstruct.Mapping;@Mapper
    public interface SourceTargetMapper {@Mapping(source = "name", target = "name")@Mapping(source = "age", target = "age")Target sourceToTarget(Source source);
    }
    

    在上述代码中,@Mapper 注解表示这是一个 MapStruct 映射接口。@Mapping 注解用于指定源对象和目标对象字段的映射关系。

  5. 生成映射代码:

    在 Maven 项目中,运行以下 Maven 命令:

    mvn clean install
    

    这将触发 MapStruct 的注解处理器生成映射代码。

以上就是一个简单的 MapStruct 映射示例。请注意,这只是一个入门级的例子,MapStruct 还支持更复杂的映射,包括集合映射、嵌套映射等。通过适当的注解和配置,你可以灵活地定义映射规则,以满足项目的需求。

高级映射技巧

在 MapStruct 中,你可以使用高级映射技巧来处理复杂类型的映射,并定义自定义映射逻辑。以下是一些示例:

1. 针对复杂类型的映射:

假设有一个包含复杂类型的类 Person,其中包含了 Address 类型的地址信息。我们希望将 Person 类型映射到 PersonDTO 类型。

// Person 类
public class Person {private String name;private Address address;// Getters and setters
}// Address 类
public class Address {private String city;private String street;// Getters and setters
}// PersonDTO 类
public class PersonDTO {private String name;private String city;// Getters and setters
}

然后,创建映射接口并定义映射规则:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;@Mapper
public interface PersonMapper {@Mapping(source = "name", target = "name")@Mapping(source = "address.city", target = "city")PersonDTO personToPersonDTO(Person person);
}

在上述代码中,通过使用点号 . 来表示嵌套属性的映射关系,你可以轻松地处理复杂类型的映射。

2. 自定义映射逻辑:

有时候,你可能需要自定义映射逻辑以满足特定的需求。例如,如果需要将 Date 类型转换成字符串类型,可以使用自定义的转换器。

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.text.SimpleDateFormat;@Mapper
public interface CustomMapper {CustomMapper INSTANCE = Mappers.getMapper(CustomMapper.class);@Mapping(source = "date", target = "formattedDate", qualifiedByName = "dateFormat")Target customMapping(Source source);String dateFormat(java.util.Date date);class Target {private String formattedDate;// Getter and setter}class Source {private java.util.Date date;// Getter and setter}
}

在上述例子中,通过在映射接口中定义名为 dateFormat 的方法,并在 @Mapping 注解中使用 qualifiedByName 属性,实现了对 Date 类型的自定义转换。

这些是一些高级映射技巧的简单示例。MapStruct 提供了丰富的注解和配置选项,可以满足各种映射需求。根据项目的具体情况,你可以进一步探索 MapStruct 的文档以了解更多高级用法。

MapStruct 的进阶用法

MapStruct 提供了一些进阶用法,包括构造函数映射、嵌套映射和集合映射。下面分别介绍这些进阶用法:

1. 构造函数映射:

在某些情况下,你可能希望使用构造函数进行映射。MapStruct 允许你在映射接口中使用构造函数映射,这样可以更加灵活地处理对象创建过程。

假设有一个类 Person,它有一个包含多个参数的构造函数,我们希望将其映射到 PersonDTO 类型。

// Person 类
public class Person {private String name;private int age;// 构造函数public Person(String name, int age) {this.name = name;this.age = age;}// Getters and setters
}// PersonDTO 类
public class PersonDTO {private String name;private int age;// 构造函数public PersonDTO(String name, int age) {this.name = name;this.age = age;}// Getters and setters
}

然后,在映射接口中使用构造函数映射:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;@Mapper
public interface PersonMapper {@Mapping(target = "name", source = "name")@Mapping(target = "age", source = "age")PersonDTO personToPersonDTO(Person person);
}

MapStruct 会自动识别构造函数映射的关系,并生成相应的映射代码。

2. 嵌套映射:

MapStruct 支持嵌套映射,允许你在对象之间建立更复杂的映射关系。假设有一个嵌套的类结构,如 Order 包含 Customer,我们希望将 Order 映射到 OrderDTO,同时也映射 CustomerCustomerDTO

// Order 类
public class Order {private String orderId;private Customer customer;// Getters and setters
}// Customer 类
public class Customer {private String name;private String address;// Getters and setters
}// OrderDTO 类
public class OrderDTO {private String orderId;private CustomerDTO customer;// Getters and setters
}// CustomerDTO 类
public class CustomerDTO {private String name;private String address;// Getters and setters
}

在映射接口中进行嵌套映射:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;@Mapper
public interface OrderMapper {@Mapping(source = "customer", target = "customer")OrderDTO orderToOrderDTO(Order order);@Mapping(source = "name", target = "name")@Mapping(source = "address", target = "address")CustomerDTO customerToCustomerDTO(Customer customer);
}

MapStruct 会根据映射接口中的定义自动生成嵌套映射代码。

3. 集合映射:

MapStruct 也支持集合的映射。假设有一个类 Library 包含了多个书籍 Book,我们希望将 Library 映射到 LibraryDTO,同时也映射其中的书籍列表。

// Book 类
public class Book {private String title;private String author;// Getters and setters
}// Library 类
public class Library {private List<Book> books;// Getters and setters
}// LibraryDTO 类
public class LibraryDTO {private List<BookDTO> books;// Getters and setters
}// BookDTO 类
public class BookDTO {private String title;private String author;// Getters and setters
}

在映射接口中进行集合映射:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;@Mapper
public interface LibraryMapper {@Mapping(source = "books", target = "books")LibraryDTO libraryToLibraryDTO(Library library);@Mapping(source = "title", target = "title")@Mapping(source = "author", target = "author")BookDTO bookToBookDTO(Book book);
}

MapStruct 会根据映射接口中的定义自动生成集合映射代码。

这些是 MapStruct 的一些进阶用法,它们能够帮助你更灵活地处理复杂的映射场景。根据项目需求,你可以结合这些技巧,定制符合你业务逻辑的映射规则。

伪出错

1、报错 java.lang.ClassNotFoundException: Cannot find implementation for fun.todoitbo.botally.convert.TbBillConvert

这里要观察你的@Mapper注解,你可能错把mybatis中的@Mapper当成宝了

2、映射返回的结果都是null

出现上面的情况,要观察,是否存在目标类上没有set,get方法

3、我修改了源类或者目标类但是他没有生效

这里你需要clear一下,重新启动,因为它的实现方法只生成一次

结语:

通过本文的深度探索,相信你将对 MapStruct 有了全新的认识,并能够在你的项目中充分发挥它的威力。让我们一同掌握这门“魔法”,让代码变得更加清爽、优雅!

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

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

相关文章

Go语言中的HTTP头信息处理

在Web开发中&#xff0c;HTTP头信息扮演着至关重要的角色。它们提供了关于HTTP请求和响应的元数据&#xff0c;如内容类型、缓存控制、认证信息等。Go语言&#xff0c;作为一种高效且强大的编程语言&#xff0c;提供了丰富的标准库来处理HTTP头信息。 首先&#xff0c;我们需要…

react useEffect 内存泄漏

componentWillUnmount() {this.setState (state, callback) > {return;};// 清除reactionthis.reaction();}useEffect 使用AbortController useEffect(() > { let abortController new AbortController(); // your async action is here return () > { abortCo…

Linux内存管理:(五)反向映射RMAP

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 前置知识&#xff1a;page数据结…

目标检测-One Stage-YOLOv2

文章目录 前言一、YOLOv2的网络结构和流程二、YOLOv2的创新点预处理网络结构训练 总结 前言 根据前文目标检测-One Stage-YOLOv1可以看出YOLOv1的主要缺点是&#xff1a; 和Fast-CNN相比&#xff0c;速度快&#xff0c;但精度下降。&#xff08;边框回归不加限制&#xff09;…

企业传输大文件时在企业网盘和文件传输平台之间该怎么选?

在当今数字化时代&#xff0c;企业常常需要传输大量文件&#xff0c;包括设计图纸、视频、音乐、数据集等。这些文件可能很大&#xff0c;往往需要高效、安全地传输。对于企业来说&#xff0c;选择合适的工具至关重要。在企业网盘和文件传输平台之间&#xff0c;如何做出正确的…

微信怎么做小程序店铺?如何制作微信小程序店铺

在这个数字化的时代&#xff0c;拥有一个属于自己的线上店铺已经成为了一种趋势。而微信小程序&#xff0c;作为微信平台上的一种轻应用&#xff0c;无疑成为了许多人开店的首选。那么&#xff0c;如何利用微信小程序开设自己的店铺呢&#xff1f;下面就让我来为大家详细解析一…

(03)光刻——半导体电路的绘制

01、绘制精细电路的第一步 金属-氧化物半导体场效应晶体管(MOSFET)的革命,让我们可以在相同面积的晶圆上同时制造出更多晶体管。MOSFET体积越小,单个 MOSFET的耗电量就越少,还可以制造出更多的晶体管,让其发挥作用,可谓是一举多得。可见,制造更小的MOSFET成了关键因素…

专属定制适合个人的知识付费平台,打造个性化品牌与自主管理体验

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费平台已经成为人们获取专业知识、提升自身素质的重要渠道。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。因此&#xff0c;我们提出了专属定…

锂电池寿命预测 | Matlab基于LSTM长短期记忆神经网络的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于LSTM长短期记忆神经网络的锂电池寿命预测 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复Matlab基于LSTM长短期记忆神经网络的锂电池寿命预测。 参考资料 [1] http://t.csdn…

CentOS 7 安装 PPTP

环境&#xff1a; 阿里云试用机&#xff1a; 外网IP&#xff1a;114.55.80.150 内网IP&#xff1a;172.28.11.92 一、服务器安装 PPTP 1、安装 yum install epel-release -y 2、安装pptp yum install pptpd iptables-services -y 3、修改配置 vim /etc/pptpd.conf# 最…

CAAC无人机操作证考证报名流程及白底证件照片制作方法

在这个无人机技术日新月异的时代&#xff0c;拥有一张CAAC民用无人机操作证不仅意味着你能够合法地在天空翱翔&#xff0c;也象征着你对飞行技术的尊重和对规章制度的遵守。如果你怀揣着成为无人机飞行员的梦想&#xff0c;那么&#xff0c;让我们一起揭开CAAC民用无人机操作证…

静态网页设计——美食杰官网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 使用技术&#xff1a;HTMLCSSJS 主要内容&#xff1a;仿照美食杰官网 主要内容 1、首页 首页用html标签分割成多个区域&#xff0c;使用css设置样式&#xff0c;精准…

《软件项目接口安全设计规范》

1.token授权机制 2.https传输加密 3.接口调用防滥用 4.日志审计里监控 5.开发测试环境隔离&#xff0c;脱敏处理 6.数据库运维监控审计 软件全套文档&#xff1a;软件开发全套资料-CSDN博客

RA8803SA 车载用实时时钟模块

内置32.768kHz 晶体单元(频率精度调整完毕)和DTCXO1/100s精度的时间寄存器接口类型:I2C-Bus接口&#xff08;400kHz&#xff09;工作电压范围:1.6V to 5.5V温度补偿电压:2.2V to 5.5V计时&#xff08;保持&#xff09;电压范围:1.6V to 5.5V可选择输出频率为32.768kHz, 1024Hz,…

书生浦语大模型概述

github 地址&#xff1a;https://github.com/InternLM/tutorial 一、大模型简介 二、书生浦语 介绍 2.1 简介 2.2 模型到应用 如上图所示&#xff0c;从模型到应用通过共需要经过以下4个步骤&#xff1a; 模型评测&#xff1a;选择适合自己需求的模型。 不同的大模型&#x…

YOLOv7独家原创改进:新颖的Shape IoU结合 Inner-IoU,基于辅助边框的IoU损失的同时关注边界框本身的形状和尺度,小目标实现高效涨点

💡💡💡本文改进:一种新的Shape IoU方法结合 Inner-IoU,基于辅助边框的IoU损失的同时,更加关注边界框本身的形状和尺度来计算损失 💡💡💡对小目标检测涨点明显,在VisDrone2019、PASCAL VOC均有涨点 💡💡💡本文改进:一种新的Shape IoU方法,该方法可以通过…

MySQL报错1054 - Unknown column ‘24023A00000‘ in ‘field list‘

MySQL 向表中插入数据时报错: 1054 - Unknown column 24023A00000 in field list 表的设计是&#xff1a; 执行插入数据sql语句后报错&#xff1a; 解决方法&#xff1a; 我设计表时是有id字段的&#xff0c;怎么报错显示字段不在表中&#xff1f;&#xff1f;查找了很多资料…

对话小仙炖副总裁张勇:内容价值将成为直播电商的核心趋势和竞争力

“ 激活中医典籍里的智慧&#xff0c;坚持内容化之路&#xff0c;服务好消费者。” 整理 | 飞族 编辑 | 渔舟 出品&#xff5c;极新&#xff06;北京电子商务协会 随着直播电商的影响力越来越大&#xff0c;对品牌而言&#xff0c;直播不仅是一种单纯的卖货渠道&#xff0c;…

如何使用Pyxamstore快速解析Xamarin AssemblyStore文件

关于Pyxamstore Pyxamstore是一款针对Xamarin AssemblyStore文件&#xff08;assemblies.blob&#xff09;的强大解析工具&#xff0c;该工具基于纯Python 2.7开发&#xff0c;支持从一个APK文件中解包并重封装assemblies.blob和assemblies.manifest Xamarin文件。 什么是ass…

nodejs发送消息给钉钉机器人

1.钉钉添加机器人 1.1 新建一个群 --> 群设置 --> 机器人 1.2 机器人管理 --> 添加机器人 1.3 机器人--> 自定义-->添加 1.4 配置信息 备注1&#xff1a;密钥复制出来SEC2c689174c4a8ed49c8a7309a490cd98e0e7f7bc788bb7232d53c738eb5f5d008 备注2&#xff1a;…