Использование CassandraTemplate из Spring Data

Использование CassandraTemplate из данных Spring

1. обзор

Это вторая статья из серии статей Spring Data Cassandra. В этой статье мы в основном сосредоточимся наCassandraTemplate и CQL-запросах на уровне доступа к данным. Вы можете узнать больше о Spring Data Cassandra вfirst article in the series.

Cassandra Query Language (CQL) - это язык запросов для базы данных Cassandra, аCqlTemplate - это низкоуровневый шаблон доступа к данным в Spring Data Cassandra - он удобно предоставляет операции, связанные с манипулированием данными, для выполнения операторов CQL.

CassandraTemplate строится поверх нижнего уровняCqlTemplate и предоставляет простой способ запрашивать объекты домена и отображать объекты в сохраняемую структуру данных в Cassandra.

Начнем с настройки, а затем рассмотрим примеры использования двух шаблонов.

2. CassandraTemplate Конфигурация

CassandraTemplate доступен в контексте Spring, потому что наша основная конфигурация Cassandra Spring расширяет AbstractCassandraConfiguration:

@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 для отображения наselectOne() вcassandraTemplate. Мы обсудим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 готовится только один раз, что помогает обеспечить высокую производительность:

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. Заключение

В этой статье мы рассмотрели различные стратегии манипулирования данными с использованием Spring Data Cassandra, включаяCassandraTemplate и запросы CQL.

Реализация приведенных выше фрагментов кода и примеров можно найти вmy GitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.