做自行车车队网站的名字展厅搭建公司

news/2025/9/29 19:41:24/文章来源:
做自行车车队网站的名字,展厅搭建公司,wordpress gitg,笑话类网站用什么做一、引入 在没有遇见mapstruct的时候#xff0c;实现各个实体之间的转换#xff0c;都是手动转换实现的#xff0c;属性少一带你还好#xff0c;当属性一多#xff0c;代码就会变得很冗余#xff0c;没必要的非逻辑的代码就会加多。。。。 比如#xff1a; public cl…一、引入 在没有遇见mapstruct的时候实现各个实体之间的转换都是手动转换实现的属性少一带你还好当属性一多代码就会变得很冗余没必要的非逻辑的代码就会加多。。。。 比如 public class UserDTO {private String username;private String email;private boolean isActive;// Getters and setters// Constructor// Other methods as needed }// BO: UserBO.java public class UserBO {private String username;private String email;private boolean isActive;// Getters and setters// Constructor// Business methods as needed } 手动实现类型转换 public class UserConverter {public static UserBO convertToBO(UserDTO userDTO) {UserBO userBO new UserBO();userBO.setUsername(userDTO.getUsername());userBO.setEmail(userDTO.getEmail());userBO.setActive(userDTO.isActive());return userBO;}public static UserDTO convertToDTO(UserBO userBO) {UserDTO userDTO new UserDTO();userDTO.setUsername(userBO.getUsername());userDTO.setEmail(userBO.getEmail());userDTO.setActive(userBO.isActive());return userDTO;} } 这种方式就很费时费力一个突然的契机我在学习DDD领域驱动设计架构的时候发现up使用的mapstruct做的实体之间的转换后面也了解了一下发现这个工具还是很优秀的。 二、Mapstruct MapStruct 是一个代码生成器用于创建实现Java Bean之间转换的扩展映射器它基于约定优于配置的方法极大地简化了 Java bean 之间映射的实现我们只需要创建接口MapStruct就会在编译时自动创建一个具体的实现进行对象的转换 2.1、Mapstruct和BeanUtil的比较  Mapstruct的性能远远高于BeanUtils这应该是大佬使用Mapstruct的主要原因下面是我的测试结果可以看出随着属性个数的增加BeanUtils的耗时也在增加并且BeanUtils的耗时跟属性个数成正比而Mapstruct的耗时却一直是1秒所以从对比数据可以看出Mapstruct是非常优秀的其性能远远超过BeanUtil BeanUtils 只能同属性映射或者在属性相同的情况下允许被映射的对象属性少但当遇到被映射的属性数据类型被修改或者被映射的字段名被修改则会导致映射失败。 2.2、优势为什么选择Mapstruct 2.3、快速入门 2.3.1、引入依赖 dependencygroupIdorg.mapstruct/groupIdartifactIdmapstruct/artifactIdversion1.4.2.Final/version/dependencydependencygroupIdorg.mapstruct/groupIdartifactIdmapstruct-processor/artifactIdversion1.4.2.Final/version/dependency 2.3.1、定义DTO和BO  /*** SubjectCategoryDTO*/ Data public class SubjectCategoryDTO implements Serializable {private static final long serialVersionUID -36288445272926615L;private Long id;private String categoryName;private Integer categoryType;private String imageUrl;private Long parentId;private Integer count;} Data public class SubjectCategoryBO implements Serializable {private static final long serialVersionUID -36288445272926615L;private Long id;private String categoryName;private Integer categoryType;private String imageUrl;private Long parentId;private Integer count; } 2.4.1、定义Convert接口 Mapper public interface SubjectCategoryDTOConvert {SubjectCategoryDTOConvert INSTANCE Mappers.getMapper(SubjectCategoryDTOConvert.class);//将DTO转换为BOSubjectCategoryBO convertDTOToBO(SubjectCategoryDTO subjectCategoryDTO);//将ListBO转换为ListDTOListSubjectCategoryDTO convertBoListToDTOList(ListSubjectCategoryBO subjectCategoryBOList);//将BO转换为DTOSubjectCategoryDTO convertBoToCategoryDTO(SubjectCategoryBO subjectCategoryBO); } 2.4、性能好的原因 Java程序执行的过程是由编译器先把java文件编译成class字节码文件然后由JVM去解释执行class文件。Mapstruct正是在java文件到class这一步帮我们实现了转换方法即做了预处理提前编译好文件如果用过lombok的同学一定能理解其好处通过查看class文件可以看出SubjectCategoryDTOConvert 被打上org.mapstruct.Mapper注解后编译器自动会帮我们生成一个实现类SubjectCategoryDTOConvertImpl并实现了convertDTOToBO、convertBoListToDTOList、convertBoToCategoryDTO这些方法 从生成的代码可以看出转化过程非常简单只使用了UserPo的get方法和UserEntity的set方法没有复杂的逻辑处理清晰明了所以性能很高 相对于BeanUtils来说 BeanUtils转换的原理是使用的反射反射的效率相对来说是低的因为jvm优化在这种场景下有可能无效所以在对性能要求很高或者经常被调用的程序中尽量不要使用。我们平时在研发过程中也会遵守这个原则非必要不反射。 从下面的BeanUtils的copyProperties方法代码中可以看出转化逻辑非常复杂有很多的遍历去获取属性获取方法设置方法可访问然后执行所以执行效率相对Mapstruct来说是非常低的。回头看Mapstruct自动生成的实现类简洁、高效 BeanUtils的copyProperties方法的源码 private static void copyProperties(Object source, Object target, Nullable Class? editable, Nullable String... ignoreProperties) throws BeansException {Assert.notNull(source, Source must not be null);Assert.notNull(target, Target must not be null);Class? actualEditable target.getClass();if (editable ! null) {if (!editable.isInstance(target)) {throw new IllegalArgumentException(Target class [ target.getClass().getName() ] not assignable to Editable class [ editable.getName() ]);}actualEditable editable;}PropertyDescriptor[] targetPds getPropertyDescriptors(actualEditable);ListString ignoreList ignoreProperties ! null ? Arrays.asList(ignoreProperties) : null;PropertyDescriptor[] var7 targetPds;int var8 targetPds.length;for(int var9 0; var9 var8; var9) {PropertyDescriptor targetPd var7[var9];Method writeMethod targetPd.getWriteMethod();if (writeMethod ! null (ignoreList null || !ignoreList.contains(targetPd.getName()))) {PropertyDescriptor sourcePd getPropertyDescriptor(source.getClass(), targetPd.getName());if (sourcePd ! null) {Method readMethod sourcePd.getReadMethod();if (readMethod ! null) {ResolvableType sourceResolvableType ResolvableType.forMethodReturnType(readMethod);ResolvableType targetResolvableType ResolvableType.forMethodParameter(writeMethod, 0);if (targetResolvableType.isAssignableFrom(sourceResolvableType)) {try {if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {readMethod.setAccessible(true);}Object value readMethod.invoke(source);if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {writeMethod.setAccessible(true);}writeMethod.invoke(target, value);} catch (Throwable var17) {throw new FatalBeanException(Could not copy property targetPd.getName() from source to target, var17);}}}}}}} 所以综上所述 Mapstruct的高性能是毋庸置疑的这也是我选择使用他的根本原因。在使用方式上和BeanUtils对比Mapstruct需要创建mapper接口和自定义转换工具类其实上手成本并不高但是我们换取了高性能这是非常值得的所以强烈推荐大家使用Mapstruct是时候和BeanUtils说再见了 对于 Mapstruct更深入的学习大家可以自己自行搜索学习~

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

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

