前言
-
需求:对两个数据库(一个SqlServer,一个MySQL),同一张表做数据同步,保证两边数据库数据一致
-
流程:把两个数据库表的数据都捞出来,通过程序过滤筛选出两个表中不一样的数据,然后处理
1.基础类
- 由于两边表结构都一样,我这边就共用一个表方便测试
@Data
public class SysUser {
/**
* 名称
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 身高
*/
private Integer height;
}
2.核心代码
- 模拟数据
public static void main(String[] args) {
List<SysUser> list1 = new ArrayList<>();
SysUser user11 = new SysUser();
user11.setName("张三");
user11.setAge(21);
user11.setHeight(178);
list1.add(user11);
SysUser user12 = new SysUser();
user12.setName("李四");
user12.setAge(18);
user12.setHeight(178);
list1.add(user12);
List<SysUser> list2 = new ArrayList<>();
SysUser user22 = new SysUser();
user22.setName("张三");
user22.setAge(19);
user22.setHeight(178);
list2.add(user22);
SysUser user24 = new SysUser();
user24.setName("王五");
user24.setAge(22);
user24.setHeight(168);
list2.add(user24);
SysUser user25 = new SysUser();
user25.setName("李四");
user25.setAge(18);
user25.setHeight(178);
list2.add(user25);
}
2.1.单条件筛选
- 通过
年龄
筛选list1不存在list2的数据
//单条件:通过 年龄 过滤
List<SysUser> collect = list1.stream().filter(s ->
!list2.stream().map(SysUser::getAge).collect(Collectors.toList()).contains(s.getAge())
).collect(Collectors.toList());
log.info("对比结果:{}", collect);
- 由于list1中有条age为21,list2中没有age为21的数据,所以list1中的张三这条数据就被筛选出来了
2.2.多条件筛选
- 通过
姓名、年龄
筛选list1不存在list2的数据
//多条件:通过 姓名、年龄 过滤
List<SysUser> collect = list1.stream().filter(tb ->
//判断是否有业务主键相同的数据
list2.stream().filter(t ->
t.getName().equals(tb.getName())
&& t.getAge().equals(tb.getAge())
).findFirst().orElse(null) == null
).collect(Collectors.toList());
log.info("对比结果:{}", collect);
- 由于list1中有条name为张三、age为21,list2中没有同时满足这两个条件的数据,所以list1中的张三这条数据就被筛选出来了