当前位置: 首页 > news >正文

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里面的值就可以了,也许会有更好的办法去实现,但是该方法是比较适用于我目前的项目,如果有更好的的办法可以在评论区下留言,互相学习。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • sqlalchemy_dm
  • JS中的File(五):node.js中的file模块使用
  • pytest:4种方法实现 - 重复执行用例 - 展示迭代次数
  • Java周总结7.20day
  • Python学习笔记—100页Opencv详细讲解教程
  • .NET 通过系统影子账户实现权限维持
  • 当Excel处理神器EasyExcel遇上Apache POI:一场关于依赖的趣味‘撞车’冒险
  • swift小知识点(二)
  • 使用APEXSQL LOG解析sql server事务日志,进行审计与数据恢复
  • 手撕排序算法:冒泡排序
  • GPT-5一年半后发布
  • 【Linux】编辑器vscode与linux的联动
  • 通过 Nginx 修复 CORS 漏洞
  • Web3D:WebGL为什么在渲染性能上输给了WebGPU。
  • Mysql集合转多行
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Angular4 模板式表单用法以及验证
  • Date型的使用
  • HTTP那些事
  • javascript从右向左截取指定位数字符的3种方法
  • mongodb--安装和初步使用教程
  • nodejs实现webservice问题总结
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • tweak 支持第三方库
  • TypeScript实现数据结构(一)栈,队列,链表
  • Zepto.js源码学习之二
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 计算机常识 - 收藏集 - 掘金
  • 今年的LC3大会没了?
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 区块链将重新定义世界
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 译米田引理
  • hi-nginx-1.3.4编译安装
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​secrets --- 生成管理密码的安全随机数​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # dbt source dbt source freshness命令详解
  • #微信小程序:微信小程序常见的配置传旨
  • (1)svelte 教程:hello world
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (day 12)JavaScript学习笔记(数组3)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)ssm码农论坛 毕业设计 231126
  • (三十五)大数据实战——Superset可视化平台搭建
  • (学习总结16)C++模版2
  • (转)EOS中账户、钱包和密钥的关系
  • (自用)gtest单元测试
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET6 命令行启动及发布单个Exe文件
  • .NetCore项目nginx发布
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @ModelAttribute 注解