天天看點

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

@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

以下查詢擷取關系中的行數:

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

以下查詢使用綁定變量:

Mono countOfActorsNamedJoe = reactiveCqlTemplate.queryForObject(

"SELECT COUNT(*) FROM t_actor WHERE first_name = ?", Integer.class, "Joe");

以下示例查詢 a String:

Mono lastName = reactiveCqlTemplate.queryForObject(

"SELECT last_name FROM t_actor WHERE id = ?",

String.class, 1212L);

以下示例查詢并填充單個域對象:

Mono actor = reactiveCqlTemplate.queryForObject(

"SELECT first_name, last_name FROM t_actor WHERE id = ?",

new RowMapper() {

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 actors = reactiveCqlTemplate.query(

"SELECT first_name, last_name FROM t_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 findAllActors() {

return reactiveCqlTemplate.query("SELECT first_name, last_name FROM t_actor", ActorMapper.INSTANCE);

enum ActorMapper implements RowMapper {

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 applied = reactiveCqlTemplate.execute(

"INSERT INTO t_actor (first_name, last_name) VALUES (?, ?)",

"Leonor", "Watling");

以下示例顯示如何使用 執行UPDATE操作ReactiveCqlTemplate:

"UPDATE t_actor SET last_name = ? WHERE id = ?",

"Banjo", 5276L);

以下示例顯示如何使用 執行DELETE操作ReactiveCqlTemplate:

"DELETE FROM actor WHERE id = ?",

actorId);

Spring認證中國教育管理中心-Apache Cassandra 的 Spring 資料教程六

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

@Autowired

private ReactiveCassandraOperations reactiveCassandraOperations;

像所有的春天自動連接配接,這是假定隻有一個bean類型的

ReactiveCassandraOperations中ApplicationContext。如果您有多個ReactiveCassandraTemplatebean(如果您在同一個項目中使用多個鍵空間就可能是這種情況),那麼您可以使用@Qualifier注釋來指定要自動裝配的 bean。

@Qualifier("keyspaceTwoTemplateBeanId")

Bean 查找ApplicationContext

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

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