当前位置: 首页 > news >正文

TYUT-企业级开发教程-第5章

全章重点!!!!!!!!!!!!!

Springboot数据访问

Spring Boot 默认采用整合 Spring Data 的方式统一处理数据访问层, Spring Data 是 Spring 提供的开源框架,旨在统一和简化对各种类型数据库的持久化存储。 Spring Data 为大量的关系型数据库和非关系型数据库提供了数据访问的方案,并且提供了基于 Spring 的数据访问模型,同时保留了各存储系统的特殊性。

Spring Data 提供了一套统一的 Repository 接口实现方式,包括基本的增删改查操作、条件查询、排序查询、分页查询等。当数据访问对象需要进行增删改查、排序查询和分页查询等操作时,开发者仅需要按照一定的规范声明接口即可,不需要实现具体的查询方法。 Spring Data 会根据底层数据存储系统,在运行时自动实现真正的查询方法,执行查询操作,返回结果数据集

 

ORM 

 ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于实现面向对象编程语言中的对象与关系型数据库(如 MySQL、PostgreSQL)中数据表之间的映射关系,从而让开发者能够通过操作对象的方式来间接操作数据库,避免直接编写复杂的 SQL 语句。

常见的 ORM 框架有Hibernate 、 OpenJPA

为什么要提出JPA?

ORM 框架的出现,使开发者从数据库编程中解脱出来,把更多的精力放
在业务模型与业务逻辑上,但各 ORM 框架之间的 API 差别很大,使用了某种 ORM 框架的系统会严重受限于该 ORM 的标准,基于此, SUN 公司提出 JPA

访问数据

 使用 Spring Data JPA 可以通过 Repository 接口中的方法对数据库中的数据进
行增删改查,也可以根据方法命名规则定义的方法、 JPQL ,以及原生 SQL 的方式进行操作,了解即可。

JPQL

使用 Spring Data JPA 提供的查询方法已经可以满足大部分应用场景的需求,但是有些业务需要更灵活的查询条件,这时就可以使用 @Query 注解,结合 JPQL 的方式来完成查询。JPQL 是 JPA 中定义的一种查询语言,此种语言旨在让开发者忽略数据库表和表中的字段,而关实体类及实体类中的属性。 JPQL 语句的写法和 SQL 语句的写法十分类似,但是要把查询的表名换成
实体类名称,把表中的字段名换成实体类的属性名称

命名参数:在方法的参数列表中,使用 @Param 注解标注参数的名称,在 @Query 注解的查询语
句中,使用“ : 参数名称” 匹配参数名称。
 位置参数:在 @Query 注解的查询语句中,使用“ ? 位置编号的数值” 匹配参数,查询语句中参
数标注的编号需要和方法的参数列表中参数的顺序依次对应。

// 命名参数绑定
@Query("from Book b where b.author=:author and b.name=:name")
List<Book> findByCondition1(@Param("author") String author,
@Param("name") String name);
// 位置参数绑定
@Query("from Book b where b.author=?1 and b.name=?2")
List<Book> findByCondition2(String author, String name);
//like 模糊查询
@Query("from Book b where b.name like %:name%")
List<Book> findByCondition3(@Param("name") String name);
// 排序查询
@Query("from Book b where b.name like %:name% order by id desc")
List<Book> findByCondition4(@Param("name") String name);
// 分页查询
@Query("from Book b where b.name like %:name%")
Page<Book> findByCondition5(Pageable pageable, @Param("name") String name);

 

// 传入集合参数查询
@Query("from Book b where b.id in :ids")
List<Book> findByCondition6(@Param("ids") Collection<String> ids);
// 传入 Bean 进行查询(使用 SPEL 表达式)
@Query("from Book b where b.author=:#{#Book.author} and " +
" b.name=:#{#Book.name}")
Book findByCondition7(@Param("Book") Book Book);

 原生SQL

