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

2021-12-13 16:26:09 浏览数 (1)

介绍

参考文档的这一部分解释了 Spring Data 为 Apache Cassandra 提供的核心功能。

Cassandra 支持介绍了 Cassandra 模块功能集。

反应式 Cassandra 支持解释了反应式 Cassandra 的细节。

Cassandra Repositories引入了对 Cassandra 的存储库支持。

8.1.Apache Cassandra 模块的 Spring CQL 和 Spring Data

Spring Data for Apache Cassandra 允许在 CQL 和实体级别进行交互。

Spring Data 为 Apache Cassandra 抽象提供的值可能最好通过下表中列出的操作序列来展示。该表显示了 Spring 负责哪些操作以及哪些操作是您(应用程序开发人员)的责任。

核心 CQL 支持负责处理所有低级细节,这些细节可以使 Cassandra 和 CQL 成为开发时如此乏味的 API。使用映射实体对象允许模式生成、对象映射和存储库支持。

8.1.1.为 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语句。这种方法提供了更好的文档和易用性。
  • Repository Abstraction 允许您在数据访问层中创建存储库声明。Spring Data 的存储库抽象的目标是显着减少为各种持久性存储实现数据访问层所需的样板代码量。

9. 卡桑德拉支持

Spring Data 对 Apache Cassandra 的支持包含广泛的特性:

  • Spring 配置支持基于 Java 的@Configuration类或 XML 命名空间。
  • CqlTemplate通过正确处理常见的 Cassandra 数据访问操作来提高生产力的助手类。
  • CassandraTemplate提供 CQL 表和 POJO 之间的对象映射的帮助器类。
  • 异常转换为 Spring 的可移植数据访问异常层次结构。
  • Spring 的 转换服务集成的功能丰富的对象映射。
  • 基于注释的映射元数据可扩展以支持其他元数据格式。
  • 基于 Java 的查询、条件和更新 DSL。
  • Repository接口的自动实现,包括对自定义查找器方法的支持。

对于大多数面向数据的任务,您可以使用CassandraTemplate或Repository支持,两者都使用丰富的对象映射功能。CqlTemplate通常用于增加计数器或执行临时 CRUD 操作。CqlTemplate还提供了回调方法,可以轻松获取低级 API 对象,例如 com.datastax.oss.driver.api.core.CqlSession,可以让您直接与 Cassandra 通信。Spring Data for Apache Cassandra 对各种 API 中的对象使用与 DataStax Java 驱动程序中的对象一致的命名约定,以便它们熟悉,并且您可以将现有知识映射到 Spring API。

9.1.入门

Spring Data for Apache Cassandra 需要 Apache Cassandra 2.1 或更高版本以及 Datastax Java Driver 4.0 或更高版本。快速设置和引导工作环境的一种简单方法是在STS 中创建基于 Spring 的项目或使用Spring Initializer。

首先,您需要设置一个正在运行的 Apache Cassandra 服务器。有关 如何启动 Apache Cassandra 的说明,请参阅 Apache Cassandra 快速入门指南。一旦安装后,开始Cassandra是典型地执行以下命令的问题: CASSANDRA_HOME/bin/cassandra -f。

要在 STS 中创建 Spring 项目,请转到 File → New → Spring Template Project → Simple Spring Utility Project,然后在出现提示时按 Yes。然后输入项目和包名称,例如 org.spring.data.cassandra.example.

然后,您可以将以下依赖项声明添加到 pom.xml 文件的dependencies部分。

代码语言:javascript复制
<dependencies>

  <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-cassandra</artifactId>
    <version>3.3.0</version>
  </dependency>

</dependencies>

此外,您应该将 pom.xml 文件中的 Spring 版本更改为如下:

代码语言:javascript复制
<spring.framework.version>5.3.13</spring.framework.version>

如果使用里程碑版本而不是 GA 版本,您还需要将 Maven 的 Spring Milestone 存储库的位置添加到您的 pom.xml 文件中,使其与您的<dependencies/>元素处于同一级别,如下所示:

