周末在家突然想到之前写的代码处理逻辑有问题,心痒难耐终于熬到周一,可以修改了。
代码背景是根据传入的数据,获取特定字段,比如hagkDealerId,到对应的数据库里查询是否已经同步过该数据。
//判断hage数据库t_hage_dealer中是否已存在该经销商,d.getIsSynced()可能有三种情况,0,1,null
DealerEntity d = dealerRepository.findFirstByHawkDealerId(String.valueOf(dealerId.get("hawkDealerId")));
if (d!=null) {
continue;
}
可以说非常简单粗暴了,查不到数据,说明没同步,继续往下走。查到有数据,说明同步过,结束本次循环。
我使用isSynced来标记数据的同步状态,0为未同步至电商平台,同步至电商平台后,根据获取电商平台返回值并修改同步标记0→1,表示同步成功。
所以查询出来的d.getIsSynced(),其实会有三种情况。0,1,null:
0对应同步至hage但没有成功同步到电商平台的状态,可能是数据有问题;
1表示数据已经成功同步到电商平台;
null表示这次的数据为新数据;
所以原先的判断显然是不对的,如果操作人员修正了有问题的数据,尝试重新同步时,会因为之前有数据不为空而直接跳过。
//判断hage数据库t_hage_dealer中是否已存在该经销商,d.getIsSynced()可能有三种情况,0,1,null
DealerEntity d = dealerRepository.findFirstByHawkDealerId(String.valueOf(dealerId.get("hawkDealerId")));
if (d.getIsSynced()==0) {
dealerRepository.delete(d);
}else if(d.getIsSynced()==1){
continue;
}
如果查询到的同步标记为0,那就删掉数据库中的原数据,重新同步;
如果查询到的同步标记为1,跳出本次循环;
如果未查询到数据,不受影响继续同步;
这种情况下,如果数据库中没有数据,即为null的情况,尝试获取其isSynced值,会报空指针异常。
于是做如下改动:
//判断hage数据库t_hage_dealer中是否已存在该经销商,d.getIsSynced()可能有三种情况,0,1,null
DealerEntity d = dealerRepository.findFirstByHawkDealerId(String.valueOf(dealerId.get("hawkDealerId")));
if (d==null){
insertDealer(dealerEntity,dealerId);
}else if(d.getIsSynced()==0) {
dealerRepository.delete(d);
insertDealer(dealerEntity,dealerId);
}else if(d.getIsSynced()==1){
continue;
}
其中insertDealer()方法是【把经销商数据保存在hage数据库t】的动作抽象出来形成的方法。
对于数据处理的思考:
应该考虑到数据状态的所有可能性,并对每一种不同可能性的情况都做出相应的处理。不能简单笼统地一刀切处理数据。
另外一开始以为根据字段查出来数据库中值,赋值给d后,删除d只是把表层的d删除了,不会对数据库中的数据有影响。
但是dealerRepository.delete(d),这个操作,直接映射数据库,把数据库里的数据也删除了,可谓是触及灵魂深处的操作,233333
网友评论