SpringDataのCassandraTemplateを使用する
1. 概要
これは、SpringDataCassandraの記事シリーズの2番目の記事です。 この記事では、主にデータアクセス層でのCassandraTemplateおよびCQLクエリに焦点を当てます。 Spring Data Cassandraの詳細については、シリーズの最初の記事を参照してください。
Cassandraクエリ言語(CQL)はCassandraデータベースのクエリ言語であり、CqlTemplateはSpringDataCassandraの低レベルのデータアクセステンプレートです。これは、CQLステートメントを実行するためのデータ操作関連の操作を便利に公開します。
CassandraTemplate は、低レベルの CqlTemplate の上に構築され、ドメインオブジェクトをクエリし、オブジェクトをCassandraの永続化されたデータ構造にマップする簡単な方法を提供します。
構成から始めて、2つのテンプレートの使用例を詳しく見ていきましょう。
2. CassandraTemplate構成
CassandraTemplate は、メインのCassandra Spring構成がAbstractCassandraConfigurationを拡張しているため、Springコンテキストで使用できます。
@Configuration
@EnableCassandraRepositories(basePackages = "com.baeldung.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<Book> bookList = new ArrayList<Book>();
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 はどのような場合でも使用できますが、このメカニズムは通常、高速取り込み用の複数の挿入に推奨されます。
A PreparedStatement は1回だけ準備され、高性能を確保するのに役立ちます。
UUID uuid = UUIDs.timeBased();
String insertPreparedCql =
"insert into book (isbn, title, publisher, tags) values (?, ?, ?, ?)";
List<Object> singleBookArgsList = new ArrayList<>();
List<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クエリなど、SpringDataCassandraを使用したさまざまなデータ操作戦略について説明しました。
上記のコードスニペットと例の実装は、 my GitHubプロジェクトにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。