Перейти к основному содержимому

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

· 4 мин. чтения

1. Обзор

Это вторая статья из серии статей Spring Data Cassandra. В этой статье мы в основном сосредоточимся на запросах CassandraTemplate и CQL на уровне доступа к данным. Подробнее о Spring Data Cassandra можно прочитать в первой статье цикла .

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

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

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

2. Конфигурация шаблона Cassandra

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

@Configuration
@EnableCassandraRepositories(basePackages = "com.foreach.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<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 можно использовать в любом случае, этот механизм обычно рекомендуется для нескольких вставок для высокоскоростного приема.

PreparedStatement подготавливается только один раз, что помогает обеспечить высокую производительность:

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. Вывод

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

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