如果出现非常复杂的业务情况,导致 JPQL 和其他查询都无法实现对应的查询,需要自定义 SQL 进行
查询时,可以在 @Query 注解中定义该 SQL 。 @Query 注解中定义的是原生 SQL 时,需要在注解
使用 nativeQuery=true 指定执行的查询语句为原生 SQL ,否则会将其当作 JPQL 执行
@Query(value="SELECT * FROM book WHERE id = :id",nativeQuery=true)
Book findByCondition8(@Param("id") Integer id);

注意点

使用 @Query 注解可以执行 JPQL 和原生 SQL 查询,但是 @Query 注解无法进行 DML 数据操纵语言 , 主要语句有 INSERT 、 DELETE 和 UPDATE 操作,如果需要更新数据库中的数据,需要在对应的方法上标注 @Modifying 注解,以通知 Spring Data 当前需要进行的是 DML 操作。需要注意的是JPQL 只支持 DELETE 和 UPDATE 操作,不支持 INSERT 操作 

JPQL和SQL的区别 

  • 选 JPQL

    • 项目使用 JPA/Hibernate,希望保持对象模型与查询的一致性。
    • 需要跨数据库兼容,避免 SQL 方言问题。
    • 业务逻辑复杂,需频繁操作对象关系。
  • 选 SQL

    • 需要极致性能优化(如批量数据处理)。
    • 使用特定数据库特性(如分区表、全文索引)。
    • 开发工具(如 SQL 客户端)更适合直接编写 SQL。

实际项目中,常结合使用:JPQL 处理常规查询,SQL 处理复杂或性能敏感的场景

 Mybaits-plus

了解一下,优点即可,应为考试就算写代码,,也还是写Mybaits

无侵入:只做增强不做改变,引入它不会对现有工程产生影响。
 损耗小:启动即会自动注入基本增删改查方法,性能基本无损耗,直接面向对象操作。
 强大的增删改查 操作:内置通用 Mapper 、通用 Service ,仅仅通过少量配置即可实现单表大部分
增删改查操作,具有强大的条件构造器,可满足各类使用需求。
 支持 Lambda 形式调用:通过 Lambda 表达式,可方便地编写各类查询条件,无须再担心字段写错
。
 支持主键自动生成:支持分布式唯一 ID 生成器 Sequence 在内的 4 种主键策略,可自由配置,完美
解决了主键问题。
 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大
的增删改查 操作
支持自定义全局通用操作:支持全局通用方法注入。
 内 置 代 码 生 成 器 : 采 用 代 码 或 者 Maven 插 件 可 快 速 生 成 Mapper 、 Model 、 Service 、
Controller 层代码,支持模板引擎。
 内置分页插件:基于 MyBatis 物理分页,开发者无须关心具体操作,配置好插件之后,写分页等同
于普通 List 查询。
 分 页 插 件 支 持 多 种 数 据 库 : 支 持
MySQL 、 MariaDB 、 Oracle 、 DB2 、 H2 、 HSQL 、 SQLite 、 Postgre 、 SQLServer 等多种
数据库。
 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢
查询。
 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误
操作

 Redis

什么是redis?

Redis ( Remote Dictionary Server ,远程字典服务)是一个基于内存的键值型非关系型数据库,
以 Key-Value 的形式存储数据

redis初始创建16个数据库,从0-15编号

redis的优点

存取速度快: Redis 基于内存来实现数据存取,相对于磁盘来说,其读写速度要高出好几个数量
级,每秒可执行大约 110000 次的设置操作,或者执行 81000 次的读取操作。
 支持丰富的数据类型: Redis 支持开发人员常用的大多数数据类型,例如列表、集合、有序集合和
散列等。
 操作具有原子性:所有 Redis 操作都是原子操作,这使得两个客户端并发访问时, Redis 服务器能
接收更新后的值。
 提供多种功能: Redis 提供了多种功能特性,可用作非关系型数据库、缓存中间件、消息中间件等

 redis的数据结构

 String (字符串)、 Hash (散列)、 List (列表)、 Set (集合)、 SortedSet (有
序集合)

SpringDataRedis

