10.3.1.使用基于 Java 的元数据注册 Session 实例
您可以使用Java 配置类来配置响应式 Cassandra 支持。CqlSession响应式Cassandra 支持改编为在异步驱动程序之上提供响应式处理模型。
反应式CqlSession的配置类似于命令式CqlSession。我们提供带有预定义默认值的支持配置类,并且只需要特定于环境的信息来为 Apache Cassandra 配置 Spring Data。反应式支持的基类是 AbstractReactiveCassandraConfiguration. 这个配置类扩展了命令式AbstractCassandraConfiguration,所以反应式支持也配置了命令式 API 支持。以下示例显示如何在配置类中注册 Apache Cassandra bean: ReactiveAppCassandraConfiguration .Registering Spring Data for Apache Cassandra beans usingAbstractReactiveCassandraConfiguration
代码语言:javascript复制@Configuration
public class ReactiveCassandraConfiguration extends AbstractReactiveCassandraConfiguration {
/*
* Provide a contact point to the configuration.
*/
public String getContactPoints() {
return "localhost";
}
/*
* Provide a keyspace name to the configuration.
*/
public String getKeyspaceName() {
return "mykeyspace";
}
}
前面示例中的配置类启用了模式管理以在启动期间创建 CQL 对象。有关更多详细信息,请参阅架构管理。
10.4.ReactiveCqlTemplate
的ReactiveCqlTemplate类是在芯CQL包的核心类。它处理资源的创建和释放。它执行核心 CQL 工作流的基本任务,例如创建和运行语句,留下应用程序代码以提供 CQL 和提取结果。该ReactiveCqlTemplate班运行CQL的查询和更新语句,并在执行迭代ResultSet情况下,返回的参数值的提取。它还捕获 CQL 异常并将它们转换为org.springframework.dao包中定义的通用的、信息更丰富的异常层次结构。
当你ReactiveCqlTemplate在你的代码中使用 时,你只需要实现回调接口,它有一个明确定义的契约。给定 a Connection, ReactivePreparedStatementCreator回调接口使用提供的 CQL 和任何必要的参数参数创建一个准备好的语句。该RowCallbackHandler 接口从 a 的每一行中提取值ReactiveResultSet。
ReactiveCqlTemplate可以通过ReactiveSessionFactory 引用直接实例化在 DAO 实现中使用,也可以在 Spring 容器中配置并作为 bean 引用提供给 DAO。ReactiveCqlTemplate是 ReactiveCassandraTemplate.
此类发布的所有 CQL 都记录在与DEBUG模板实例的完全限定类名对应的类别下的级别(通常为ReactiveCqlTemplate,但如果您使用ReactiveCqlTemplate该类的自定义子类,则可能会有所不同)。
10.4.1.ReactiveCqlTemplate类使用示例
本节提供了一些ReactiveCqlTemplate类使用示例。这些示例并不是ReactiveCqlTemplate. 请参阅随附的 Javadocs。
查询 (SELECT) 与ReactiveCqlTemplate
以下查询获取关系中的行数:
代码语言:javascript复制Mono<Integer> rowCount = reactiveCqlTemplate.queryForObject("SELECT COUNT(*) FROM t_actor", Integer.class);
以下查询使用绑定变量:
代码语言:javascript复制Mono<Integer> countOfActorsNamedJoe = reactiveCqlTemplate.queryForObject(
"SELECT COUNT(*) FROM t_actor WHERE first_name = ?", Integer.class, "Joe");
以下示例查询 a String:
代码语言:javascript复制Mono<String> lastName = reactiveCqlTemplate.queryForObject(
"SELECT last_name FROM t_actor WHERE id = ?",
String.class, 1212L);
以下示例查询并填充单个域对象:
代码语言:javascript复制Mono<Actor> actor = reactiveCqlTemplate.queryForObject(
"SELECT first_name, last_name FROM t_actor WHERE id = ?",
new RowMapper<Actor>() {
public Actor mapRow(Row row, int rowNum) {
Actor actor = new Actor();
actor.setFirstName(row.getString("first_name"));
actor.setLastName(row.getString("last_name"));
return actor;
}},
1212L);
以下示例查询并填充多个域对象:
代码语言:javascript复制Flux<Actor> actors = reactiveCqlTemplate.query(
"SELECT first_name, last_name FROM t_actor",
new RowMapper<Actor>() {
public Actor mapRow(Row row, int rowNum) {
Actor actor = new Actor();
actor.setFirstName(row.getString("first_name"));
actor.setLastName(row.getString("last_name"));
return actor;
}
});
如果最后两个代码片段确实存在于同一个应用程序中,那么删除两个RowMapper匿名内部类中存在的重复并将它们提取到一个类(通常是static嵌套类)中是有意义的,然后可以由 DAO 方法引用如所须。
例如,将最后一个代码片段编写如下可能会更好:
代码语言:javascript复制Flux<Actor> findAllActors() {
return reactiveCqlTemplate.query("SELECT first_name, last_name FROM t_actor", ActorMapper.INSTANCE);
}
enum ActorMapper implements RowMapper<Actor> {
INSTANCE;
public Actor mapRow(Row row, int rowNum) {
Actor actor = new Actor();
actor.setFirstName(row.getString("first_name"));
actor.setLastName(row.getString("last_name"));
return actor;
}
}
INSERT,UPDATE以及DELETE用ReactiveCqlTemplate
您可以使用该execute(…)方法来执行INSERT,UPDATE和DELETE操作。参数值通常作为可变参数提供,或者作为对象数组提供。
以下示例显示如何使用 执行INSERT操作ReactiveCqlTemplate:
代码语言:javascript复制Mono<Boolean> applied = reactiveCqlTemplate.execute(
"INSERT INTO t_actor (first_name, last_name) VALUES (?, ?)",
"Leonor", "Watling");
以下示例显示如何使用 执行UPDATE操作ReactiveCqlTemplate:
代码语言:javascript复制Mono<Boolean> applied = reactiveCqlTemplate.execute(
"UPDATE t_actor SET last_name = ? WHERE id = ?",
"Banjo", 5276L);
以下示例显示如何使用 执行DELETE操作ReactiveCqlTemplate:
代码语言:javascript复制Mono<Boolean> applied = reactiveCqlTemplate.execute(
"DELETE FROM actor WHERE id = ?",
actorId);
10.5.异常翻译
Spring Framework 为各种数据库和映射技术提供异常转换。这在传统上用于 JDBC 和 JPA。Spring Data for Apache Cassandra 通过提供 org.springframework.dao.support.PersistenceExceptionTranslator接口的实现将此功能扩展到 Apache Cassandra 。
映射到 Spring 的一致数据访问异常层次结构背后的动机 是让您编写可移植和描述性的异常处理代码,而无需针对特定的 Cassandra 异常进行编码和处理。Spring 的所有数据访问异常都继承自 DataAccessException该类,因此您可以确保可以在单个 try-catch 块中捕获所有与数据库相关的异常。
ReactiveCqlTemplate并ReactiveCassandraTemplate尽早传播异常。在处理反应序列期间出现的异常作为错误信号发出。
10.6.简介ReactiveCassandraTemplate
该ReactiveCassandraTemplate班,地处 org.springframework.data.cassandra包,是在Spring Data的卡桑德拉支持的核心类。它提供了丰富的功能集来与数据库交互。该模板提供方便的数据访问操作来创建、更新、删除和查询 Cassandra,并提供域对象和 Cassandra 表行之间的映射。
配置后,ReactiveCassandraTemplate就是线程安全的,可以跨多个实例重复使用。
Cassandra 表中的行和域类之间的映射是通过委托给CassandraConverter接口的实现来完成的。Spring 提供了默认实现,MappingCassandraConverter但您也可以编写自己的自定义转换器。有关更多详细信息,请参阅“映射”。
本ReactiveCassandraTemplate类实现了 ReactiveCassandraOperations接口。方法名称尽可能ReactiveCassandraOperations与 Cassandra 中的名称匹配,以使熟悉 Cassandra 的开发人员熟悉 API。
例如,你可以找到方法,例如select,insert,delete,和update。设计目标是尽可能轻松地在基本 Cassandra 驱动程序和 ReactiveCassandraOperations. 两个 API 之间的主要区别是ReactiveCassandraOperations可以传递域对象而不是 CQL 和查询对象。
在ReactiveCassandraTemplate实例上引用操作的首选方法是通过其接口 ReactiveCassandraOperations.
的默认转换器实现ReactiveCassandraTemplate是 MappingCassandraConverter. 虽然MappingCassandraConverter可以使用附加元数据来指定对象到行的映射,但它也可以通过使用字段和表名称映射的约定来转换不包含附加元数据的对象。这些约定以及映射注释的使用在“映射”中进行了解释。
的另一个核心特征CassandraTemplate是异常翻译。Cassandra Java 驱动程序抛出的异常被转换为 Spring 的可移植数据访问异常层次结构。有关更多信息,请参阅“异常翻译”。
10.6.1.实例化ReactiveCassandraTemplate
ReactiveCassandraTemplate应该始终配置为 Spring bean,尽管前面的示例显示了如何直接实例化它。但是,本节假定模板在 Spring 模块中使用,因此也假定正在使用 Spring 容器。
有两种方法可以获取 a ReactiveCassandraTemplate,具体取决于您加载 Spring 的方式ApplicationContext:
- 自动装配
- Bean 查找 ApplicationContext
自动装配
您可以将 a 自动装配ReactiveCassandraTemplate到您的项目中,如以下示例所示:
代码语言:javascript复制@Autowired
private ReactiveCassandraOperations reactiveCassandraOperations;
像所有的春天自动连接,这是假定只有一个bean类型的 ReactiveCassandraOperations中ApplicationContext。如果您有多个ReactiveCassandraTemplatebean(如果您在同一个项目中使用多个键空间就可能是这种情况),那么您可以使用@Qualifier注释来指定要自动装配的 bean。
代码语言:javascript复制@Autowired
@Qualifier("keyspaceTwoTemplateBeanId")
private ReactiveCassandraOperations reactiveCassandraOperations;
Bean 查找ApplicationContext
您还可以ReactiveCassandraTemplate从 中查找bean ApplicationContext,如以下示例所示:
代码语言:javascript复制ReactiveCassandraOperations reactiveCassandraOperations = applicationContext.getBean("reactiveCassandraOperations", ReactiveCassand