关于java对比数据以及后续数据库操作(1)

本文介绍了一个数据对比功能的实现,通过Java处理申请人修改数据并进行审批流程的对比。涉及反射操作数据库,对比前后数据,处理新增、修改、删除三种情况,并利用特殊ID避免重复数据。

   这段时间做了一个数据对比的功能模块。具体操作是从申请人修改自己的数据然后提交数据进行多次审批,如果审批完成那么则更新对应的数据。再此中间,审批人可以对申请人的信息进行编辑。

  先说一下思路吧,这是表结构

  通过进行修改数据与数据库数据进行比较,如果有改变那么进插入数据。每修改一个字段的数据则插入一条数据。applicationMainId是对应的申请主表Id,这里将不对流程操作进行解释。

   首先,创建你需要接收数据的实体类,这里因为界面上展示的并不是数据库中所有的数据,所以建议不要使用与数据库对应的那张关系表。

  接收到前端传递的数据之后,然后找到对应的数据库中的数据进行对比(UserChangeDo是我对应的修改数据信息表)

   第一种情况:对某一模块进行修改 (数据库中有对应数据) ----这里说明一下,因为最后会通过反射来操作数据库,所以表名称和字段名称必须有

 /**
  *obj1 数据库对应数据
  *obj2 修改之后的数据
  *ignoreArr 不需要进行对比的属性
  *modelType 对应表名
  *feildId 对应数据主键
  *userId 申请人id
  *dealId 操作人id
 **/
public List<UserChangeDo> compareFields(Object obj1, Object obj2, String[] ignoreArr,String modelType,Integer feildId,Integer userId,Integer dealId) {
        try {   
            List<UserChangeDo> list = new ArrayList<>();
            List<String> ignoreList = null;
            if (ignoreArr!= null && ignoreArr.length > 0) {
                // array转化为list
                ignoreList = Arrays.asList(ignoreArr);
            }
            // 只有两个对象都是同一类型的才有可比性
            if (obj1.getClass() == obj2.getClass()) {
                Class clazz = obj1.getClass();
                // 获取object的属性描述
                PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,
                        Object.class).getPropertyDescriptors();
                // 这里就是所有的属性了
                for (PropertyDescriptor pd : pds) {
                    // 属性名
                    String name = pd.getName();
                    // 如果当前属性选择进行比较,跳到下一次循环
                    if (ignoreList != null && ignoreList.contains(name)) {
                              continue;
                    }
                    // get方法
                    Method readMethod = pd.getReadMethod();
                    // 在obj1上调用get方法等同于获得obj1的属性值
                    Object objBefore = readMethod.invoke(obj1);
                    // 在obj2上调用get方法等同于获得obj2的属性值
                    Object objAfter = readMethod.invoke(obj2);
  
                    // 比较这两个值是否相等
                    else if (!objBefore.equals(objAfter)) {
                            //进行赋值操作
                            //实例化UserChangeDo type设置为2(代表更新) 封装数据之后装入list中 
                       }
                    }
             }
            return list;
        } catch (Exception e) {
            logger.error(e.getMessage());
            return null;
        }
    }
}

  第二种情况:新增模块(数据库中没有对应数据) 由于代码无法拷贝出来,所以这里只进行思路讲解以及简单的代码展示

  由于员工个人信息中的工作经历可能会有多条记录,所以有以下情况

   1.数据库中和前端传递都有值

    此时,我们遍历两个集合。将它们的主键id进行比较,如果相同,那么进行之前的数据对比。

   1.1

    在此情况中,我们还需要判断前端是否有新增的数据,所以过滤出前端传递数据中没有id的数据,进行新增(由于代码比较长,所以这里会有多张图,大家谅解)

   我这里加了一个specialId是为了给新增的模块一个唯一标识符 ,而且由于新增,所以是没有之前数据库的值。所以传值的时候,将obj1设置为null即可。

 

ok,该情况完成。

1.3

接下来判断是否有删除的数据,拿到数据中对应的id与前端传递的id进行比较。如果原来数据中有,但是现在前端传递中没有,那么说明该模块被删除了。得到删除的id进行操作。大家可以看到下面这张图,我obj2传的是null,这说明是删除。而KEY_EDUCATION是我设置的一个常量,对应的实体类名称。然后将type设置为3,代表删除。

2.数据库中有值,现在没值。这里就不多做解释了,就是删除

3.数据库没有值,但是现在有值。说明是新增 (注意:大家不要去管附件处理,因为这边只是做了一个简单地操作,针对附件的审批以后会进行详解)

 

ok,3种情况分析完成。接下来对应数据塞入数据库即可。

最后,这里详细讲解一下我的思路:申请人第一次申请提交之后会就会走这个流程,当第一个审批人给申请人进行审批的时候,也会进行该流程操作。这里就会用到specialId,由于每个某块的specialId都是相同的,所以从第二次开始,只要是新增的操作,前端会将对应的specialId装入对应的实体类中,然后返回给后台。此时,我们又会得到新的比较之后的数据,但是由于两次的数据中可能会有重复的操作数据(例如:申请人改动了年龄,审核人就会看到改动的数据,然而审核人并没有修改,就通过了审批。这时前端传过来的值就是之前申请人修改的值,与数据库以前的数据进行比较之后,也会被视为修改了的数据。这时候就会出现两条一样的数据。所以这时候要剔除掉这条数据,因为审核人并没有修改。亦或是申请人新增了工作经历模块,审核人看到了并没有修改,就直接通过了。此时我们就会通过specialId来进行条件作为比较)

 

这里说明一下,申请人提交数据之后会通过好几个人的审批才会完成整个流程,当完成流程之后才会对数据库的数据进行操作。所以在此流程中,需要去对比修改的数据。

 

大家请多提出观点,我会及时进行解答和修改的。谢谢大家!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值