主角的理解子句怎么写的是什么?

有很多读者留言希望松哥能好好聊聊 Spring Data Jpa! 其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring Data 和 Jpa!

MIT 为直到提交事务时才更新数据库记录。

和在 SQL 中一样,JPQL 中的 select 语句用于执行查询。其语法可表示为:

  1. from 子句是查询语句的必选子句。
  2. select 用来指定查询返回的结果实体或实体的某些属性。
  3. from 子句声明查询源实体类,并指定标识符变量(相当于SQL表的别名)。
  4. 如果不希望返回重复实体,可使用关键字 distinct 修饰。select、from 都是 JPQL 的关键字,通常全大写或全小写,建议不要大小写混用。

在 JPQL 中,查询所有实体的 JPQL 查询语句很简单,如下:

这里关键字 as 可以省去,标识符变量的命名规范与 Java 标识符相同,且区分大小写,调用 EntityManager 的 createQuery() 方法可创建查询对象,接着调用 Query 接口的 getResultList() 方法就可获得查询结果集,如下:

其他方法的与此类似,这里不再赘述。

在 Spring Boot 中,Spring Data Jpa 官方封装了太多东西了,导致很多人用的时候不知道底层到底是怎么配置的,本文就和大伙来看看在手工的 Spring 环境下,Spring Data Jpa 要怎么配置,配置完成后,用法和 Spring Boot 中的用法是一致的。

首先创建一个普通的 Maven 工程,并添加如下依赖:

接下来创建一个 User 实体类,创建方式参考 Jpa 中实体类的创建方式,这里不再赘述。

这里和 Jpa 相关的配置主要是三个:

  • 一个是 Jpa 的事务
  • 一个是配置 dao 的位置

getUserById 表示根据 id 去查询 User 对象,只要我们的方法名称符合类似的规范,就不需要写 SQL,具体的规范一会来说。好了,接下来,创建 Service 和 Controller 来调用这个方法,如下:

这样,就可以查询到 id 为 1 的用户了。

首先来看 Repository 的一个继承关系图:

可以看到,实现类不少。那么到底如何理解 Repository 呢?

  1. 若我们定义的接口继承了 Repository, 则该接口会被 IOC 容器识别为一个 Repository Bean,进而纳入到 IOC 容器中,进而可以在该接口中定义满足一定规范的方法。
  2. Spring Data可以让我们只定义接口,只要遵循 Spring Data 的规范,就无需写实现类。

基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能,它的几个常用的实现类如下:

  • 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写

例如:定义一个 Entity 实体类:

使用 And 条件连接时,条件的属性名称与个数要与参数的位置与个数一一对应,如下:

  • 支持属性的级联查询. 若当前类有符合条件的属性, 则优先使用, 而不使用级联属性. 若需要使用级联属性, 则属性之间使用 _ 进行连接.
  • 查询所有年龄小于 90 岁的人
  • 查询所有姓赵的、并且 id 大于 50 的人
  • 查询所有姓名中包含"上"字的人
  • 查询所有姓赵的或者年龄大于 90 岁的
  • 查询所有角色为 1 的用户

支持的查询关键字如下图:

为什么写上方法名,JPA就知道你想干嘛了呢?假如创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,假设查询实体为Doc:

  1. 先判断 userDepUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
  2. 从右往左截取第一个大写字母开头的字符串(此处为 Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为查询实体的一个属性;
  3. 接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “ Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Doc.user.dep.uuid” 的值进行查询。
  4. 还有一些特殊的参数:例如分页或排序的参数:

有的时候,这里提供的查询关键字并不能满足我们的查询需求,这个时候就可以使用 @Query 关键字,来自定义查询 SQL,例如查询 Id 最大的 User:

如果查询有参数的话,参数有两种不同的传递方式,

  • 利用下标索引传参,索引参数如下所示,索引值从1开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也要一致:
  • 命名参数(推荐):这种方式可以定义好参数名,赋值时采用@Param("参数名"),而不用管顺序:

查询时候,也可以是使用原生的 SQL 查询,如下:

涉及到数据修改操作,可以使用 @Modifying 注解,@Query 与 @Modifying 这两个 annotation 一起声明,可定义个性化更新操作,例如涉及某些字段更新时最为常用,示例如下:

  1. 方法的返回值应该是 int,表示更新语句所影响的行数
  2. 在调用的地方必须加事务,没有事务不能正常执行
  3. 默认情况下, Spring Data 的每个方法上有事务, 但都是一个只读事务. 他们不能完成修改操作

说到这里,再来顺便说说 Spring Data 中的事务问题:

  1. Spring Data 提供了默认的事务处理方式,即所有的查询均声明为只读事务。
  2. 对于自定义的方法,如需改变 Spring Data 提供的事务默认方式,可以在方法上添加 @Transactional 注解。
  3. 进行多个 Repository 操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,需要在Service 层实现对多个 Repository 的调用,并在相应的方法上声明事务。

关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

}

