自学内容网 自学内容网

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


原文地址:https://blog.csdn.net/warneraop/article/details/140544182

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!