【高效开发工具系列】MapStruct入门使用

2023-11-28 04:36

本文主要是介绍【高效开发工具系列】MapStruct入门使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一.简单介绍
      • 1.什么是 MapStruct?
      • 2.MapStruct 的特点
    • 二.基础使用
      • 1.添加依赖
      • 2.定义映射接口
      • 3.编写配置
      • 4.生成代码
      • 5.调用方法
    • 三.封装使用
      • 1.FromConverter
      • 2.PropertyCopier
      • 3.ToConverter
      • 4.TwoWayConverter
      • 5.基本使用
      • 6.原理分析
      • 7.使用技巧
    • 四.工具对比
      • 1.概述
      • 2.MapStruct
      • 3.Apache BeanUtils
      • 4.Spring BeanUtils
      • 5.总结:

一.简单介绍

1.什么是 MapStruct?

MapStruct 是一个 Java 注解处理器框架,用于简化 Java Bean 之间的映射。它通过生成映射代码来消除手动编写映射代码的繁琐工作,从而提高开发效率。

2.MapStruct 的特点

  1. 简化映射: MapStruct 旨在简化 Java Bean 之间的映射,减少手动编写映射代码的工作量。
  2. 注解处理器: MapStruct 使用注解处理器技术,在编译时生成映射代码,而不是在运行时进行反射。
  3. 类型安全: 通过在映射接口上使用注解,MapStruct 能够在编译时检查映射的正确性,提供类型安全性。
  4. 支持自定义映射逻辑: 尽管 MapStruct 提供了默认的映射规则,但你仍然可以通过在映射接口中定义自定义方法来指定特定的映射逻辑。

二.基础使用

1.添加依赖

添加依赖: 首先,在你的项目中添加 MapStruct 的依赖。你可以在 Maven 或 Gradle 中进行配置。

Maven:

<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.4.2.Final</version> <!-- 使用最新版本 -->
</dependency>

Gradle:

implementation 'org.mapstruct:mapstruct:1.4.2.Final' // 使用最新版本
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'

2.定义映射接口

定义映射接口: 创建一个带有@Mapper注解的接口,定义映射方法。

@Mapper
public interface CarMapper {CarDto carToCarDto(Car car);
}

3.编写配置

编写映射配置: 如果需要自定义映射逻辑,可以在映射接口中定义自定义方法,或者使用@Mapping注解。

@Mapper
public interface CarMapper {@Mapping(source = "make", target = "manufacturer")CarDto carToCarDto(Car car);
}

4.生成代码

生成映射代码: 编译项目时,MapStruct 注解处理器将生成映射代码。

5.调用方法

调用映射方法: 在应用程序中调用生成的映射方法。

CarMapper carMapper = Mappers.getMapper(CarMapper.class);
CarDto carDto = carMapper.carToCarDto(car);

以上是 MapStruct 的基本介绍和使用步骤。通过这些步骤,你可以轻松地实现 Java Bean 之间的映射,同时保持代码的简洁和易维护性。

三.封装使用

1.FromConverter

public interface FromConverter<T, FROM> {T from(FROM from);List<T> from(List<FROM> list);default PageBean<T> from(PageBean<FROM> page) {PageBean<T> result = new PageBean<>();result.setTotalElements(page.getTotalElements());result.setNumber(page.getNumber());result.setSize(page.getSize());result.setTotalPages(page.getTotalPages());result.setNumberOfElements(page.getNumberOfElements());result.setContent(this.from(page.getContent()));return result;}default PageBean<T> from(IPage<FROM> page) {PageBean<T> result = new PageBean<>();result.setTotalElements((int) page.getTotal());result.setNumber((int) page.getCurrent());result.setSize((int) page.getSize());result.setTotalPages((int) page.getPages());result.setNumberOfElements(page.getRecords().size());result.setContent(this.from(page.getRecords()));return result;}
}

2.PropertyCopier

public interface PropertyCopier<TARGET, T> {void copy(@MappingTarget TARGET target, T t);
}

3.ToConverter

public interface ToConverter<T, TO> {TO to(T t);List<TO> to(List<T> list);default PageBean<TO> to(PageBean<T> page) {PageBean<TO> result = new PageBean<>();result.setTotalElements(page.getTotalElements());result.setNumber(page.getNumber());result.setSize(page.getSize());result.setTotalPages(page.getTotalPages());result.setNumberOfElements(page.getNumberOfElements());result.setContent(this.to(page.getContent()));return result;}default PageBean<TO> to(IPage<T> page) {PageBean<TO> result = new PageBean<>();result.setTotalElements((int) page.getTotal());result.setNumber((int) page.getCurrent());result.setSize((int) page.getSize());result.setTotalPages((int) page.getPages());result.setNumberOfElements(page.getRecords().size());result.setContent(this.to(page.getRecords()));return result;}
}

