杭州新站整站seo,网站建设和备案的顺序,用dw个人网站怎么建立,优秀平面广告设计#x1f49d;#x1f49d;#x1f49d;欢迎来到我的博客#xff0c;很高兴能够在这里和您见面#xff01;希望您在这里可以感受到一份轻松愉快的氛围#xff0c;不仅可以获得有趣的内容和知识#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学… 欢迎来到我的博客很高兴能够在这里和您见面希望您在这里可以感受到一份轻松愉快的氛围不仅可以获得有趣的内容和知识也可以畅所欲言、分享您的想法和见解。 推荐: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.FromConverter2.PropertyCopier3.ToConverter4.TwoWayConverter5.基本使用6.原理分析7.使用技巧 四.工具对比1.概述2.MapStruct3.Apache BeanUtils4.Spring BeanUtils5.总结 一.简单介绍
1.什么是 MapStruct?
MapStruct 是一个 Java 注解处理器框架用于简化 Java Bean 之间的映射。它通过生成映射代码来消除手动编写映射代码的繁琐工作从而提高开发效率。
2.MapStruct 的特点
简化映射 MapStruct 旨在简化 Java Bean 之间的映射减少手动编写映射代码的工作量。注解处理器 MapStruct 使用注解处理器技术在编译时生成映射代码而不是在运行时进行反射。类型安全 通过在映射接口上使用注解MapStruct 能够在编译时检查映射的正确性提供类型安全性。支持自定义映射逻辑 尽管 MapStruct 提供了默认的映射规则但你仍然可以通过在映射接口中定义自定义方法来指定特定的映射逻辑。
二.基础使用
1.添加依赖
添加依赖 首先在你的项目中添加 MapStruct 的依赖。你可以在 Maven 或 Gradle 中进行配置。
Maven:
dependencygroupIdorg.mapstruct/groupIdartifactIdmapstruct/artifactIdversion1.4.2.Final/version !-- 使用最新版本 --
/dependencyGradle:
implementation org.mapstruct:mapstruct:1.4.2.Final // 使用最新版本
annotationProcessor org.mapstruct:mapstruct-processor:1.4.2.Final2.定义映射接口
定义映射接口 创建一个带有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 FromConverterT, FROM {T from(FROM from);ListT from(ListFROM list);default PageBeanT from(PageBeanFROM page) {PageBeanT 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 PageBeanT from(IPageFROM page) {PageBeanT 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 PropertyCopierTARGET, T {void copy(MappingTarget TARGET target, T t);
}3.ToConverter
public interface ToConverterT, TO {TO to(T t);ListTO to(ListT list);default PageBeanTO to(PageBeanT page) {PageBeanTO 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 PageBeanTO to(IPageT page) {PageBeanTO 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 TwoWayConverterSRC, DEST extends ToConverterSRC, DEST, FromConverterSRC, 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 FromConverterChatbotDTO, Chatbot {Converter INSTANCE Mappers.getMapper(Converter.class);}
}Data
public class Chatbot extends ModelChatbot {private Integer id;private String question;private String response;private Date createTime;private Integer isDelete;
}6.原理分析
打开 target 目录,可以看到如图所示的编译后生成的类,说明在编译器就生成了对应的 DTO,相比其他 2 种方式在运行时生成 DTO 更加高效。 7.使用技巧
忽略字段映射源对象与目标对象属性名不符的映射方法直接设置特定值表达式映射自定义映射
四.工具对比
1.概述
MapStruct、Apache BeanUtils 以及 Spring BeanUtils 都是用于 Java Bean 之间属性复制的工具但它们有一些区别包括实现方式、性能、功能等方面。
2.MapStruct
优势
编译时检查 MapStruct 在编译时生成映射代码提供了类型安全性可以在编译时捕获一些映射错误。性能 由于生成的映射代码是直接的 Java 代码MapStruct 通常在性能上优于运行时反射的解决方案。可配置性 提供了很高的自定义能力你可以在映射接口中定义自定义方法或使用Mapping注解来指定映射规则。MapStruct 能自动的将名字一样类型不一致的属性值进行转化再赋值仅限基本类型的包装类型如果转化值适配不了对应类型会报错
不足
学习曲线 对于初学者而言可能需要一些时间来理解和配置 MapStruct。
3.Apache BeanUtils
优势
简单易用 Apache BeanUtils 提供了简单的 API易于上手。反射 使用反射机制实现属性复制可以在运行时处理动态对象。
不足
性能 相对于 MapStructApache BeanUtils 在性能上可能较慢因为它使用反射进行属性复制。类型安全 由于是在运行时进行反射缺乏编译时类型检查。
4.Spring BeanUtils
优势
集成 Spring Spring BeanUtils 是 Spring 框架的一部分可以很容易地集成到 Spring 应用程序中。简化代码 提供了一些方便的方法可以简化属性复制的代码。
不足
性能 与 Apache BeanUtils 类似Spring BeanUtils 也是使用反射因此性能相对较低。可配置性 相较于 MapStruct可配置性相对较低。
5.总结 MapStruct 提供了编译时类型检查和高度可配置性适用于需要更高性能和更复杂映射规则的场景。 Apache BeanUtils 和 Spring BeanUtils 简单易用适用于简单的属性复制场景但在性能和类型安全性方面可能相对较差。
选择使用哪个工具取决于你的具体需求如果性能和类型安全性是关键考虑因素而且你愿意付出一些学习成本那么 MapStruct 可能是一个更好的选择。如果你需要一个简单且易于使用的解决方案并且性能要求不是很高那么 Apache BeanUtils 或 Spring BeanUtils 可能是更合适的选择。 觉得有用的话点个赞 呗。 ❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正 如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