Spring Data JDBC参考文档 三

简介: Spring认证|Spring Data JDBC参考文档三 (内容来源:Spring中国教育管理中心)

原标题:Spring认证|Spring Data JDBC参考文档三 (内容来源:Spring中国教育管理中心)

9.6.9. 身份证生成

Spring Data JDBC 使用 ID 来标识实体。实体的 ID 必须使用 Spring Data 的@Id注解进行注解。

当您的数据库具有用于 ID 列的自动增量列时,生成的值在将其插入数据库后在实体中设置。

一个重要的约束是,在保存实体后,该实体不能再是新的。请注意,实体是否是新实体是实体状态的一部分。对于自动增量列,这会自动发生,因为 ID 由 Spring Data 使用 ID 列中的值设置。如果您不使用自增列,您可以使用一个BeforeSave监听器,它设置实体的 ID(在本文档后面介绍)。

9.6.10. 乐观锁定

Spring Data JDBC 通过@Version在聚合根上注释的数字属性来支持乐观锁定 。每当 Spring Data JDBC 使用这样的版本属性保存聚合时,会发生两件事:聚合根的更新语句将包含一个 where 子句,检查存储在数据库中的版本实际上未更改。如果不是这种情况,
OptimisticLockingFailureException将会抛出一个will。此外,实体和数据库中的 version 属性都会增加,因此并发操作将注意到更改并抛出一个(OptimisticLockingFailureException如果适用),如上所述。

这个过程也适用于插入新的聚合,其中 anull或0version 表示一个新实例,然后增加的实例将实例标记为不再是新的,这使得在对象构造期间生成 id 的情况下,例如当 UUID 是用过的。

在删除过程中,版本检查也适用,但不会增加版本。

9.7. 查询方法

本节提供有关 Spring Data JDBC 的实现和使用的一些特定信息。

您通常在存储库上触发的大多数数据访问操作都会导致对数据库运行查询。定义这样的查询就是在存储库接口上声明一个方法,如以下示例所示:

示例 58.带有查询方法的 PersonRepository

interface PersonRepository extends PagingAndSortingRepository {

List findByFirstname(String firstname);

List findByFirstnameOrderByLastname(String firstname, Pageable pageable);

Slice findByLastname(String lastname, Pageable pageable);

Page findByLastname(String lastname, Pageable pageable);

Person findByFirstnameAndLastname(String firstname, String lastname);

Person findFirstByLastname(String lastname);

@Query("SELECT * FROM person WHERE lastname = :lastname")

List findByLastname(String lastname);

}

该方法显示对所有具有给定 的人的查询lastname。该查询是通过解析可以与And和连接的约束的方法名称来派生的Or。因此,方法名称导致查询表达式为SELECT … FROM person WHERE firstname = :firstname。

使用Pageable来抵消和排序参数传递到数据库。

返回一个Slice. 选择LIMIT+1行以确定是否有更多数据要使用。ResultSetExtractor不支持自定义。

运行分页查询,返回Page. 仅选择给定页面边界内的数据,并可能使用计数查询来确定总计数。ResultSetExtractor不支持自定义。

查找给定条件的单个实体。它以
IncorrectResultSizeDataAccessException非唯一结果结束。

与 相比,即使查询产生更多的结果文档,第一个实体也总是被发出。

该findByLastname方法显示了对所有具有给定姓氏的人的查询。

下表显示了查询方法支持的关键字:

查询派生仅限于可以在WHERE不使用连接的情况下在子句中使用的属性。

9.7.1. 查询查找策略

JDBC 模块支持将查询手动定义为@Query注释中的字符串或属性文件中的命名查询。

从方法名称派生查询目前仅限于简单属性,这意味着属性直接存在于聚合根中。此外,此方法仅支持选择查询。

9.7.2. 使用@Query

下面的例子展示了如何使用@Query来声明一个查询方法:

示例 59. 使用 @Query 声明查询方法

public interface UserRepository extends CrudRepository {

@Query("select firstName, lastName from User u where u.emailAddress = :email")

User findByEmailAddress(@Param("email") String email);

}

对于将查询结果转换为实体RowMapper,默认情况下使用与 Spring Data JDBC 生成的查询相同的实体。您提供的查询必须与RowMapper预期的格式相匹配。必须提供实体构造函数中使用的所有属性的列。通过 setter、wither 或 field 访问设置的属性列是可选的。结果中没有匹配列的属性将不会被设置。该查询用于填充聚合根、嵌入实体和一对一关系,包括作为 SQL 数组类型存储和加载的原始类型数组。为实体的映射、列表、集合和数组生成单独的查询。

Spring 完全支持 Java 8 的基于-parameters编译器标志的参数名称发现。通过在构建中使用此标志作为调试信息的替代方法,您可以省略@Param命名参数的注释。

Spring Data JDBC 仅支持命名参数。

9.7.3. 命名查询

如果如上一节所述,注解中没有给出查询,Spring Data JDBC 将尝试定位一个命名查询。有两种方法可以确定查询的名称。默认是采用查询的域类,即存储库的聚合根,采用其简单名称并附加以..分隔的方法名称。或者,@Query注释具有一个name属性,可用于指定要查找的查询的名称。

命名查询应在
META-INF/jdbc-named-queries.properties类路径上的属性文件中提供。