4.TwoWayConverter

public interface TwoWayConverter<SRC, DEST> extends ToConverter<SRC, DEST>, FromConverter<SRC, DEST> {
}

5.基本使用

@Data
public class ChatbotDTO {private Integer id;private String question;private String response;private Date createTime;private Integer isDelete;@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)public interface Converter extends FromConverter<ChatbotDTO, Chatbot> {Converter INSTANCE = Mappers.getMapper(Converter.class);}
}
@Data
public class Chatbot extends Model<Chatbot> {private Integer id;private String question;private String response;private Date createTime;private Integer isDelete;
}

6.原理分析

打开 target 目录,可以看到如图所示的编译后生成的类,说明在编译器就生成了对应的 DTO,相比其他 2 种方式在运行时生成 DTO 更加高效。

image-20231127185454454

7.使用技巧

  • 忽略字段映射
  • 源对象与目标对象属性名不符的映射方法
  • 直接设置特定值
  • 表达式映射
  • 自定义映射

四.工具对比

1.概述

MapStruct、Apache BeanUtils 以及 Spring BeanUtils 都是用于 Java Bean 之间属性复制的工具,但它们有一些区别,包括实现方式、性能、功能等方面。

2.MapStruct

优势:

  1. 编译时检查: MapStruct 在编译时生成映射代码,提供了类型安全性,可以在编译时捕获一些映射错误。
  2. 性能: 由于生成的映射代码是直接的 Java 代码,MapStruct 通常在性能上优于运行时反射的解决方案。
  3. 可配置性: 提供了很高的自定义能力,你可以在映射接口中定义自定义方法或使用@Mapping注解来指定映射规则。
  4. MapStruct 能自动的将名字一样,类型不一致的属性值进行转化再赋值(仅限基本类型的包装类型,如果转化值适配不了对应类型会报错

不足:

  • 学习曲线: 对于初学者而言,可能需要一些时间来理解和配置 MapStruct。

3.Apache BeanUtils

优势:

  1. 简单易用: Apache BeanUtils 提供了简单的 API,易于上手。
  2. 反射: 使用反射机制实现属性复制,可以在运行时处理动态对象。

不足:

  1. 性能: 相对于 MapStruct,Apache BeanUtils 在性能上可能较慢,因为它使用反射进行属性复制。
  2. 类型安全: 由于是在运行时进行反射,缺乏编译时类型检查。

4.Spring BeanUtils

优势:

  1. 集成 Spring: Spring BeanUtils 是 Spring 框架的一部分,可以很容易地集成到 Spring 应用程序中。
  2. 简化代码: 提供了一些方便的方法,可以简化属性复制的代码。

不足:

  1. 性能: 与 Apache BeanUtils 类似,Spring BeanUtils 也是使用反射,因此性能相对较低。
  2. 可配置性: 相较于 MapStruct,可配置性相对较低。

5.总结:

  • MapStruct 提供了编译时类型检查和高度可配置性,适用于需要更高性能和更复杂映射规则的场景。

  • Apache BeanUtilsSpring BeanUtils 简单易用,适用于简单的属性复制场景,但在性能和类型安全性方面可能相对较差。

选择使用哪个工具取决于你的具体需求,如果性能和类型安全性是关键考虑因素,而且你愿意付出一些学习成本,那么 MapStruct 可能是一个更好的选择。如果你需要一个简单且易于使用的解决方案,并且性能要求不是很高,那么 Apache BeanUtils 或 Spring BeanUtils 可能是更合适的选择。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

这篇关于【高效开发工具系列】MapStruct入门使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/429063

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

关于@MapperScan和@ComponentScan的使用问题

《关于@MapperScan和@ComponentScan的使用问题》文章介绍了在使用`@MapperScan`和`@ComponentScan`时可能会遇到的包扫描冲突问题,并提供了解决方法,同时,... 目录@MapperScan和@ComponentScan的使用问题报错如下原因解决办法课外拓展总结@

mysql数据库分区的使用

《mysql数据库分区的使用》MySQL分区技术通过将大表分割成多个较小片段,提高查询性能、管理效率和数据存储效率,本文就来介绍一下mysql数据库分区的使用,感兴趣的可以了解一下... 目录【一】分区的基本概念【1】物理存储与逻辑分割【2】查询性能提升【3】数据管理与维护【4】扩展性与并行处理【二】分区的

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存