代码语言:javascript复制
<repositories>
  <repository>
    <id>spring-milestone</id>
    <name>Spring Maven MILESTONE Repository</name>
    <url>https://repo.spring.io/libs-milestone</url>
  </repository>
</repositories>

存储库也可在此处浏览。

您还可以在此处浏览所有 Spring 存储库。

现在您可以创建一个简单的 Java 应用程序,该应用程序在 Cassandra 中存储和读取域对象。

为此,首先创建一个简单的域对象类来持久化,如以下示例所示:

代码语言:javascript复制
package org.springframework.data.cassandra.example;

import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.Table;

@Table
public class Person {

  @PrimaryKey private final String id;

  private final String name;
  private final int age;

  public Person(String id, String name, int age) {
    this.id = id;
    this.name = name;
    this.age = age;
  }

  public String getId() {
    return id;
  }

  private String getName() {
    return name;
  }

  private int getAge() {
    return age;
  }

  @Override
  public String toString() {
    return String.format("{ @type = %1$s, id = %2$s, name = %3$s, age = %4$d }", getClass().getName(), getId(),
        getName(), getAge());
  }
}

接下来,创建要运行的主应用程序,如以下示例所示:

代码语言:javascript复制
package org.springframework.data.cassandra.example;

import java.util.UUID;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.data.cassandra.core.CassandraOperations;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.data.cassandra.core.query.Criteria;
import org.springframework.data.cassandra.core.query.Query;

import com.datastax.oss.driver.api.core.CqlSession;

public class CassandraApplication {

  private static final Logger LOGGER = LoggerFactory.getLogger(CassandraApplication.class);

  private static Person newPerson(String name, int age) {
    return new Person(UUID.randomUUID().toString(), name, age);
  }

  public static void main(String[] args) {

    CqlSession cqlSession = CqlSession.builder().withKeyspace("mykeyspace").build();

    CassandraOperations template = new CassandraTemplate(cqlSession);

    Person jonDoe = template.insert(newPerson("Jon Doe", 40));

    LOGGER.info(template.selectOne(Query.query(Criteria.where("id").is(jonDoe.getId())), Person.class).getId());

    template.truncate(Person.class);
    cqlSession.close();
  }

}

即使在这个简单的例子中,也有一些值得注意的地方需要指出:

  • 您可以CassandraTemplate使用 Cassandra创建一个实例CqlSession。
  • 您必须将您的 POJO 注释为 Cassandra@Table实体,并注释@PrimaryKey. 或者,您可以覆盖这些映射名称以匹配您的 Cassandra 数据库表和列名称。
  • 您可以使用原始 CQL 或 DataStax QueryBuilderAPI 来构建您的查询。

9.2.示例库

要了解库的工作原理,您可以下载并试用 几个示例。.

9.3.使用 Spring 连接到 Cassandra

在 Spring 中使用 Apache Cassandra 时的首要任务之一是 com.datastax.oss.driver.api.core.CqlSession使用 Spring IoC 容器创建对象。您可以通过使用基于 Java 的 bean 元数据或使用基于 XML 的 bean 元数据来实现。这些将在以下各节中讨论。

对于那些不熟悉如何配置使用基于Java bean的元数据,而不是基于XML的元数据Spring容器,请参阅参考文档的高级介绍 这里 还有详细的文档在这里。

9.3.1.使用基于 Java 的元数据注册会话实例

以下示例显示了如何使用基于 Java 的 bean 元数据来注册 a 的实例 com.datastax.oss.driver.api.core.CqlSession:

示例 54.com.datastax.oss.driver.api.core.CqlSession使用基于 Java 的 bean 元数据注册对象

代码语言:javascript复制
@Configuration
public class AppConfig {

  /*
   * Use the standard Cassandra driver API to create a com.datastax.oss.driver.api.core.CqlSession instance.
   */
  public @Bean CqlSession session() {
    return CqlSession.builder().withKeyspace("mykeyspace").build();
  }
}

这种方法让您可以使用 com.datastax.oss.driver.api.core.CqlSession您可能已经知道的标准API。

