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
开始
.
推荐阅读
在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ...
[详细]
蜡笔小新 2024-11-11 19:36:19
Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ...
[详细]
蜡笔小新 2024-11-07 17:01:31
本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ...
[详细]
蜡笔小新 2024-11-07 12:55:01
在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ...
[详细]
蜡笔小新 2024-11-07 03:17:49
包含phppdoerrorcode的词条 ...
[详细]
蜡笔小新 2024-11-14 12:06:14
一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ...
[详细]
蜡笔小新 2024-11-14 11:01:49
本文将详细介绍如何在微信小程序的 app.json 文件中启用调试模式(debug),并通过实际案例展示其配置方法和应用场景。 ...
[详细]
蜡笔小新 2024-11-14 08:21:10
DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ...
[详细]
蜡笔小新 2024-11-13 12:25:33
本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ...
[详细]
蜡笔小新 2024-11-13 12:05:24
Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ...
[详细]
蜡笔小新 2024-11-13 09:49:14
这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ...
[详细]
蜡笔小新 2024-11-12 13:46:11
本项目通过Python编程实现了一个简单的汇率转换器v1.02。主要内容包括:1. Python的基本语法元素:(1)缩进:用于表示代码的层次结构,是Python中定义程序框架的唯一方式;(2)注释:提供开发者说明信息,不参与实际运行,通常每个代码块添加一个注释;(3)常量和变量:用于存储和操作数据,是程序执行过程中的重要组成部分。此外,项目还涉及了函数定义、用户输入处理和异常捕获等高级特性,以确保程序的健壮性和易用性。 ...
[详细]
蜡笔小新 2024-11-11 16:34:26
服务器部署中的安全策略实践与优化 ...
[详细]
蜡笔小新 2024-11-10 13:04:30
本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ...
[详细]
蜡笔小新 2024-11-09 20:42:14
### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ...
[详细]
蜡笔小新 2024-11-09 16:58:21
qinqin20082602898705
这个家伙很懒,什么也没留下!