1、原子性 —— 意味着数据库中的事务执行是作为原子,即不可再分,整个语句要么执行,要么不执行(回滚)。

2、一致性 —— 即在事务开始之前和事务结束以后,数据库的完整性约束(唯一约束/外键约束/Check约束/触发器等)没有被破坏。

3、隔离性 —— 事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。

   SQL Server利用加锁和阻塞来保证事务之间不同等级的隔离性。事务之间的互相影响的情况分为几种,分别为

4、 持久性 —— 意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 、

第一章 数据库系统概述

1、数据库管理系统的基本功能?

 答:并发控制、故障恢复、完整性、安全性、数据独立性。

2、数据库系统的三个抽象层次?

 答:视图抽象、概念抽象、物理抽象。

3、简述数据抽象、数据模型及数据模式的概念,以及它们之间的关系?

 答:数据抽象,指的是一种数据抽取的过程;数据模型,是数据抽象的工具,是数据组织和表示的方式;数据模式,是数据抽象的结果。

4、数据模型的三个评价标准、三个要素、分类?

 答:三个评价标准:1)真实地描述现实问题;2)用户易理解;3)计算机易实现;

     三个要素:数据结构、数据操作、完整性约束

     分类:概念数据模型、逻辑数据模型、物理数据模型

 答:数据字典用于存储数据库的一些说明信息。

6、请简述计算机学科中“逻辑”与“物理”、“高级”与“低级”的含义。

 答:逻辑,一般是指事物的主观抽象表示,着重对内在机制的描述;而物理是指事务的外在的表现形式或客观存在。

        高级和低级,是衡量与人类思维接近或是易于人类使用的程度。与人类思维越接近或是越易于人类使用,则越高级;否则,越低级。

8、SQL语言的标准?

9、一个数据库系统设计中,概念模式只有一个。

1、ERM属于哪个层次的数据模型?关系模型又是哪个层次的数据模型?

 答:ERM属于概念数据模型,关系模型是逻辑数据模型。

2、属性按结构的分类,以及按取值的分类?

 答:按结构分类:简单属性、复合属性、子属性

3、实体用什么来唯一标识?

4、键与候选键的区别?

 答:键与候选键都是具有唯一标识的一个或一组属性,但候选键是最小属性集合的键。主键是候选键的特例。

第三章 关系数据库系统RDBS

1、表间数据完整性的实现方式?

2、对于表中几个特殊的列,如主键、候选键和外键,分别用什么限制来保证它们的完整性?对表中其它一般性的列,用什么限制来保证它们的完整性?

3、SQL-92标准支持的完整性限制是否一定会在SQL SERVER中实现,举例说明?

 答:不一定。断言是SQL-92标准支持的,但SQL SERVER不支持断言。

4、请说明在维护表间数据完整时外键限制与触发器的异同。

 答:异——定义外键约束的列,必须是另一表中的主键或侯选建;触发器的主表和从表之间只要有共同的列即可,且触发器可以用来完成更复杂的功能。

5、关系代数的基本操作符?

6、关系代数中对结果有重复元组时,如何处理?SQL中呢?

 答:关系代数中,通过改名解决重复元组问题;SQL中,通过distinct去除重复元祖

7、列 —— 字段、成员、属性

  8-1)查询1957年之前出生的男演员的姓名

    姓名(δ性别=男,出生年<1957演员)

  8-2)查询2000年环球公司出品的电影的名字和导演姓名

  8-3)查询张一导演所导演的影片中的主角演员姓名

    演员姓名(δ导演姓名=张一,角色=主演(演员   导演))

第四章 SQL查询语言

1、SQL语言的使用方式?

2、 Select查询中各子句的执行顺序?

 答:为了能够对获取的集合的值按行按列处理

4、使用存储过程的好处?

 答:(1)执行速度快;

     (2)可用于实现经常实现的数据操作;

     (3)实现较复杂的完整性约束;

     (4)可在程序中被反复调用,有利于程序的模块化;

     (6)实现复杂、敏感事务的自动化;

1、导致数据库破坏的四种类型?DBMS分别用何措施来保护之?

 答:非法用户,通过权限机制保护;非法数据,通过完整性约束保护;系统或硬件故障,通过故障恢复保护;并发访问破坏一致性,通过并发控制保护。

 答:DBMS服务器级,数据库级,语句和对象级。

3、事务的特点是什么?它有哪几个特性或性质?

 答:事务的特点:由多个步骤构成,只有所有步骤都成功执行,该事务才可提交完成;否则,其中任一个步骤执行失败,则该事务失败,事务中已执行的步骤应撤销或回退(rollback)。

4、 日志的基本内容?

 答:活动事务表(ATL)、提交事务表(CTL)、前像(BI)、后像(AI)

