Java:对比一个对象更新前后具体被修改了哪些值
Java:对比一个对象更新前后具体被修改了哪些值
Zyyyyu 的个人博客
遇到一个需求就是要记录每行数据被修改更新后,要记录下当前值和修改前的值
那有人就会说写个if去判断值是否被修改了,然后记录下来不就行了,这是一个思路,但只适用于该类的字段少的情况,而类的字段如果很多甚至几十上百个时,不可能挨个去写,且每次新增新的字段就需要再增加逻辑,所以该思路就会被直接pass掉。
思路讲解
既然没办法通过if去判断,那么还有一种办法,那就是通过反射去拿到这个类中所有字段,然后遍历这个类每个字段是否被修改,如果修改则记录下其值和字段名,下面的方法适用于所有类,所以基本是copy就可以用,以下为代码:
/*** 获取实体类被修改的字段名** @param clazz* @param obj1* @param obj2* @return*/private static List<String> getVariableNames(Class clazz, Object obj1, Object obj2) {// 存储被修改的字段名List<String> modifyFields = new ArrayList<>();try {// 解析对象1和对象2的JSONObjectJSONObject object1 = JSONUtil.parseObj(obj1);JSONObject object2 = JSONUtil.parseObj(obj2);// 获取该类的所有属性Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {// 设置属性可访问field.setAccessible(true);// 获取属性名String name = field.getName();// 判断对象1和对象2的属性数量是否不为0(如果是创建则object2为null)if (object1.size() != 0 && object2.size() != 0) {// 判断对象1和对象2的属性值是否都不为空(由于有一些属性始终为null,所以需要过滤掉,不然会空指针异常)if (StringUtils.isNotNull(object1.get(name)) && StringUtils.isNotNull(object2.get(name))) {// 判断对象1和对象2的属性值是否不相等if (!object1.get(name).equals(object2.get(name))) {// 添加属性名到列表中modifyFields.add(field.getName());}// 判断对象1属性值为空且对象2的属性值不为空(说明原先为赋值,后续赋值)} else if (StringUtils.isNull(object1.get(name)) && StringUtils.isNotNull(object2.get(name))) {modifyFields.add(field.getName());// 判断对象1属性值不为空且对象2的属性值为空(说明原先为赋值,后续删除)} else if (StringUtils.isNotNull(object1.get(name)) && StringUtils.isNull(object2.get(name))) {modifyFields.add(field.getName());}}}} catch (Exception e) {// 获取异常信息详情String exceptionMessage = ExceptionUtil.getExceptionDetailMessage(e);logger.error("获取被修改的字段名失败:{}", exceptionMessage);}return modifyFields;}
结论:
该方法是可实现的,如果要在数据库中存储这些被修改的字段名和值,这里还有个思路就是json,将修改前后的对象转为JSON存储到数据库,同时再用一个list记录被修改的字段名,如果需要的时候直接遍历去get两个json里面的值就可以了,也许会有更好的办法去实现,但是该方法是比较适用于我目前的项目,如果有更好的的办法可以在评论区下留言,互相学习。
相关文章:
Java:对比一个对象更新前后具体被修改了哪些值
Java:对比一个对象更新前后具体被修改了哪些值 Zyyyyu 的个人博客 遇到一个需求就是要记录每行数据被修改更新后,要记录下当前值和修改前的值 那有人就会说写个if去判断值是否被修改了,然后记录下来不就行了,这是一个思路&#x…...
GO——GMP 好文整理
GMP相关好文推荐: Golang 调度器设计思想、GMP 协程调度模型详解 Golang的协程调度器原理及GMP设计思想 Golang调度器GMP原理与调度全分析...
园区AR导航系统构建详解:从三维地图构建到AR融合导航的实现
随着现代园区规模的不断扩大与功能的日益复杂,传统的二维地图导航已难以满足访客高效、精准定位的需求。园区内部错综复杂的布局、频繁变更的商户位置常常让访客感到迷茫,造成寻路上的时间浪费。园区AR导航系统以创新的技术手段,破解了私域地…...
接口测试总结(非标准)
为什么要做接口测试? 答:接口测试是为了检测系统组件间接口的正确性和稳定性,以及检查数据的交换、传递和控制管理过程,以及系统间的相互逻辑依赖关系等。接口测试可以帮助我们发现系统中的潜在问题,确保系统的稳定性…...
在Ubuntu 18.04上安装和使用Composer的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 介绍 Composer 是一个流行的 PHP 依赖管理工具,主要用于简化项目依赖项的安装和更新。它会检查特定项目依赖的其他软件包&a…...
ssm 学习 ---(spring)
一、spring框架 1、基本框架 2、Beanfactory快速入门 配置清单:xml文件 (1) 导入jar包或者maven坐标 (2) 定义UserService接口以及UserService实现类 (3) 创建bean.xml配置文件,将UserService信息配置到该xml文件中; (4)编写测试代码,创…...
Jupyter Notebook安装及基本使用
Jupyter Notebook安装及基本使用 目录 Jupyter Notebook安装及基本使用方式一:Anaconda直接安装方式二:pip命令安装Jupyter使用虚拟环境 方式一:Anaconda直接安装 安装Anaconda 下载地址,输入邮箱,Windows下载 开始安…...
Jenkins+Maven+Gitlab+Tomcat自动化构建打包+部署
目录 环境准备 导入项目包 配置jenkins 构建项目 配置项目上线 修改项目代码测试 环境准备 本实操项目环境基于https://blog.csdn.net/Lzcsfg/article/details/140359830 首先在node01主机中操作,本次操作需要java8的版本,将之前安装的java17卸…...
Synchronized升级到重量级锁会发生什么?
我们从网上看到很多,升级到重量锁的时候不会降级,再来线程都是重量级锁 今天我们来实验一把真的是这样的吗 1.首选导入Java对象内存布局的工具库: <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-…...
【Webpack】HMR 热更新
HMR全称Hot Module Replacement,可以理解为模块热替换,指在应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个应用。 不使用热更新,我们在应用运行过程中修改了某个模块,通过自动刷新会导致整个…...
【计算机视觉】siamfc论文复现
什么是目标跟踪 使用视频序列第一帧的图像(包括bounding box的位置),来找出目标出现在后序帧位置的一种方法。 什么是孪生网络结构 孪生网络结构其思想是将一个训练样本(已知类别)和一个测试样本(未知类别)输入到两个CNN(这两个CNN往往是权值共享的)中࿰…...
PotatoTool 蓝队版 V1.3 发布:增强功能和性能优化
一、简介 经过广大网友的反馈和建议,我们对V1.1版本中存在的问题进行了优化。其中,我们针对MD5库进行了本地化处理,以提高查询效率。然而,这也导致了软件体积的飙升。二、优化概述 1、兼容性 兼容arm架构系统 2、UI 2.1 界面…...
pytest常用命令行参数解析
简介:pytest作为一个成熟的测试框架,它提供了许多命令行参数来控制测试的运行方式,以配合适用于不同的测试场景。例如 -x 可以用于希望出现错误就停止,以便定位和分析问题。–rerunsnum适用于希望进行失败重跑等个性化测试策略。 …...
pgsql-使用dump命令制作数据库结构、数据快速备份bat脚本
一、背景 通过pgsql的dump命令可以快速的做数据库表结构、表数据的备份,随着业务不断的增加单库单实例已经不能满足业务需要。技术人员是比较懒惰的,每次敲相同命令或是无脑的复制黏贴操作感觉都是对精神的一种摧残,解决摧残的方法就是把命令…...
【3D编程技巧】如何用四元数旋转矢量在相机空间进行光照计算
这里介绍一个小TIPS,很久没有这么有成就感了。我以前在学3D数学的时候,书上就有一句话,说你把矢量这些东西用久了,就应该形成一种“直觉”,仿佛这些东西就是你的左右手一样。而这次,我居然真的用“直觉”来…...
ICMP 和 IGMP 的区别
ICMP 和 IGMP 协议 IP 层分支图 ICMP(Internet Control Message Protocol,因特网控制信息协议) 用于补充 IP 传输数据报的过程中,发送主机无法确定数据报是否到达目标主机。 ICMP 报文分为出错报告报文和查询报文两种。 若数据…...
【Vue3】工程创建及目录说明
【Vue3】工程创建及目录说明 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日…...
算法学习2——排序算法(2)
上一篇介绍了几种常见且使用较多的排序算法,本章主要是一个进阶内容,介绍三个较为复杂的算法。 计数排序 (Counting Sort) 计数排序是一种适用于范围较小的整数序列的排序算法。它通过统计每个元素的出现次数,然后依次输出元素,…...
嵌入式人工智能(9-基于树莓派4B的PWM-LED呼吸灯)
1、PWM简介 (1)、什么是PWM 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是在具有惯性的系统中利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制…...
python-NLP:1中文分词
文章目录 规则分词正向最大匹配法逆向最大匹配法双向最大匹配法 统计分词语言模型HMM模型 jieba分词分词关键词提取词性标注 规则分词 基于规则的分词是一种机械分词方法,主要是通过维护词典,在切分语句时,将语句的每个字符串与词表中的词进行…...
pdf2pptx:三分钟实现LaTeX幻灯片到PowerPoint的无缝转换
pdf2pptx:三分钟实现LaTeX幻灯片到PowerPoint的无缝转换 【免费下载链接】pdf2pptx Convert your (Beamer) PDF slides to (Powerpoint) PPTX 项目地址: https://gitcode.com/gh_mirrors/pd/pdf2pptx 还在为学术演示的格式兼容问题烦恼吗?你是否需…...
[特殊字符] 论文查重居然能白嫖?这个AI工具的底层逻辑,今天给你讲透
同学们,我是你们的论文写作科普老友。 今天这期不教写作技巧,专门来聊一个所有人写完论文都绕不开、却很少有人真正搞懂的东西——查重。 你肯定遇到过这种场景:论文写了两万字,满怀信心提交查重,结果报告一出来&…...
百度首页网页图片更多当AI开始写测试用例,手工测试工程师的护城河在哪里?
一、 第一道护城河:从“用例执行者”到“策略设计者”AI可以基于需求文档和历史数据,瞬间生成海量测试用例。但它无法回答一个根本性的问题:我们究竟应该测试什么?测试策略的设计,是在有限的时间和资源下,对…...
Pycharm更新骨架卡死C盘?罪魁祸首是torch-geometric的四个依赖库
PyCharm更新骨架卡死C盘?深入解析torch-geometric依赖库的存储陷阱 当你在PyCharm中启动一个包含torch-geometric的项目时,是否经历过C盘空间被神秘吞噬的噩梦?那个名为"Updating skeletons"的后台进程,本应是IDE的贴心…...
基于MCP协议的制药研发智能数据管道:架构、部署与应用
1. 项目概述:当制药研发遇上智能数据管道如果你在制药行业或者生物科技领域待过,哪怕只是边缘岗位,也一定对“数据孤岛”和“信息滞后”这两个词深恶痛绝。新药研发的每个环节——从靶点发现、化合物筛选、临床前研究到临床试验——都在源源不…...
架构范式转移:DeepSeek-Coder-V2如何重构企业级代码智能的ROI模型
架构范式转移:DeepSeek-Coder-V2如何重构企业级代码智能的ROI模型 【免费下载链接】DeepSeek-Coder-V2 DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Code…...
静态前端项目实战:从营销页到现代化门户的架构与实现
1. 项目概述:一个纯粹的静态前端项目最近在GitHub上看到了一个名为“Vibe Code”的项目,它的README写得非常漂亮,充满了各种炫酷的特性介绍,比如支持Claude Code、OpenAI Codex等AI编程助手,还有深色/亮色主题切换、多…...
不止于透传:用VirtIO-GPU为你的KVM虚拟机开启3D加速(附XML配置详解)
VirtIO-GPU虚拟化加速实战:从原理到配置的深度解析 在虚拟化技术日益成熟的今天,GPU加速已成为开发测试、图形工作站和云桌面等场景的刚需。传统GPU透传方案虽然性能接近原生,但受限于硬件数量且缺乏灵活性。VirtIO-GPU结合virglrenderer的软…...
Midjourney生成伪3D到真3D渲染的临界点在哪?——基于1327组渲染样本的Z-depth一致性、法线贴图兼容性与Blender导入成功率实测报告
更多请点击: https://intelliparadigm.com 第一章:Midjourney生成伪3D到真3D渲染的临界点在哪? Midjourney 本身不生成可编辑的 3D 几何体,其输出始终是静态二维图像——即便使用 --style raw 或 --v 6.1 配合 3D render、octane…...
Anno 1800模组加载器:企业级XML智能合并与高性能游戏扩展架构实现指南
Anno 1800模组加载器:企业级XML智能合并与高性能游戏扩展架构实现指南 【免费下载链接】anno1800-mod-loader The one and only mod loader for Anno 1800, supports loading of unpacked RDA files, XML merging and Python mods. 项目地址: https://gitcode.com…...
