很多时候, 我们需要写一大堆的代码维护新增删除和修改.
例如:
if (productDto.getId() != null) {
//如果是更新就找到需要删除的,删除以前的
List<ProductWithArea> remove = CommUtil.findDifferenceRemove(areas, oldData, p -> p.getProductId() + "#" + p.getAreaId());
if (CollectionUtil.isNotEmpty(remove)) {
productWithAreaService.removeByIds(remove.stream().map(ProductWithArea::getId).collect(Collectors.toList()));
}
List<ProductWithArea> add = CommUtil.findDifferenceAdd(areas, oldData, p -> p.getProductId() + "#" + p.getAreaId());
if (CollUtil.isNotEmpty(add)) {
productWithAreaService.saveBatch(add);
}
} else if (areas != null) {
productWithAreaService.saveOrUpdateBatch(areas);
}
流程如下:
我们可以直接使用公共方法完成:
/**
* 新增或者删除或者修改, 多对多关系表维护
* (注:多对多不涉及修改逻辑)
* @param newData 新数据(前端)
* @param oldData 老数据(数据库)
* @param getKey 对比key,非主键对比. 一般是: t-> t.getA()+"#" + t.getB() 比如商品与标签多对多关系表: t-> t.get商品Id()+"#" + t.get标签Id()
* @param <RT>
*/
protected <RT> void saveOrUpdateOrDeleteMany2Many(List<T> newData, List<T> oldData, SFunction<T, RT> getKey) {
newData = Optional.ofNullable(newData).orElse(new ArrayList<>());
oldData = Optional.ofNullable(oldData).orElse(new ArrayList<>());
TableInfo tableInfo = TableInfoHelper.getTableInfo(getEntityClass());
//对比,删除以前的老数据(以前有,现在没有)
List<T> remove = CommUtil.findDifferenceRemove(newData, oldData,getKey);
if (CollectionUtil.isNotEmpty(remove)) {
List<Serializable> removeIds = newData.stream().map(d -> findEntityId(d, tableInfo.getKeyProperty())).collect(Collectors.toList());
removeByIds(removeIds);
}
//对比,新增数据(以前没有,现在有)
List<T> add = CommUtil.findDifferenceAdd(newData, oldData,getKey);
if (CollUtil.isNotEmpty(add)) {
saveBatch(add);
}
}