Spring Data
一.概述
Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。SpringData 项目所支持
NoSQL 存储:MongoDB (文档数据库)
Neo4j(图形数据库)
Redis(键/值存储)
Hbase(列族数据库)
SpringData 项目所支持的关系数据存储技术:JDBC/JPA
JPA Spring Data : 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就
只是声明持久层的接口 ,其他都交给 Spring Data JPA 来帮你完成!框架怎么可能代替开发者实现业务逻辑呢?比如:当有一个 UserDao.findUserById() 这样一个方法声明,大致应该能判断出这是根据给定条件的 ID 查询出满足条件的 User 对象。Spring Data JPA 做的便是规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑。
二.所需jar包
三.配置文件
四.Entity
表:
person(通过SpringData自动生成的表会自动生成主键和外键) address
五.Repository
5.1 如何声明一个Repository
Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法 public interface Repository { } 第一个泛型为 model的class
第二个为id的class Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。 与继承 Repository 等价的一种方式,就是在持久层接口上使用
@RepositoryDefinition 注 解,并为其指定 domainClass 和 idClass 属性。如下两种方式是完全等价的
也可集成repository的子接口
5.2 Repository查询方法的关键字
5.3 查询方法解析流程
假如创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,假设查询实体为Doc
先判断 userDepUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步
从右往左截取第一个大写字母开头的字符串(此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为查询实体的一个属性;
接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “ Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Doc.user.dep.uuid” 的值进行查询。
可能会存在一种特殊情况,比如 Doc包含一个 user 的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 "_" 以显式表达意图,比如 "findByUser_DepUuid()" 或者 "findByUserDep_uuid()"
特殊的参数: 还可以直接在方法的参数上加入分页或排序的参数,
比如:Page findByName(String name, Pageable pageable); List findByName(String name, Sort sort);
5.4 查询@Query注解
这种查询可以声明在 Repository 方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是 Spring data 的特有实现。
占位符绑定参数:
@Query("select o from UserModel o where o.name like ?1%") public List findByUuidOrAge(String name);
@Query("select o from UserModel o where o.name like %?1") public List findByUuidOrAge(String name);
@Query("select o from UserModel o where o.name like %?1%") public List findByUuidOrAge(String name);
比如:@Query(value="select * from tbl_user where name like %?1" ,nativeQuery=true) public List findByUuidOrAge(String name);
5.5@Modifying注解和事务
1.方法的返回值应该是 int,表示更新语句所影响的行数在调用的地方必须加事务,
2.可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作. 注意: JPQL 不支持使用 INSERT
3.在 @Query 注解中编写 JPQL 语句, 但必须使用 @Modifying 进行修饰. 以通知 SpringData, 这是一个 UPDATE 或 DELETE 操作
4.UPDATE 或 DELETE 操作需要使用事务, 此时需要定义 Service 层. 在 Service 层的方法上添加事务操作.
5.默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务. 他们不能完成修改操作!
没有事务不能正常执行
会报:
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an
update/delete query
六.SpringData的事务
Spring Data 提供了默认的事务处理方式,即
所有的查询均声明为只读事务
。
对于自定义的方法,如需改变 Spring Data 提供的事务默认方式,可以在方法上注解 @Transactional 声明
进行多个 Repository 操作时,也应该使它们在同一个事务中处理,按照分层架构的思想,这部分属于业务逻辑层,因此,
需要在 Service 层实现对多个 Repository 的调用,并在相应的方法上声明事务。
七.Repository子类 以及其他类
7.1 CrudRepository 接口
自带一些方法
保存/删除(单个与集合)
根据id查询 查询所有 查询条数 是否存在该id....
注:保存时id可以不填写 如果id有注解(
@Id
@GeneratedValue
)
7.2 PagingAndSortingRepository 接口
实现了分页和排序的功能
是
CrudRepository 接口的子接口
分页使用:
PageRequest 类即可
测试代码:
分页
@Test
public void
getByPage
(){
//pageNo
从
0
开始
.
int
pageNo =
6
-
1
;
int
pageSize =
5
;
//Pageable
接口通常使用的其
PageRequest
实现类
.
其中封装了需要分页的信息
//
排序相关的
. Sort
封装了排序的信息
//Order
是具体针对于某一个属性进行升序还是降序
.
PageRequest pageable =
new
PageRequest(pageNo
,
pageSize)
;
Page page =
personRepository
.findAll(pageable)
;
System.
out
.println(
"
总记录数
: "
+ page.getTotalElements())
;
System.
out
.println(
"
当前第几页
: "
+ (page.getNumber() +
1
))
;
System.
out
.println(
"
总页数
: "
+ page.getTotalPages())
;
System.
out
.println(
"
当前页面的
List: "
+ page.getContent())
;
System.
out
.println(
"
当前页面的记录数
: "
+ page.getNumberOfElements())
;
}
分页+排序
@Test
public void
getByPageAndOrder
(){
//pageNo
从
0
开始
.
推荐阅读
R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ...
[详细]
蜡笔小新 2023-12-12 16:38:53
本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ...
[详细]
蜡笔小新 2023-12-13 20:24:11
本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ...
[详细]
蜡笔小新 2023-12-10 17:25:31
本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ...
[详细]
蜡笔小新 2023-12-09 19:11:31
本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ...
[详细]
蜡笔小新 2023-12-14 16:00:02
本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ...
[详细]
蜡笔小新 2023-12-14 14:06:10
本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ...
[详细]
蜡笔小新 2023-12-14 10:11:46
本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ...
[详细]
蜡笔小新 2023-12-13 19:02:44
本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ...
[详细]
蜡笔小新 2023-12-13 13:42:30
本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ...
[详细]
蜡笔小新 2023-12-12 08:51:10
RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业zhuanlan.z ...
[详细]
蜡笔小新 2023-12-10 19:11:07
本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ...
[详细]
蜡笔小新 2023-12-10 15:47:11
安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ...
[详细]
蜡笔小新 2023-12-09 18:01:55
最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ...
[详细]
蜡笔小新 2023-12-09 10:22:03
目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ...
[详细]
蜡笔小新 2023-12-09 09:35:02
qinqin20082602898705
这个家伙很懒,什么也没留下!