Springboot + MySQL+ JPA Ⅲ delete方法详解

本文详细解析了Springboot结合JPA进行数据删除的多种方式,包括deleteById、delete、deleteAllById、deleteAll、deleteAllInBatch以及deleteAllByIdInBatch。对比了它们的实现原理和实际效果,强调了批量删除在处理大量数据时的效率优势。
摘要由CSDN通过智能技术生成

一、deleteById(Id id) 和 delete(T entity)

为什么要把这两个方法放在一起呢?我们先看源码再说

deleteById源码(通过id进行删除)

@Transactional
@Override
public void deleteById(ID id) {

   Assert.notNull(id, ID_MUST_NOT_BE_NULL);

   delete(findById(id).orElseThrow(() -> new EmptyResultDataAccessException(
         String.format("No %s entity with id %s exists!", entityInformation.getJavaType(), id), 1)));
}
复制代码

delete源码(通过实体对象进行删除)

@Override
@Transactional
@SuppressWarnings("unchecked")
public void delete(T entity) {

   Assert.notNull(entity, "Entity must not be null!");

   if (entityInformation.isNew(entity)) {
      return;
   }

   Class<?> type = ProxyUtils.getUserClass(entity);

   T existing = (T) em.find(type, entityInformation.getId(entity));

   // if the entity to be deleted doesn't exist, delete is a NOOP
   if (existing == null) {
      return;
   }

   em.remove(em.contains(entity) ? entity : em.merge(entity));
}
复制代码

一目了然了吧!deleteById先在方法体内通过id求出entity对象,然后调用了delete的方法。也就是说,这两个方法同根同源,使用起来差距不大,结果呢?也是一样的,就是单条删除。实际使用中呢,也是使用deleteById的情况比较多,废话少说,try it。

Service层中添加deleteById方法(deleteById是三方件自带接口不需要在dao层中添加)

@Transactional
public void deleteById(Integer id){
    userDao.deleteById(id);
}
复制代码

control层

/**
 * 通过id进行删除数据
 * @param id
 */
@GetMapping("/deleteById")
public void deleteById(Integer id){
	userService.deleteById(id);
}
复制代码

浏览器测试成功 http://localhost:7777/deleteById?id=2


控制台打印了两行sql,如下:

Hiber
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值