相关文章

Linux 基础IO与系统IO - 实践

Linux 基础IO与系统IO - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

从零开始,使用Idea工具搭建一个springboot项目

一,搭建之前准备 搭建之前先确保本机已正确安装JDK,Maven,IDEA。 以下是我的配置: OpenJDK 17 Maven 3.9.11 IDEA 2025 二,开始搭建1,打开Idea工具,File->New-> Project...2,左边选择“Spring Boot"…

最优/极值问题的算法选择

如何选择滑动窗口、二分、动态规划算法 刷leetcode时对于一些最优/极值问题往往不知采用哪一种算法,故借助大模型学习一些算法要点。1. 滑动窗口(Sliding Window) 特点适用于 数组 / 字符串 的 连续子区间 问题。 目…

珠海的门户网站有哪些深圳地址大全

ScottPlot是一款简单易用、高度定制、性能卓越的.NET绘图库,支持跨平台操作。除提供标准图表类型外,还支持交互式操作,呈现生动的数据展示。在工厂数字化系统中,可用于生产数据可视化、设备监测和质量控制。无论用于科学研究、数据…

网站开发和推广方案永康市建设银行网站查询

PHP程序的调试一直是一件让人头疼的事,它既不像VB等高级语言那样有集成的编译调试环境,也不想Perl那样可以在Linux或者DOS环境下直接运行。其实,我们完全可以通过灵活地使用echo语句来完成对PHP的调试工作。下面的几个函数可以让你随时查看程…

