开发中,经常会遇到新增,删除,更新的操作。
比如要编辑一道题目的4个选项,前端一般是4个选项为一组提交,那么提交的数据操作有3种
序号 |
前端提交数据 |
后台数据库数据 |
操作 |
1 |
存在 |
不存在 |
新增数据 |
2 |
存在 |
存在 |
修改 |
3 |
不存在 |
存在 |
删除 |
一般小伙伴操作时图省事,不管3721,先把DB中的数据Delete,那就只需要考虑第一种新增情况啦,是不是很简单, 但如果设计中有用到自增ID,那么删除数据肯定会有问题。
所以,我们要考虑不删除数据的情况,也就是分别做3种情况的校验。
先考虑删除情况, 这里的删除也仅是 逻辑删除 ,再处理新增和修改操作就简单了。
直接上伪代码,
// 常规操作:新增、更新、删除
List<Qa> old = find();
// 数据库数据,保存主键
List<Integer> originalEvent = old.stream().map(Qa::getId).collect(Collectors.toList());
// 前端传入的数据,也保存主键
List<Integer> paramEvent = dto.stream().map( DTO ::getId).collect(Collectors.toList());
// 删除操作,获取在DB,但不在DTO的数据
List<Integer> toDelete = originalEvent.stream().filter(item -> !paramEvent.contains(item)).collect(Collectors.toList());
List<Qa> toList = old.stream().filter(e -> toDelete.contains(e.getId())).collect(Collectors.toList());
if (!toList.isEmpty()) {
//将待删除的记录更新为删除
for (Qa qa : toList) {
qa.setDeleteFlag( Boolean .TRUE);
}
qaDao.save(toList);
}
// 遍历前端提交的数据, DB存在则更新,不存在则新增
for (QaDTO dto : Dto) {
Qa qa = qaDao.getById(dto.getId());
if (qa == null) {
// 新增操作
} else {
// 更新操作
}
}