spring boot 对象拷贝工具(Orika)

1.spring 自带拷贝工具

        LoginUser user = new LoginUser();
//        将data中字段相同的属性拷贝到user中BeanUtils.copyProperties(data , user);

2. 基于Orika的字节码拷贝工具

1) pom

		<!-- 基于字节码的深拷贝工具类 --><dependency><groupId>ma.glasnost.orika</groupId><artifactId>orika-core</artifactId><version>1.5.4</version></dependency>

2)工具类 OrikaUtils


import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import ma.glasnost.orika.metadata.TypeFactory;import java.util.Collection;
import java.util.List;
import java.util.Set;/*** @Description Orika深拷贝工具类* @date 2021/9/30 16:03
*/
public class OrikaUtils {private OrikaUtils() {}//单例模式(懒汉式、线程安全)private static class Builder{//通过工厂和建造者创建MapperFacade实例private static final MapperFacade mapper = new DefaultMapperFactory.Builder().build().getMapperFacade();}public static MapperFacade getMapper(){return Builder.mapper;}/*** @param srcObj  被拷贝对象* @param dstClass 目标对象类型* @return 返回新的目标对象的一个深拷贝** */public static <S, D> D mapBean(S srcObj, Class<D> dstClass) {return getMapper().map(srcObj, dstClass);}/*** @param srcList  映射的Iterable* @param dstClass 目标对象类型* @return 返回新的目标对象的一个深拷贝对象list** */public static <S, D> List<D> mapList(Iterable<S> srcList, Class<D> dstClass) {return getMapper().mapAsList(srcList, dstClass);}/*** @param srcList  映射的Iterable* @param srcClass  被拷贝对象类型* @param dstClass 目标对象类型* @return 返回新的目标对象的一个深拷贝对象list** */public static <S, D> List<D> mapList(Iterable<S> srcList, Class<S> srcClass, Class<D> dstClass) {return getMapper().mapAsList(srcList, TypeFactory.valueOf(srcClass), TypeFactory.valueOf(dstClass));}/*** @param srcSet  映射的Iterable* @param srcClass 目标对象类型* @return 返回新的目标对象的一个深拷贝对象set** */public  static <S , D> Set<D> mapSet(Iterable<S> srcSet , Class<D> srcClass ){return getMapper().mapAsSet(srcSet , srcClass);}/*** @param srcSet  映射的Iterable* @param srcClass  被拷贝对象类型* @param dstClass 目标对象类型* @return 返回新的目标对象的一个深拷贝对象set** */public static <S,D> Set<D> mapSet(Iterable<S> srcSet , Class<S> srcClass , Class<D> dstClass ){return getMapper().mapAsSet(srcSet , TypeFactory.valueOf(srcClass) , TypeFactory.valueOf(dstClass));}/*** @param destination  目标对象数组* @param source 映射的Iterable* @param destinationClass 目标对象类型* @return 返回新的目标对象的一个深拷贝数组对象** */public static <S, D> D[] mapArray(D[] destination, Iterable<S> source, Class<D> destinationClass){return getMapper().mapAsArray(destination , source , destinationClass);}/*** @param destination  目标对象数组* @param source 数组对象* @param destinationClass 目标对象类型* @return 返回新的目标对象的一个深拷贝数组对象** */public static <S, D> D[] mapArray(D[] destination, S[] source, Class<D> destinationClass){return getMapper().mapAsArray(destination , source , destinationClass);}/*** @param source  映射的Iterable* @param destination Collection及子类(set,queue,list)* @param destinationClass 目标对象类型* @return 对传入destination进行拷贝赋值** */public static <S, D>  void mapCollection(Iterable<S> source, Collection<D> destination, Class<D> destinationClass){getMapper().mapAsCollection(source,destination,destinationClass);}/*** @param source  映射的Iterable* @param destination Collection及子类(set,queue,list)* @param sourceClass 被拷贝的类型* @param destinationClass 目标对象类型* @return 对传入destination进行拷贝赋值** */public static <S, D>  void mapCollection(Iterable<S> source, Collection<D> destination, Class<S> sourceClass, Class<D> destinationClass){getMapper().mapAsCollection(source,destination, TypeFactory.valueOf(sourceClass) , TypeFactory.valueOf(destinationClass));}
}

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

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

