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を使用して、cassandraTemplateのselectOne()にマップしています。 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
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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。