Spring Data JPA删除及批量删除功能 delete(list)和deleteInBatch(list)
https://blog.csdn.net/weixin_33508642/article/details/114315542
在之前的Spring Data JPA基础增删改查篇我们介绍了根据主键id进行删除的方法,实际上Spring Data JPA也提供了批量删除一组数据和批量删除全部数据的方法。对Spring Data JPA不熟悉的朋友可以参考下文先了解Spring Data JPA的基本使用,再根据本篇进行其他练习。
方法/步骤
我们在之前几篇都讲到了在创建Repository接口时需要继承JpaRepository接口,我们查看该接口的源码可以看到有如下两个批量删除的方法,deleteInBatch(Iterable<T> entities)批量删除一组集合数据,以及deleteAllInBatch()批量删除全部数据的接口。
我们之前介绍过基本的根据id删除的方法,如下图所示。
@DeleteMapping(path = "/delete/{id}")public void delete(@PathVariable Long id) { userRepository.delete(id);}
接下来我们看看同样是删除全部的deleteAll()和deleteAllInBatch()的区别。deleteAll()是删除全部,先findALL查找出来,再一条一条删除,最后提交事务。deleteAllInBatch()是删除全部,一条sql。显而易见,deleteAllInBatch()方法效率更高一些。
以上两种方法的代码如下:
/** * 删除全部,先findALL查找出来,再一条一条删除,最后提交事务 */@DeleteMapping(path = "/delete/all")public void deleteAll() { userRepository.deleteAll();}/** * 删除全部,一条sql */@DeleteMapping(path = "/delete/batch")public void deleteBatch() { userRepository.deleteAllInBatch();}
启动应用后,使用postman进行调用,查看控制台打印的sql可以发现,步骤3的结论是正确的。
接下来我们再看看同样是删除一组集合中的数据,delete(list)和deleteInBatch(list)哟什么区别。同样的,delete()方法打印的sql是一条一条删除的,而deleteInBatch()是一条sql语句删除的。
/** * 批量删除,删除集合,一条一条删除 */@PostMapping(path = "/delete/list")public void deleteList(@RequestBody List<User> list) { userRepository.delete(list);}/** * 批量删除,删除集合,一条sql,拼接or语句 如 id=1 or id=2 * @param list */@PostMapping(path = "/delete/batch/list")public void deleteBatchList(@RequestBody List<User> list) { userRepository.deleteInBatch(list);}
我们在启动服务后用postman进行测试,请求的url、参数及测试的结果如下图所示。我们同样将步骤5中的两个方法的sql语句打印出来,可以看到符合步骤5的结论。
END
注意事项
- 我们在进行批量删除操作时尽量使用JpaRepository自带的批量删除方法deleteInBatch(Iterable entities)以及deleteAllInBatch()。
- 如果该文章对您有帮助,请帮忙点赞和投票,您的支持是我持续写作的动力。