5、为何要并发?何谓并发调度?何谓串行调度?

 答:并发的目的:1、提高系统资源利用率;2、改善短事务的响应时间。

   并发调度:多个事务之间交替调度。

   串行调度:一个事务的所有操作都执行完后才开始执行另一个事务。

6、并发执行可能引起哪些问题?产生这些问题的原因各是什么?

4、加锁协议的两个补丁分别解决什么现象(或问题)?

  答:补丁1:避免级联回退,防止读脏数据。

    补丁2:“先来先服务”原则,可避免活锁现象。

5、为何需要事务隔离等级?

 答:可以使得应用系统能在读一致性和并发性之间找到最佳平衡。

6、 数据库复制的方式?

 答:主从复制、对等复制、级联复制。

7、SQL SERVER的安全体系分:(DBMS的服务器级、数据库级、语句和对象级)。

1、关系模式可能存在的问题?

 答:插入异常、删除异常、冗余、更新异常。

 答:平凡函数依赖、非平凡函数依赖、完全函数依赖、部分函数依赖、传递函数依赖。

3、 关系模式规范化的方法?

4、设有关系模式:R(Sid,Sname,Cid,Cname,Score,Tid),其中:Sid、Sname、Cid、Cname、Score、Tid分别表示学号、学生姓名、课程编号、课程名、成绩、教师编号,并有如下语义要求:

  • l  一名学生只能有一个学号,且学号唯一;
  • l  一门课程只能有一个课程号,且课程号唯一。

  1)根据语义给出R的函数依赖

  2)将该关系模式分解成3NF

}

有很多读者留言希望松哥能好好聊聊 Spring Data Jpa! 其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring Data 和 Jpa!

  • 可以看到,实现类不少。那么到底如何理解 Repository 呢?

  • 若我们定义的接口继承了 Repository, 则该接口会被 IOC 容器识别为一个 Repository Bean,进而纳入到 IOC 容器中,进而可以在该接口中定义满足一定规范的方法。
  • Spring Data可以让我们只定义接口,只要遵循 Spring Data 的规范,就无需写实现类。
  • 基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能,它的几个常用的实现类如下:

    • 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写

    例如:定义一个 Entity 实体类:

    使用 And 条件连接时,条件的属性名称与个数要与参数的位置与个数一一对应,如下:

    • 支持属性的级联查询. 若当前类有符合条件的属性, 则优先使用, 而不使用级联属性. 若需要使用级联属性, 则属性之间使用 _ 进行连接.
    • 查询所有年龄小于 90 岁的人
    • 查询所有姓赵的、并且 id 大于 50 的人
    • 查询所有姓名中包含"上"字的人
    • 查询所有姓赵的或者年龄大于 90 岁的
    • 查询所有角色为 1 的用户

    支持的查询关键字如下图:

    为什么写上方法名,JPA就知道你想干嘛了呢?假如创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,假设查询实体为Doc:

    1. 先判断 userDepUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;
    2. 从右往左截取第一个大写字母开头的字符串(此处为 Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为查询实体的一个属性;
    3. 接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “ Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Doc.user.dep.uuid” 的值进行查询。
    4. 还有一些特殊的参数:例如分页或排序的参数:

    有的时候,这里提供的查询关键字并不能满足我们的查询需求,这个时候就可以使用 @Query 关键字,来自定义查询 SQL,例如查询 Id 最大的 User:

    如果查询有参数的话,参数有两种不同的传递方式,

    • 利用下标索引传参,索引参数如下所示,索引值从1开始,查询中 ”?X” 个数需要与方法定义的参数个数相一致,并且顺序也要一致:
    • 命名参数(推荐):这种方式可以定义好参数名,赋值时采用@Param(“参数名”),而不用管顺序:

    查询时候,也可以是使用原生的 SQL 查询,如下:

    涉及到数据修改操作,可以使用 @Modifying 注解,@Query 与 @Modifying 这两个 annotation 一起声明,可定义个性化更新操作,例如涉及某些字段更新时最为常用,示例如下:

    1. 方法的返回值应该是 int,表示更新语句所影响的行数
    2. 在调用的地方必须加事务,没有事务不能正常执行
    3. 默认情况下, Spring Data 的每个方法上有事务, 但都是一个只读事务. 他们不能完成修改操作

    说到这里,再来顺便说说 Spring Data 中的事务问题:

    1. Spring Data 提供了默认的事务处理方式,即所有的查询均声明为只读事务。
    2. 对于自定义的方法,如需改变 Spring Data 提供的事务默认方式,可以在方法上添加 @Transactional 注解。
    3. 进行多个 Repository 操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,需要在Service 层实现对多个 Repository 的调用,并在相应的方法上声明事务。

    关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

}

我要回帖

更多关于 每个人都是主角的句子 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信