添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

我们在之前几篇都讲到了在创建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);}

我们在进行批量删除操作时尽量使用JpaRepository自带的批量删除方法deleteInBatch(Iterable entities)以及deleteAllInBatch()。 如果该文章对您有帮助,请帮忙点赞和投票,您的支持是我持续写作的动力。