之前在网上看到这个文章
正好公司有用到
原文链接:https://blog.csdn.net/kitahiragawa/article/details/125980214
//A库中的数据拿到newList中,B库中的数据拿到oldList
List<Data> newDataList;
List<Data> oldDataList;
//从数据库中取数据......
//开始遍历比对
for (Data newData : newDataList) {
for (Data oldData : oldDataList) {
//通过主键判断oldData与newData是否为同一条记录(对应)
if (newData.getId().equals(oldData.getId())) {
//主键对应上了,下面判断数据是否发生更改
if (!newData.equals(oldData)) {
//新旧数据不同,发生了更改,将更改落盘到数据库
dataService.updateData(newData);
} else {
//新旧数据一致,说明没有发生更改,什么也不做
}
//新旧数据比对并操作后,将这两个数据从List中“移除”
newData = null;
oldData = null;
}
//两个数据主键没有对应上,说明不为同一条记录,继续遍历
}
//遍历完成之后,如果新数据在旧数据中有主键对应,则肯定会被置null
//没被置null说明这条新数据是新增的,需要调用接口落盘
if (newData != null) {
dataService.insertData(newData);
}
}
//遍历完新数据后,oldDataList中剩下的没被置null的都是需要删除的
for (Data oldData : oldDataList) {
if (oldData != null) {
dataService.deleteDataById(oldData.getId());
}
}
然后本人使用后发现有问题!!!
于是做了一点改变
//这个如果设置null,会导致一系列问题
newData = null;
oldData = null;
改变
//首先查询优时集合
List<EosVariety> eosVarietyList = eosVarietyService.list();
List<Variety> varietyList = this.list();
log.info("开始执行eos品种数据同步");
//遍历新数据集合
eosVarietyList.forEach(eosVariety -> {
//遍历老数据集合
for (Variety variety : varietyList) {
if (eosVariety.getProductNameCode().equals(variety.getVarietyNameCode())) {
//如果相同,则比较数据
if (!equalsData(eosVariety, variety)) {
//如果不一样则修改数据
updateData(eosVariety);
}
//设置对比后标识
eosVariety.setUpdateUser(BasicConstants.FLAG_NEW_DATA);
variety.setVarietyNameCode(BasicConstants.FLAG_OLD_DATA);
}
}
//没被置"自动同步"说明这条新数据是新增的,存到数据库
if (!BasicConstants.FLAG_NEW_DATA.equals(eosVariety.getUpdateUser())) {
//进行新增操作
Variety variety = new Variety();
BeanUtils.copyProperties(eosVariety, variety);
variety.setVarietyNameCode(eosVariety.getProductNameCode());
variety.setVarietyName(eosVariety.getProductName());
this.save(variety);
}
});
//遍历完新数据后,剩下的没被置null的都是需要删除的
varietyList.forEach(variety -> {
if (!BasicConstants.FLAG_OLD_DATA.equals(variety.getVarietyNameCode())) {
//进行删除操作
this.removeById(variety.getId());
}
});
BasicConstants.FLAG_NEW_DATA && BasicConstants.FLAG_OLD_DATA
是自定义的一个常量标识符,随便定义