假定有實體類RuleAssign.java
沫勿,對應(yīng)如下表:
id | type | rule |
---|---|---|
1 | a | 1001 |
2 | b | 1002 |
3 | c | 1003 |
一、單字段校驗
前端傳過來一批數(shù)據(jù)List<ruleAssign> datas
味混,需要對rule字段校驗唯一性产雹。這批數(shù)據(jù)既有新增數(shù)據(jù),也有修改數(shù)據(jù)翁锡。
第一步蔓挖,判斷datas
自身是否有重復(fù)rule字段。
Set<RuleAssign> set = new TreeSet<>(Comparator.comparing(RuleAssign::getRule));
set.addAll(datas);
if (set.size() < datas.size()){
throw new Exception("rule在list中不唯一");
}
這里用到了TreeSet有序集合馆衔,通過Comparator定義比較字段瘟判,將datas
去重,如果去重后的集合比原集合size小角溃,則說明有重復(fù)數(shù)據(jù)拷获,即有重復(fù)rule字段。
然后通過判斷id將數(shù)據(jù)分為 新增 和 修改 兩批减细。
List<ruleAssign> insert = datas.stream().filter(data -> data.getId == null).collect(Collectors.toList());
List<ruleAssign> update = datas.stream().filter(data -> data.getId != null).collect(Collectors.toList());
第二步匆瓜,處理新增數(shù)據(jù),判斷insert
中的rule
在數(shù)據(jù)庫中是否有重復(fù)值未蝌。將rule字段提取成一個List驮吱,然后使用sql查詢where in
語法判斷即可。
List<String> rules = insert.stream().map(RuleAssign::getRule).collect(Collectors.toList());
第三步萧吠,處理修改數(shù)據(jù)左冬,判斷update
中的rule
在數(shù)據(jù)庫中是否有重復(fù),對于每條數(shù)據(jù)有兩種情況怎憋。A:該條數(shù)據(jù)未修改rule
字段又碌,此時不需要判斷rule
唯一性,忽略該條數(shù)據(jù)绊袋。B:該條數(shù)據(jù)修改了rule
字段毕匀,此時需要判斷唯一性。下面我們進(jìn)行兩次TreeSet去重即可驗證重復(fù)癌别。
- 將數(shù)據(jù)庫中所有數(shù)據(jù)查出來
List<ruleAssign> origin
皂岔,然后將update
添加進(jìn)去,此時origin
中有原數(shù)據(jù)和修改后的數(shù)據(jù)展姐。
origin.addAll(update);
- 將 A 情況的數(shù)據(jù)過濾掉躁垛,
id
和rule
相同的數(shù)據(jù)即是未修改rule
字段的數(shù)據(jù)剖毯。
Set<RuleAssign> set = new TreeSet<>(Comparator.comparing(RuleAssign::getRule)
.thenComparing(RuleAssign::getId));
- 此時的
origin
中有原數(shù)據(jù)和修改過rule
字段的數(shù)據(jù),再按照第一步的方法校驗origin
中rule
的唯一性即可完成校驗教馆。
Set<RuleAssign> set = new TreeSet<>(Comparator.comparing(RuleAssign::getRule));
set.addAll(datas);
if (set.size() < data.size()){
throw new Exception("rule在DB中不唯一");
}
二逊谋、多字段聯(lián)合校驗
判斷流程和單字段一樣,只需要在上述過程中的Comparator
后面添加需要判斷的字段即可土铺,例如聯(lián)合校驗rule
和type
Set<RuleAssign> set = new TreeSet<>(Comparator.comparing(RuleAssign::getRule)
.thenComparing(RuleAssign::getType));
合理利用Comparator構(gòu)造器即可完成各種情況下的重復(fù)判斷胶滋。