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, поэтому его должно быть легко импортировать и запускать как есть.