为了账号安全,请及时绑定邮箱和手机立即绑定

Spring认证中国教育管理中心-Apache Cassandra 的 Spring 数据教程六

标签:
大数据

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

@Configurationpublic 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

以下查询获取关系中的行数:

Mono<Integer> rowCount = reactiveCqlTemplate.queryForObject("SELECT COUNT(*) FROM t_actor", Integer.class);

以下查询使用绑定变量:

Mono<Integer> countOfActorsNamedJoe = reactiveCqlTemplate.queryForObject(  "SELECT COUNT(*) FROM t_actor WHERE first_name = ?", Integer.class, "Joe");

以下示例查询 a String:

Mono<String> lastName = reactiveCqlTemplate.queryForObject(  "SELECT last_name FROM t_actor WHERE id = ?",
  String.class, 1212L);

以下示例查询并填充单个域对象:

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);

以下示例查询并填充多个域对象:

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 方法引用如所须。

例如,将最后一个代码片段编写如下可能会更好:

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:

Mono<Boolean> applied = reactiveCqlTemplate.execute(  "INSERT INTO t_actor (first_name, last_name) VALUES (?, ?)",  "Leonor", "Watling");

以下示例显示如何使用 执行UPDATE操作ReactiveCqlTemplate:

Mono<Boolean> applied = reactiveCqlTemplate.execute(  "UPDATE t_actor SET last_name = ? WHERE id = ?",  "Banjo", 5276L);

以下示例显示如何使用 执行DELETE操作ReactiveCqlTemplate:

Mono<Boolean> applied = reactiveCqlTemplate.execute(  "DELETE FROM actor WHERE id = ?",
  actorId);

https://img1.sycdn.imooc.com//61b844020001ea2108070443.jpg


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到您的项目中,如以下示例所示:

@Autowiredprivate ReactiveCassandraOperations reactiveCassandraOperations;

像所有的春天自动连接,这是假定只有一个bean类型的
ReactiveCassandraOperations中ApplicationContext。如果您有多个ReactiveCassandraTemplatebean(如果您在同一个项目中使用多个键空间就可能是这种情况),那么您可以使用@Qualifier注释来指定要自动装配的 bean。

@Autowired@Qualifier("keyspaceTwoTemplateBeanId")
private ReactiveCassandraOperations reactiveCassandraOperations;

Bean 查找ApplicationContext

您还可以ReactiveCassandraTemplate从 中查找bean ApplicationContext,如以下示例所示:

ReactiveCassandraOperations reactiveCassandraOperations = applicationContext.getBean("reactiveCassandraOperations", ReactiveCassand


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消