Java代码实现两个数据库之间的数据同步(亲测有效)
之前在网上看到这个文章 正好公司有用到
//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 是自定义的一个常量标识符,随便定义
这样就可以实现数据库同步了
下一篇:
通过SQL命令创建表、删除表(二)