Cassandra 支持
这部分参考文档解释了 Spring Data for Apache Cassandra 提供的核心功能。Spring Data 对 Apache Cassandra 的支持包含了广泛的功能:
-
支持使用 基于 Java 的 @Configuration 类或 XML 命名空间 进行 Spring 配置。
-
CqlTemplate、AsyncCqlTemplate 和 ReactiveCqlTemplate 辅助类,通过正确处理常见的 Cassandra 数据访问操作来提高生产力。
-
CassandraTemplate、AsyncCassandraTemplate 和 ReactiveCassandraTemplate 辅助类,提供 CQL 表与 POJO 之间的对象映射。
-
将异常转换为 Spring 的可移植 数据访问异常层次结构 的 异常翻译。
-
基于注解的映射 (metadata),可扩展以支持其他元数据格式。
-
基于 Java 的 查询、标准和更新 DSL。
-
自动实现 命令式和响应式 Repository 接口,包括对 自定义查询方法 的支持。
抽象
Spring Data for Apache Cassandra 允许在 CQL 和实体级别进行交互。
Spring Data for Apache Cassandra 抽象提供的价值或许可以通过下面表格中概述的操作序列来最好地展示。该表格显示了 Spring 负责哪些操作,以及哪些操作是你,应用程序开发者的责任。
表 1. Spring Data for Apache Cassandra - 谁做什么?
| 操作 | Spring | You |
|---|---|---|
| 定义连接参数。 | X | |
| 打开连接。 | X | |
| 指定 CQL 语句。 | X | |
| 声明参数并提供参数值 | X | |
| 准备并运行语句。 | X | |
| 设置循环以遍历结果(如果有)。 | X | |
| 对每次迭代执行操作。 | X | |
| 处理任何异常。 | X | |
| 关闭会话。 | X |
核心 CQL 支持处理了所有底层细节,这些细节可能使 Cassandra 和 CQL 成为一个开发起来非常繁琐的 API。使用映射实体对象可以实现模式生成、对象映射和仓库支持。
选择 Cassandra 数据库访问的方法
您可以选择几种方法作为 Cassandra 数据库访问的基础。Spring 对 Apache Cassandra 的支持有不同的方式。一旦您开始使用其中一种方法,您仍然可以混合搭配,加入来自其他方法的特性。以下方法效果很好:
-
CqlTemplate 和 ReactiveCqlTemplate 是经典的 Spring CQL 方法,也是最流行的。这是“最低级别”的方法。请注意,像
CassandraTemplate这样的组件在底层使用CqlTemplate。 -
CassandraTemplate 封装了
CqlTemplate,提供查询结果到对象的映射,并使用SELECT、INSERT、UPDATE和DELETE方法,而不是编写 CQL 语句。这种方法提供了更好的文档和易用性。 -
ReactiveCassandraTemplate 封装了
ReactiveCqlTemplate,提供查询结果到对象的映射,并使用SELECT、INSERT、UPDATE和DELETE方法,而不是编写 CQL 语句。这种方法提供了更好的文档和易用性。 -
存储库抽象让您可以在数据访问层中创建存储库声明。Spring Data 的存储库抽象的目标是显著减少实现各种持久性存储的数据访问层所需的样板代码量。
对于大多数数据导向的任务,您可以使用 [Reactive|Async]CassandraTemplate 或 Repository 支持,这两者都使用丰富的对象映射功能。[Reactive|Async]CqlTemplate 通常用于递增计数器或执行临时的 CRUD 操作。[Reactive|Async]CqlTemplate 还提供了回调方法,使您可以轻松获取低级 API 对象,例如 com.datastax.oss.driver.api.core.CqlSession,它允许您直接与 Cassandra 进行通信。Apache Cassandra 的 Spring Data 在各种 API 中对对象使用一致的命名约定,与 DataStax Java Driver 中的对象相同,以便您熟悉,并且可以将您现有的知识映射到 Spring API 上。
章节摘要
入门
Spring Data for Apache Cassandra 需要 Apache Cassandra 2.1 或更高版本以及 Datastax Java Driver 4.0 或更高版本。快速设置并启动工作环境的一种简便方法是创建一个基于 Spring 的项目,在 Spring Tools 中进行设置,或使用 start.spring.io。
使用 Spring 连接 Cassandra
使用 Apache Cassandra 和 Spring 时的第一个任务之一是通过使用 Spring IoC 容器创建一个 com.datastax.oss.driver.api.core.CqlSession 对象。你可以通过使用基于 Java 的 bean 元数据或基于 XML 的 bean 元数据来实现。以下章节将讨论这些内容。
模式管理
Apache Cassandra 是一个数据存储,在任何数据交互之前需要定义模式。Spring Data for Apache Cassandra 可以帮助您进行模式创建。
CQL 模板 API
CqlTemplate 类(以及它的反应式变体 ReactiveCqlTemplate)是核心 CQL 包中的核心类。它处理资源的创建和释放。它执行核心 CQL 工作流的基本任务,例如语句创建和执行,并将 CQL 提供和结果提取的工作留给应用程序代码。CqlTemplate 类执行 CQL 查询和更新语句,遍历 ResultSet 实例并提取返回的参数值。它还捕获 CQL 异常,并将其转换为 org.springframework.dao 包中定义的通用且更具信息性的异常层次结构。
反应式基础设施
反应式 Cassandra 支持包含广泛的功能:
持久化实体
CassandraTemplate 类(及其反应式变体 ReactiveCassandraTemplate),位于 org.springframework.data.cassandra 包中,是 Spring Cassandra 支持的核心类,提供了一套丰富的功能集以与数据库进行交互。该模板提供了便捷的操作来创建、更新、删除和查询 Cassandra,并在你的领域对象与 Cassandra 表中的行之间提供了映射。
预编译语句
可以多次执行的 CQL 语句可以被准备并存储在 PreparedStatement 对象中,以提高查询性能。驱动程序和 Cassandra 都维护 PreparedStatement 查询及其元数据的映射。您可以通过以下抽象使用预编译语句:
映射
MappingCassandraConverter 提供了丰富的对象映射支持。MappingCassandraConverter 拥有一个丰富的元数据模型,提供了完整的功能集,用于将领域对象映射到 CQL 表。
基于类型的转换器
以下是一个 Spring Converter 实现的示例,它将 String 转换为自定义的 Email 值对象:
基于属性的转换器
虽然基于类型的转换已经提供了在目标存储中影响某些类型的转换和表示的方法,但当只有特定类型的某些值或属性应考虑进行转换时,它仍然存在局限性。基于属性的转换器允许按每个属性配置转换规则,既可以通过声明性方式(通过 @ValueConverter)也可以通过编程方式(为特定属性注册 PropertyValueConverter)。
生命周期事件
Cassandra 映射框架有几个内建的 org.springframework.context.ApplicationEvent 事件,您的应用可以通过在 ApplicationContext 中注册特定的 bean 来响应这些事件。由于它基于 Spring 的应用上下文事件基础设施,其他产品(如 Spring Integration)可以轻松接收这些事件,因为它们是 Spring 基于应用的已知事件机制。
Cassandra 的审计配置
要激活审计功能,请创建一个配置,如以下示例所示:
值表达式基础知识
值表达式是 Spring 表达式语言 (SpEL) 和属性占位符解析的组合。它们将强大的程序表达式评估与简单的属性占位符解析结合在一起,以从环境中获取值,例如配置属性。