可以通过将值设置为 来更改该文件的位置@
EnableJdbcRepositories.namedQueriesLocation。

风俗 RowMapper

您可以RowMapper通过使用@Query(rowMapperClass = ….)或 通过注册RowMapperMapbean 并注册RowMapper每个方法的返回类型来配置要使用的对象。以下示例显示了如何注册
DefaultQueryMappingConfiguration:

@Bean

QueryMappingConfiguration rowMappers() {

return new DefaultQueryMappingConfiguration()

.register(Person.class, new PersonRowMapper())

.register(Address.class, new AddressRowMapper());

}

在确定将哪个RowMapper用于方法时,根据方法的返回类型遵循以下步骤:

如果类型是简单类型,RowMapper则使用no 。

相反,查询应返回单行单列,并对该值应用到返回类型的转换。

QueryMappingConfiguration迭代中的实体类,直到找到一个是相关返回类型的超类或接口。使用RowMapper为该类注册的。

迭代按照注册的顺序进行,因此请确保在特定类型之后注册更通用的类型。

如果适用,包装器类型(例如集合)或被Optional解包。因此,返回类型 ofOptional使用Person前面过程中的类型。

使用自定义RowMapperthrough QueryMappingConfiguration、@Query(rowMapperClass=…)或自定义ResultSetExtractor会禁用实体回调和生命周期事件,因为结果映射可以根据需要发出自己的事件/回调。

修改查询

您可以使用@Modifyingon query 方法将查询标记为修改查询,如以下示例所示:

@Modifying

@Query("UPDATE DUMMYENTITY SET name = :name WHERE id = :id")

boolean updateName(@Param("id") Long id, @Param("name") String name);

您可以指定以下返回类型:

void

int (更新记录数)

boolean(是否更新了记录)

9.8. MyBatis 集成

CRUD 操作和查询方法可以委托给 MyBatis。本节介绍如何配置 Spring Data JDBC 以与 MyBatis 集成,以及将查询的运行以及到库的映射移交给它的约定。

9.8.1. 配置

将 MyBatis 正确插入 Spring Data JDBC 的最简单方法是导入MyBatisJdbcConfiguration应用程序配置:

@Configuration

@EnableJdbcRepositories

@Import(MyBatisJdbcConfiguration.class)

class Application {

@Bean

SqlSessionFactoryBean sqlSessionFactoryBean() {

// Configure MyBatis here

}

}

如您所见,您只需要声明一个
SqlSessionFactoryBeanasMyBatisJdbcConfiguration依赖于最终SqlSession可用的bean ApplicationContext。

9.8.2. 使用约定

对于 中的每个操作CrudRepository,Spring Data JDBC 运行多个语句。如果SqlSessionFactory应用程序上下文中有 ,Spring Data 会检查每一步是否SessionFactory提供了一条语句。如果找到,则使用该语句(包括其配置到实体的映射)。

声明的名称与串接实体类型的完全限定名称构造Mapper.和String确定的一种说法。例如,如果org.example.User要插入的实例,Spring Data JDBC 会查找名为 的语句
org.example.UserMapper.insert。

当语句运行时, [ MyBatisContext]的实例作为参数传递,这使得语句可以使用各种参数。

下表描述了可用的 MyBatis 语句:

内容提示:本文(Spring Data JDBC参考文档)未完待续......

相关文章
|
1月前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
1月前
|
存储 Java 关系型数据库
Spring Boot中Spring Data JPA的常用注解
Spring Data JPA通过注解简化数据库操作,实现实体与表的映射。常用注解包括:`@Entity`、`@Table`定义表结构;`@Id`、`@GeneratedValue`配置主键策略;`@Column`、`@Transient`控制字段映射;`@OneToOne`、`@OneToMany`等处理关联关系;`@Enumerated`、`@NamedQuery`支持枚举与命名查询。合理使用可提升开发效率与代码可维护性。(238字)
290 1
|
2月前
|
XML Java Nacos
Spring Boot 整合Nacos 版本兼容适配 史上最详细文档
本文介绍SpringBoot整合Nacos的完整流程,涵盖Nacos下载安装、配置中心与服务发现集成、版本兼容性问题及实战配置。重点解决SpringBoot 3.3.0与Nacos版本适配难题,推荐使用Spring Cloud Alibaba方案,并提供项目开源地址供参考学习。
存储 JSON Java
481 0
|
2月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
328 0
|
4月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
559 2
|
4月前
|
存储 人工智能 自然语言处理
用Spring AI搭建本地RAG系统:让AI成为你的私人文档助手
想让AI帮你读懂PDF文档吗?本文教你用Spring AI和Ollama搭建一个本地RAG系统,让AI成为你的私人文档助手。无需GPU,无需云端API,只需几行代码,你的文档就能开口说话了!
|
6月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
238 32
|
7月前
|
数据采集 人工智能 Java
1天消化完Spring全家桶文档!DevDocs:一键深度解析开发文档,自动发现子URL并建立图谱
DevDocs是一款基于智能爬虫技术的开源工具,支持1-5层深度网站结构解析,能将技术文档处理时间从数周缩短至几小时,并提供Markdown/JSON格式输出与AI工具无缝集成。
322 1
1天消化完Spring全家桶文档!DevDocs:一键深度解析开发文档,自动发现子URL并建立图谱
|
7月前
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
791 4