相关文章

c++清空输入缓冲区_干货 | C++的输入输出方法

C和C并没有将输入与输出实现在语言中&#xff0c;而是在类库中实现。作为C的超集&#xff0c;C继承了C的输入输出方法。同时将输入与输出视为字流。流充当了程序和流源流目标之间的桥梁。本文将介绍C的输入输出方式&#xff0c;并且浅谈C与C均有的输入输出方式对C有一定学习的同…

【转】c# 命名空间和程序集

命名空间&#xff1a;用于对相关的类型进行逻辑分组&#xff0c;使用命名空间有利于方便定位一个类型 使用类的全权名&#xff1a; System.Text.StringBuilder sb new System.Text.StringBuilder(); 上面的写法很繁琐&#xff0c;使用using语句引入命名空间&#xff1a; usin…

Qt应用程序发布:Qt应用程序添加版本版权生产商等信息

设置方法 在QMake Manual手册中搜索关于QMAKE_TARGET内容可以看到有如下QMake变量&#xff1a; QMAKE_TARGET_COMPANY&#xff1a;用于指定生产商QMAKE_TARGET_DESCRIPTION&#xff1a;用于描述应用程序QMAKE_TARGET_COPYRIGHT&#xff1a;用于声明版权QMAKE_TARGET_PRODUCT&…

SM4前后端数据传输整体加密

1.SM所需包 pom <!--sm加密--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.69</version></dependency><dependency><groupId>com.alibaba</gr…

QWidget::size()和QResizeEvent::size()不一定相同!

问题发现 QGraphicsView中将画布设置为和视图相同大小需要使用e->size()&#xff0c;用this->size()会出现滚动条&#xff01; Qt手册中说&#xff0c; QWidget::size()是窗口大小&#xff08;不包括边框&#xff09;&#xff0c;e->size()是可视区域大小&#xff0…

stl源码剖析_STL源码剖析 阅读笔记(二)allocator

一、空间分配器 allocator从使用上看&#xff0c;空间分配在任何语言的任何组件都不需要我们去过多关心&#xff0c;因为语言、组件的底层肯定都比较完整的做了这件事情。从实现上看&#xff0c;学习 allocator 的原理在源码学习中是首当其冲。因为没有空间分配&#xff0c;则无…

【转】C#中的命名空间namespace全解

.NET Framework 类库提供下列命名空间&#xff1a; 【Microsoft】 Microsoft.CSharp 包含支持用 C# 语言进行编译和代码生成的类。 Microsoft.JScript 包含支持用 JScript 语言进行编译和代码生成的类。 Microsoft.VisualBasic 包含支持用 Visual Basic .NET 语言进行编译和…

easyexcel将对象处理为多列,自增序列

概述 主要记录在开发中遇到的问题&#xff1a;使用easyexcel导出excel&#xff0c;一般数据都是保存在数据库中&#xff0c;如果查询返回的是一个实体类&#xff0c;且里面有嵌套的实体类对象&#xff0c;这时导出的时候要先对查询出的数据进行业务逻辑处理&#xff0c;让它符…

Qt-VS开发:解决VS中使用带有信号槽的导出对象库时,信号槽不工作的问题

解决办法 需要把导出库的头文件加入到调用此动态库的项目中&#xff0c;只加入到搜索目录中是不行的。 加入到项目中后&#xff0c;VS会自动生成moc_xxx.cpp文件&#xff0c;可以在GeneratedFiles/Debug或GeneratedFile/Release中找到&#xff0c;必须有文件才能实现信号槽。

C# 编程规范

一、命名 1.用pascal规则来命名方法和类型. publicclass TextBox { publicvoid DataBind() { } } 2.用camel规则来命名局部变量和方法的参数&#xff0c; string strUserName;public AddUser(string userId, byte[] passWord); (并加前缀 数据类型&#xff0c;可选。)s…

python做excel表格代码_python操作excel表格