了解即可
Spring Data Redis 是 Spring Data 在 Spring 管理的项目中对 Redis 操作的具体实现。 Spring
Boot 为支持 Redis 提供了 spring-boot-starter-data-redis.jar ,该 Starter 使用 Spring Data
Redis 对底层 Lettuce 和 Jedis 进行了封装,并为 Lettuce 和 Jedis 提供了自动配置。 Spring Data
Redis 具有如下特性。
 提供了对不同 Redis 客户端的整合 Lettuce 和 Jedis 。
 提供了 RedisTemplate 统一 API 来操作 Redis 。
 支持 Redis 的发布订阅模型。
 支持 Redis 哨兵和 Redis 集群。
 支持基于 Lettuce 的响应式编程。
 支持基于 JDK 、 JSON 、字符串、 Spring 对象的数据序列化及反序列化。
 支持基于 Redis 的 JDKCollection 实现。

重点

RedisTemplate 常见 API

方法 说明
ValueOperations<K, V> opsForValue() 获取操作 String 类型数据的对象。
ListOperations<K, V> opsForList() 获取操作 List 类型数据的对象。
SetOperations<K, V> opsForSet() 获取操作 Set 类型数据的对象。
ZSetOperations<K, V> opsForZSet() 获取操作 SortedSet 类型数据的对象。
HashOperations<K, HK, HV> opsForHash() 获取操作 Hash 类型数据的对象。
BoundValueOperations<K, V> boundValueOps(K key) 绑定映射 String 类型数据的 Key
BoundListOperations<K, V> boundListOps(K key) 绑定映射 List 类型数据的 Key
BoundSetOperations<K, V> boundSetOps(K key 绑定映射 Set 类型数据的 Key
BoundZSetOperations<K, V> boundZSetOps(K key) 绑定映射 SortedSet 类型数据的
Key
BoundHashOperations<K, HK, HV> boundHashOps(K key) 绑定映射 Hash 类型数据的 Key

 注解

 实现数据类和redis之间的映射关系

@RedisHash :该注解在类上进行标注,用于指定将数据类映射到 Redis 中的存储空间。
 @Id :用于标示实体类主键。在 Redis 数据库中会默认生成字符串形式的 HashKey ,用于表示唯
一的实体对象 id ,当然也可以在数据存储时手动指定 id 。
 @Indexed :用于标示对应属性在 Redis 数据库中生成的二级索引。使用该注解后会在 Redis 数
据库中生成属性对应的二级索引,索引名称就是属性名,可以方便地进行数据条件查询

序列化策略

JDK 的序列化策略 

RedisTemplate 默认采用的是 JDK 的序列化策略,保存的 Key 和 Value 都采用此策略进行序列
化保存。 RedisTemplate 使用 JDK 的序列化策略保存数据时,会将数据先序列化成字节数组然后再存入 Redis 数据库,如果使用 Redis 根据查看对应的数据,数据是以字节数组显示的,而不是以原生可读的形式显示

 Spring的序列化策略

RedisTemplate 有一个子类 StringRedisTemplate , StringRedisTemplate 默认采用的是 String
的序列化策略,保存的 key 和 value 都是采用此策略序列化保存的,默认存入的数据就是原始的字符串

考试考两个的对比

第5章 题目

1.Spring Data JPA默认使用  Hibernate  实现JPA。 
2.  @MapperScan   注解可以扫描指定路径的Mapper交由Spring管理。 
3.Redis默认启动端口号为   6379 
4.Redis的序列化策略有String的序列化策略JDK     的序列化策略。 
5.使用@Indexed声明当前属性会被“索引化”,存储在Redis时为当前属性创建对应的  Key   。 

二、判断题
1.Spring Data对大量的关系型数据库和非关系型数据库提供了数据访问的方案。(对 ) 
2.Spring Data JPA使用位置参数时,在@Query注解的查询语句中,参数标注的编号和方法的参数列表中参数的顺序的对应关系没有要求。 ( 错)

解析:

 命名参数:在方法的参数列表中,使用 @Param 注解标注参数的名称,在 @Query 注解的查询语
句中,使用“ : 参数名称” 匹配参数名称。
 位置参数:在 @Query 注解的查询语句中,使用“ ? 位置编号的数值” 匹配参数,查询语句中参
数标注的编号需要和方法的参数列表中参数的顺序依次对应。


3.MyBatis-Plus在MyBatis的基础上只做增强不做改变。 ( 对) 
4.Redis以Key-Value的形式存储数据。(对 )  
5.@RedisHash可以指定数据类的实例对象存储在Redis存储空间的名称。 ( 对) 

三、选择题
1.下列选项中,关于Spring Data的接口描述错误的是(A)。 
A.Repository接口提供了各种增删改查方法。
B.CrudRepository接口继承Repository接口,提供了各种增删改查方法。
C.PagingAndSortingRepository接口继承CrudRepository接口,增加了分页和排序功能的方法。
D.QueryByExampleExecutor接口是进行条件封装查询的顶级父接口。

解析:

  Repository接口不提供增删改查方法,是Jpa  Repository提供
2.下列选项中,对于JPQL的使用描述错误的是(D)。 
A.JPQL支持命名参数和位置参数两种查询参数。
B.使用JPQL时,需要把查询的表名换成实体类名称,把表中的字段名换成实体类的属性名称。
C.JPQL中可以使用SpEL表达式接收变量。
D.JPQL中只能使用字符串和基本数据类型的数据作为参数。

也可以是复杂对象类型
3.下列选项中,关于Wrapper的eq()方法的作用描述正确的是(C)。 
A.用于匹配字段中值不等于某个值的记录。
B.用于匹配字段中值大于某个值的记录。
C.用于匹配字段中值等于某个值的记录。
D.用于匹配字段中值大于或等于某个值的记录。
4.下列选项中,使用MyBatis-Plus时,可以指定实体类中属性对应字段名的注解是(D)。 
A.@Entity  B.@TableName  C.@TableId  D.@TableField


5.下列选项中,Spring Data Redis用于标识对应属性在Redis数据库中生成二级索引的注解是(C)。 
A.@RedisHash  B.@Id   C.@Indexed   D.@TableField

解析:

@Indexed :用于标示对应属性在 Redis 数据库中生成的二级索引。使用该注解后会在 Redis 数
据库中生成属性对应的二级索引,索引名称就是属性名,可以方便地进行数据条件查询

相关文章:

  • Python编程从入门到实践 PDF 高清版
  • vue2.0 组件
  • Java大厂面试三轮问答:微服务与数据库技术深度解析
  • matlab绘制光学传递函数mtf曲线
  • 精益数据分析(69/126):最小可行化产品(MVP)的设计、验证与数据驱动迭代
  • 第35周Zookkeeper+Dubbo 面试题精讲
  • 经典密码学和现代密码学的结构及其主要区别(1)凯撒密码——附py代码
  • k8s集成环境中pod运行的容器退出码141故障解决方案及排查方向,其他退出码也可以参考此篇
  • javaScript学习第三章(流程控制小练习)
  • Spring的后置处理器是干什么用的?扩展点又是什么?
  • Docker 核心原理详解:Namespaces 与 Cgroups 如何实现资源隔离与限制
  • React集成百度【JSAPI Three】教程(001):快速入门
  • Python----目标检测(labelimg和labelme的安装与使用,Pycharm配置教程)
  • 养生指南:解锁健康生活新方式
  • BGP综合实验
  • Nginx基础知识
  • java基础-关键字:static、单例模式
  • QPS与TPS区分及压测指标解读
  • 渗透测试核心技术:漏洞挖掘与利用
  • ai agent(智能体)开发 python高级应用8:crawl4ai 对用 LLMExtractionStrategy 和 python的 re 如何选择
  • 俄罗斯哈巴罗夫斯克市首次举办“俄中论坛”
  • 河北邯郸回应被曝涉生猪未检疫、注水问题:将严厉查处违法行为
  • 澎湃思想周报|《混沌少年时》与青少年社媒禁令;自雇陷阱
  • 三星“七天机”质保期内屏幕漏液被拒保,澎湃介入后已解决
  • 菲律宾中期选举结果揭晓,马科斯与杜特尔特家族重回“权力的游戏”
  • 霍步刚任辽宁沈阳市委书记