另一种方法是 com.datastax.oss.driver.api.core.CqlSession使用 Spring 的CqlSessionFactoryBean. 与com.datastax.oss.driver.api.core.CqlSession直接实例化实例相比,该FactoryBean方法还有一个额外的优势,即还为容器提供了一个ExceptionTranslator实现,将 Cassandra 异常转换为 Spring 可移植DataAccessException层次结构中的异常。Spring 的 DAO 支持特性中@Repository描述了这种层次结构和使用 。

以下示例显示了基于 Java 的工厂类用法:

示例 55. 使用 Spring 的注册 com.datastax.oss.driver.api.core.CqlSession 对象CqlSessionFactoryBean:

代码语言:javascript复制
@Configuration
public class FactoryBeanAppConfig {

  /*
   * Factory bean that creates the com.datastax.oss.driver.api.core.CqlSession instance
   */
  @Bean
  public CqlSessionFactoryBean session() {

    CqlSessionFactoryBean session = new CqlSessionFactoryBean();
    session.setContactPoints("localhost");
    session.setKeyspaceName("mykeyspace");

    return session;
  }
}

使用CassandraTemplate与对象映射和存储库支持需要CassandraTemplate, CassandraMappingContext,CassandraConverter,和使储存库支持。

以下示例显示了如何注册组件以配置对象映射和存储库支持:

示例 56. 注册组件以配置对象映射和存储库支持

代码语言:javascript复制
@Configuration
@EnableCassandraRepositories(basePackages = { "org.springframework.data.cassandra.example" })
public class CassandraConfig {

  @Bean
  public CqlSessionFactoryBean session() {

    CqlSessionFactoryBean session = new CqlSessionFactoryBean();
    session.setContactPoints("localhost");
    session.setKeyspaceName("mykeyspace");

    return session;
  }

  @Bean
  public SessionFactoryFactoryBean sessionFactory(CqlSession session, CassandraConverter converter) {

    SessionFactoryFactoryBean sessionFactory = new SessionFactoryFactoryBean();
    sessionFactory.setSession(session);
    sessionFactory.setConverter(converter);
    sessionFactory.setSchemaAction(SchemaAction.NONE);

    return sessionFactory;
  }

  @Bean
  public CassandraMappingContext mappingContext(CqlSession cqlSession) {

    CassandraMappingContext mappingContext = new CassandraMappingContext();
    mappingContext.setUserTypeResolver(new SimpleUserTypeResolver(cqlSession));

    return mappingContext;
  }

  @Bean
  public CassandraConverter converter(CassandraMappingContext mappingContext) {
    return new MappingCassandraConverter(mappingContext);
  }

  @Bean
  public CassandraOperations cassandraTemplate(SessionFactory sessionFactory, CassandraConverter converter) {
    return new CassandraTemplate(sessionFactory, converter);
  }
}

创建为 Apache Cassandra 组件注册 Spring Data 的配置类可能是一个令人筋疲力尽的挑战,因此 Spring Data for Apache Cassandra 附带了一个预构建的配置支持类。从 AbstractCassandraConfiguration用于 Apache Cassandra 的 Spring Data 注册 bean扩展的类 。 AbstractCassandraConfiguration允许您提供各种配置选项,例如初始实体、默认查询选项、池选项、套接字选项等等。AbstractCassandraConfiguration还支持您根据初始实体(如果提供)生成模式。扩展 from AbstractCassandraConfiguration要求您至少通过实现该getKeyspaceName方法提供键空间名称。以下示例显示了如何使用 注册 bean AbstractCassandraConfiguration:

示例 57. 使用以下命令为 Apache Cassandra bean 注册 Spring Data AbstractCassandraConfiguration

代码语言:javascript复制
@Configuration
public class CassandraConfiguration extends AbstractCassandraConfiguration {

  /*
   * Provide a contact point to the configuration.
   */
  public String getContactPoints() {
    return "localhost";
  }

  /*
   * Provide a keyspace name to the configuration.
   */
  public String getKeyspaceName() {
    return "mykeyspace";
  }
}

0 人点赞