springboot jpa 关联数据?

本篇内容介绍了“SpringBoot JPA中delete的使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

常见db中的四个操作curd,前面的几篇博文分别介绍了insert,update,接下来我们看下delete的使用姿势,通过JPA可以怎样删除数据

一般来讲是不建议物理删除(直接从表中删除记录)数据的,在如今数据就是钱的时代,更常见的做法是在表中添加一个表示状态的字段,然后通过修改这个字段来表示记录是否有效,从而实现逻辑删除;这么做的原因如下

  • 物理删除,如果出问题恢复比较麻烦

  • 无法保证代码一定准确,在出问题的时候,删错了数据,那就gg了

  • 删除数据,会导致重建索引

  • Innodb数据库对于已经删除的数据只是标记为删除,并不真正释放所占用的磁盘空间,这就导致InnoDB数据库文件不断增长,也会导致表碎片

  • 逻辑删除,保留数据,方便后续针对数据的挖掘或者分析

在开始之前,当然得先准备好基础环境,如安装测试使用,创建SpringBoot项目工程,设置好配置信息等,关于搭建项目的详情可以参考前一篇文章

下面简单的看一下演示添加记录的过程中,需要的配置

沿用前一篇的表,结构如下

配置信息,与之前有一点点区别,我们新增了更详细的日志打印;本篇主要目标集中在添加记录的使用姿势,对于配置说明,后面单独进行说明

数据修改嘛,所以我们先向表里面插入两条数据,用于后面的操作

下面谈及到的删除,都是物理删除,可以理解为直接将某些记录从表中抹除掉(并不是说删了就完全没有办法恢复)针对CURD四种操作而言,除了read之外,另外三个insert,update,delete都会加写锁(一般来将会涉及到行锁和gap锁,从后面也会看到,这三个操作要求显示声明事物)

前面插入篇已经介绍了POJO的逐步创建过程,已经对应的注解含义,下面直接贴出成果

上面类中的几个注解,说明如下

  • @Column表明这个属性与表中的某列对应

  • @CreateDate根据当前时间来生成默认的时间戳

接下来我们新建一个api继承自CurdRepository,然后通过这个api来与数据库打交道

先写一个用于查询数据的方法,用于校验我们执行删除之后,是否确实被删除了

在执行下面操作之前,先调用上面的,输出结果如

a. 根据主键id进行删除

这种应该属于最常见的删除方式了,为了避免误删,通过精确的主键id来删除记录,是一个非常好的使用姿势,CrudRepository这个接口已经提供了对应的方法,所以我们可以直接使用

// 直接根据id进行删除

执行完毕之后,输出结果如下,对比前面的输出可以知道 id=21 的记录被删除了

然后一个疑问自然而然的来了,如果这个id对应的记录不存在,会怎样?

把上面代码再执行一次,发现抛了异常

为什么会这样呢?我们debug进去,调用的实现是默认的 SimpleJpaRepository,其源码如

从源码可以看出,这个是先通过id进行查询,如果对应的记录不存在时,直接抛异常;当存在时,走remove逻辑;

如果我们希望删除一个不存在的数据时,不要报错,可以怎么办?

然后再调用上面的方法就可以了,不演示具体的测试case了,源码可以到项目工程中查看 ???? 源码

虽然根据id进行删除比较稳妥,但也无法避免某些情况下需要根据其他的字段来删除,比如我们希望删除名为 jpa 一灰灰7的数据,这时则需要我们在MoneyDeleteRepository新增一个方法

这里比较简单的提一下这个方法的命名规则,后面在查询这一篇会更加详细的说明;

  • delete 表示执行的是删除操作

  • By 表示根据某个字段来进行条件限定

调用方式和前面一样,如下

然后我们执行上面的测试,发现并不能成功,报错了

通过前面update的学习,知道需要显示加一个事物的注解,我们这里直接加在Repository

然后再次执行输出如下,这里我们把sql的日志也打印了

从最终剩余的记录来看,name为jpa 一灰灰7的被删除了,再看一下前面删除的sql,会发现一个有意思的地方,deleteByName 这个方法,翻译成sql变成了两条

接下来演示一个删除money在[]区间的记录,这时我们新增的放入可以是

* 根据数字比较进行删除

从拼接的sql可以看出,上面的逻辑等同于,先执行了查询,然后根据id一个一个进行删除....

我们通过声明方法的方式来实现条件删除;需要注意

  • 删除一个不存在的记录,会抛异常

  • 声明删除方法时,实际等同于先查询记录,然后根据记录的id进行精准删除

“SpringBoot JPA中delete的使用方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

Spring Data JPA是Spring Data的一个子项目,通过提供基于JPA的Repository极大的减少了JPA作为数据访问方案的代码量,你仅仅需要编写一个接口集成下SpringDataJPA内部定义的接口即可完成简单的CRUD操作。
本文从构建项目到对JPA的详细使用,争取能够尽量全的演示JPA的相关应用,大体内容如下:

  • 表关系配置演示:多对多、多对一、一对多
  • JPA实体对象的4种状态详解
  • 性能问题解决(循环引用、N+1查询)

新建springboot项目,在pom文件中引入jpa的相关依赖,如下:


 MIT)设置为COMMIT模式,该模式下只有在事务提交时才会执行flush()。
 
 
  • clear():把实体管理器中所有的实体对象(托管状态)变成游离状态,clear()之后,对实体类所做的修改也会丢失。
  •  
     
    现在我们再回到更新方法,为了方便查看,我们摘取出上面写好的更新方法实现

    * 将给定的规范与当前规范进行或运算。

这篇文章主要介绍了SpringBoot整合SpringDataJPA代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

使用数据库是开发基本应用的基础,借助于开发框架,我们已经不用编写原始的访问数据库的代码,也不用调用JDBC(Java Data Base Connectivity)或者连接池等诸如此类的被称作底层的代码,我们将从更高的层次上访问数据库,这在Springboot中更是如此,本章我们将详细介绍在Springboot中使用 Spring Data JPA 来实现对数据库的操作。

其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术。

我要回帖

更多关于 springboot返回json 的文章

 

随机推荐