我们在写测试用例的时候&#xff0c;是创建一个表格.xlsx&#xff0c;然后把各种条件加到这张表格中去&#xff0c;所以&#xff0c;如何对excel表格操作&#xff0c;是相当重要的一环&#xff0c;那么&#xff0c;接下来&#xff0c;这篇博客就直接教会大家如何通过python去处…

Windows 查看程序ip地址(面对小白)

前言&#xff1a;Windows自带资源管理器可以查看程序的IP地址。下面以微信通话为例&#xff0c;详细步骤如下(面向小白)&#xff1a; 打开任务管理器 打开方法(以下方法都可以)&#xff1a; 键盘按住 【ctrl】 【alt】 【delete】 ,选择【任务管理器】Windows 10 以下系统…

解决Qt graphis-view框架中,上层图元接收hover事件导致底层图元接收不到的问题

问题重现 两个图元&#xff0c;一个在上面&#xff0c;名为item_up&#xff0c;一个在下面&#xff0c;名为item_below。 当item_up->setAcceptHoverEvents(true)时&#xff0c;item_up可以接收到鼠标悬停事件&#xff08;hoverEnter&#xff0c;hoverMove&#xff0c;hove…

【转】C#中相同不同程序集存在相同的命名空间的时候的冲突解决办法

快速解决办法描述描述: 1.将相同命名空间的不同程序集分别进行取别名&#xff1a;【具体操作:右击相同程序的引用&#xff0c;在别名上修改&#xff0c;默认的为global】。 2.调用&#xff1a;在所在调用文件里面最前面写 extern alias 别名&#xff0c;然后using 别名.Names…

chrome webdriver_(最新版)如何正确移除Selenium中的 window.navigator.webdriver

摄影&#xff1a;产品经理产品经理的三文鱼炒饭在《一日一技&#xff1a;如何正确移除Selenium中window.navigator.webdriver的值》一文中&#xff0c;我们介绍了在当时能够正确从Selenium启动的Chrome浏览器中移除window.navigator.webdriver的方法。后来时过境迁&#xff0c;…

【转】2.3async中必须始终返回Task(@Ron.liang)

Asp.Net Core 轻松学-经常使用异步的你,可能需要看看这个文章 目录 前言1. 异常的发生来得太突然2. 问题所在3. 问题的解决方案前言 事情的起因是由于一段简单的数据库连接代码引起&#xff0c;这段代码从语法上看&#xff0c;是没有任何问题&#xff1b;但是就是莫名其妙的报…

Qt事件传递相关问题

事件传递 涉及到深层次窗口结构或者窗口封装时&#xff0c;经常会遇到上层窗口接收不到事件的问题。排除这类问题需要了解窗口间的事件传递过程。 应用程序产生事件时&#xff0c;事件会先派发给父窗口&#xff0c;由父窗口在内部派发给子窗口&#xff0c;子窗口会进一步传递…

tableau 实战练习数据源分享_小白入行数据分析师3年-工作内容复盘分享含代码(二)-数据库及Tableau篇介绍...

前言本文是对使用的数据库以及Tableau的内容进行介绍&#xff0c;方便学习者了解数据库方向有哪些内容是需要有所了解以及可以注意的&#xff0c;分享内容基于个人对这些技能的理解&#xff0c;如有错误请及时指出&#xff0c;我会立马改进。数据库篇数据库这边&#xff0c;我的…

php隐藏webshell_PHP 安全的十个必备技巧

在这篇文章中&#xff0c;我将尝试为你提供一些可以提高 PHP 应用程序安全性的具体步骤。我关注的是 PHP 配置本身&#xff0c;所以我们不会讨论 SQL 注入、HTTPS 或其他与 PHP 无关的问题。我将使用我的 docker-entrypoint.sh 脚本中的 bash 行来说明示例&#xff0c;但当然你…

【转】WebSocket协议:5分钟从入门到精通

一、内容概览 由于WebSocket的出现&#xff0c;使得浏览器也具备了实时双向通信的能力。本文由浅入深&#xff0c;介绍了WebSocket建立连接、交换数据的细节&#xff0c;以及数据帧的格式。此外&#xff0c;还简要介绍了针对WebSocket的安全攻击&#xff0c;以及协议是如何抵御…