SpringデータからのCassandraTemplateの使用

Spring DataからのCassandraTemplateの使用

1. 概要

これは、Spring Data Cassandraの記事シリーズの2番目の記事です。 この記事では、主にデータアクセス層のCassandraTemplateとCQLクエリに焦点を当てます。 Spring Data Cassandraの詳細については、first article in the seriesを参照してください。

Cassandraクエリ言語(CQL)はCassandraデータベースのクエリ言語であり、CqlTemplateはSpring DataCassandraの低レベルのデータアクセステンプレートです。CQLステートメントを実行するためのデータ操作関連の操作を便利に公開します。

CassandraTemplateは、低レベルのCqlTemplateの上に構築され、ドメインオブジェクトをクエリし、オブジェクトをCassandraの永続データ構造にマップする簡単な方法を提供します。

構成から始めて、2つのテンプレートの使用例を見ていきましょう。

2. CassandraTemplate構成

メインのCassandraSpring構成がAbstractCassandraConfigurationを拡張しているため、CassandraTemplateはSpringコンテキストで使用できます。

@Configuration
@EnableCassandraRepositories(basePackages = "org.example.spring.data.cassandra.repository")
public class CassandraConfig extends AbstractCassandraConfiguration { ... }

次に、正確なタイプであるCassandraTemplateによって、またはより一般的なインターフェイスCassandraOperations:として、テンプレートに単純なワイヤリングを行うことができます。

@Autowired
private CassandraOperations cassandraTemplate;

3. CassandraTemplateを使用したデータアクセス

データアクセス層モジュールで上記で定義されたCassandraTemplateを使用して、永続的なデータを操作してみましょう。

3.1. 新しい本を保存する

ブックストアに新しい本を保存できます:

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);

次に、データベースに挿入された本の可用性を確認できます。

Select select = QueryBuilder.select().from("book")
  .where(QueryBuilder.eq("title", "Head First Java"))
  .and(QueryBuilder.eq("publisher", "O'Reilly Media"));
Book retrievedBook = cassandraTemplate.selectOne(select, Book.class);

ここではSelect QueryBuilderを使用して、cassandraTemplateselectOne()にマップしています。 QueryBuilderについては、CQLクエリのセクションで詳しく説明します。

3.2. 複数の本を保存する

リストを使用して、複数の本を書店に一度に保存できます。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
Book dPatternBook = new Book(
  UUIDs.timeBased(), "Head Design Patterns", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
List bookList = new ArrayList();
bookList.add(javaBook);
bookList.add(dPatternBook);
cassandraTemplate.insert(bookList);

3.3. 既存の本を更新する

新しい本を挿入することから始めましょう。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);

本を取り出しましょう:

Select select = QueryBuilder.select().from("book");
Book retrievedBook = cassandraTemplate.selectOne(select, Book.class);

次に、取得した本にいくつかのタグを追加しましょう。

retrievedBook.setTags(ImmutableSet.of("Java", "Programming"));
cassandraTemplate.update(retrievedBook);

3.4. 挿入した本を削除する

新しい本を挿入しましょう:

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);

次に、本を削除します。

cassandraTemplate.delete(javaBook);

3.5. すべての本を削除する

新しい本をいくつか挿入しましょう。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
Book dPatternBook = new Book(
  UUIDs.timeBased(), "Head Design Patterns", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);
cassandraTemplate.insert(dPatternBook);

次に、すべての書籍を削除します。

cassandraTemplate.deleteAll(Book.class);

4. CQLクエリを使用したデータアクセス

データアクセスレイヤーでのデータ操作には、常にCQLクエリを使用できます。 CQLクエリの処理はCqlTemplateクラスによって実行されるため、必要に応じてカスタムクエリを実行できます。

ただし、CassandraTemplateクラスはCqlTemplateの拡張であるため、これらのクエリを直接実行するために使用できます。

CQLクエリを使用してデータを操作するために使用できるさまざまな方法を見てみましょう。

4.1. QueryBuilderの使用

QueryBuilderを使用して、データベース内のデータ操作のクエリを作成できます。 ほとんどすべての標準的な操作は、すぐに使用できるビルディングブロックを使用して構築できます。

Insert insertQueryBuider = QueryBuilder.insertInto("book")
 .value("isbn", UUIDs.timeBased())
 .value("title", "Head First Java")
 .value("publisher", "OReilly Media")
 .value("tags", ImmutableSet.of("Software"));
cassandraTemplate.execute(insertQueryBuider);

コードスニペットをよく見ると、関連する操作タイプ(挿入、削除など)の代わりにexecute()メソッドが使用されていることに気付くかもしれません。 これは、クエリのタイプがQueryBuilder.の出力によって定義されるためです。

4.2. PreparedStatementsの使用

PreparedStatementsはどのような場合でも使用できますが、このメカニズムは通常、高速取り込み用の複数のインサートに推奨されます。

PreparedStatementは1回だけ準備されるため、高いパフォーマンスを確保できます。

UUID uuid = UUIDs.timeBased();
String insertPreparedCql =
  "insert into book (isbn, title, publisher, tags) values (?, ?, ?, ?)";
List singleBookArgsList = new ArrayList<>();
List> bookList = new ArrayList<>();
singleBookArgsList.add(uuid);
singleBookArgsList.add("Head First Java");
singleBookArgsList.add("OReilly Media");
singleBookArgsList.add(ImmutableSet.of("Software"));
bookList.add(singleBookArgsList);
cassandraTemplate.ingest(insertPreparedCql, bookList);



4.3. CQLステートメントの使用

CQLステートメントを直接使用して、次のようにデータをクエリできます。

UUID uuid = UUIDs.timeBased();
String insertCql = "insert into book (isbn, title, publisher, tags)
  values (" + uuid + ", 'Head First Java', 'OReilly Media', {'Software'})";
cassandraTemplate.execute(insertCql);

5. 結論

この記事では、CassandraTemplateやCQLクエリなど、Spring DataCassandraを使用したさまざまなデータ操作戦略について説明しました。

上記のコードスニペットと例の実装はmy GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。