梁山网站建设多少钱wordpress文章末尾添加内容

前言 有时遇到这样的需求,就是在表格里面嵌入一个表格,以及要求带有分页,这样在ElementPlus中很好实现。以下使用Vue2语法实现一个简单例子,毕竟Vue3兼容Vue2语法,若想要Vue3版本例子,简单改改就OK了。 一…

外贸建站wordpress昆山网站建设jofuns

以下内容整理于Linux字符设备驱动剖析,如有侵权请告知删除 。 一、应用层的程序 应用程序一般都是open打开设备文件,read、write、ioctl设备文件,最后close设备文件退出。 int main(int argc ,char *argv[]) { unsigned char val[1] 1; …

第三方控件库的添加和使用

添加把第三方控件库先复制到根目录下 ,也就是Debug 的目录下然后再拖到工具箱的空白处下就可以了使用 和之前的控件使用相同 ‍

实用指南:基于 HTML、CSS 和 JavaScript 的智能图像灰度直方图匹配系统

实用指南:基于 HTML、CSS 和 JavaScript 的智能图像灰度直方图匹配系统2025-09-29 19:20 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: au…

C4NR PVP服务器1.2 天穹炮塔更新

C4NR PVP服务器1.2 天穹炮塔更新 更新内容在风弹获得处增加了一个建筑,可以使用风弹上去。上面是一个放置压力板的一个平台。踩压力板会获得20点风弹伤害并且生成一个风弹。玩家可以通过向指定方向攻击风弹来控制风弹…

树形dp [JOI Open 2020] 发电站 / Power Plant

作为最强摸鱼人的 BaiBaiShaFeng,这个题解也是发到洛谷上了,希望给过。 先辈们说的太简略了我感觉有点难懂,虽然我的表达能力很弱,估计强不了多少。 注:参考过网上零散题解。 题意很好理解,我们就不过多叙述了。…

深入解析:灵画-AI绘画小程序

深入解析:灵画-AI绘画小程序pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

AT_arc156_b [ARC156B] Mex on Blackboard

首先枚举你花 \(i\) 次操作可以搞到的最大值是什么,然后你剩下的集合就随便取,只要取不超过 \(k - i\) 个即可,用插板法很容易做。

实用指南:CAN邮箱深度解析:从硬件架构到实战应用

实用指南:CAN邮箱深度解析:从硬件架构到实战应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

产品排序

考虑区间 $dp$。设 $f_{i,j}$ 表示处理 $[i,j]$ 最小的总惩罚值。分类: - 产品 $i$ 第一个出栈,则有 $f_{i,j}=t_i\times sd_{i,j}+f_{i+1,j}$ - 产品 $i$ 第 $k$ 个出栈,则有 $f_{i,j}=f_{i+1,k}+f_{k + 1,j}+st_{…

众包网站开发网站建设录哪个科目

先拆成链的情况来看。 设B[i]表示i要向i1拿糖果的数量,C为平均数,则B[i] C - A[i] B[i-1] Answer就是B的绝对值之和 现在来看环的情况,也就是说B[n]指的是n要向1拿糖果的数量。不妨设B[n]为K,则B[1] C - A[1] K………… 照着式…

云阳一平米网站建设打开百度网页

LVGL_基础控件label 1、创建一个基础对象 /* 创建一个基础对象 label */ lv_obj_t * label lv_label_create(lv_scr_act()); // 创建一个label部件(对象),他的父对象是活动屏幕对象2、设置显示内容 char * text "www.100ask.net"; // 要显示的文字 /* 展示文…

环形链表II-leetcode

题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系…

ubuntu20.04安装nvidia显卡

24.04内核最新升级6.14.0,但是会出现英伟达驱动问题,现有的版本是6.8 重新安装了ubuntu20.04 先检查可用驱动:ubuntu-drivers devices下面会显示推荐安装的驱动版本,因为我原先的版本太低了,导致ubuntu内核更新一…

搬瓦工的主机可以用来做网站吗如何自己做加盟网站

文章目录 一.进程间通信:进程间通信的本质: 二.Linux管道通信匿名管道:关于管道通信的要点:基于匿名管道构建进程池: 三.System-V共享内存共享内存和命名管道协同通信 参考Linux内核源码版本------linux-2.4.3 一.进程间通信: 操作系统中,为了保证安全性,进程之间具有严格的独…