Utilisation du CassandraTemplate à partir des données de printemps

Utilisation du CassandraTemplate à partir des données de printemps

1. Vue d'ensemble

Ceci est le deuxième article de la série d'articles Spring Data Cassandra. Dans cet article, nous nous concentrerons principalement sur les requêtesCassandraTemplate et CQL dans la couche d'accès aux données. Vous pouvez en savoir plus sur Spring Data Cassandra dans lefirst article in the series.

Cassandra Query Language (CQL) est le langage de requête de la base de données Cassandra etCqlTemplate est le modèle d'accès aux données de bas niveau dans Spring Data Cassandra - il expose de manière pratique les opérations liées à la manipulation des données pour exécuter des instructions CQL.

CassandraTemplate s'appuie sur lesCqlTemplate de bas niveau et fournit un moyen simple d'interroger les objets du domaine et de mapper les objets à une structure de données persistante dans Cassandra.

Commençons par la configuration, puis plongeons dans des exemples d'utilisation des deux modèles.

2. Configuration deCassandraTemplate

CassandraTemplate est disponible dans le contexte Spring car notre configuration principale de Cassandra Spring étend AbstractCassandraConfiguration:

@Configuration
@EnableCassandraRepositories(basePackages = "org.example.spring.data.cassandra.repository")
public class CassandraConfig extends AbstractCassandraConfiguration { ... }

Nous pouvons ensuite câbler simplement le modèle - soit par son type exact, CassandraTemplate, soit en tant qu'interface plus génériqueCassandraOperations:

@Autowired
private CassandraOperations cassandraTemplate;

3. Accès aux données à l'aide deCassandraTemplate

Utilisons lesCassandraTemplate définis ci-dessus dans notre module de couche d'accès aux données pour travailler avec des données persistantes.

3.1. Enregistrer un nouveau livre

Nous pouvons enregistrer un nouveau livre dans notre librairie:

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);

Ensuite, nous pouvons vérifier la disponibilité du livre inséré dans la base de données:

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);

Nous utilisons ici unSelect QueryBuilder, pour être mappé auxselectOne() danscassandraTemplate. Nous discuterons plus en détail desQueryBuilder dans la section des requêtes CQL.

3.2. Enregistrer plusieurs livres

Nous pouvons enregistrer plusieurs livres simultanément dans notre librairie en utilisant une liste:

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. Mettre à jour un livre existant

Lat commence par insérer un nouveau livre:

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);

Allons chercher le livre:

Select select = QueryBuilder.select().from("book");
Book retrievedBook = cassandraTemplate.selectOne(select, Book.class);

Ajoutons ensuite quelques balises supplémentaires au livre récupéré:

retrievedBook.setTags(ImmutableSet.of("Java", "Programming"));
cassandraTemplate.update(retrievedBook);

3.4. Suppression d'un livre inséré

Insérons un nouveau livre:

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);

Puis supprimez le livre:

cassandraTemplate.delete(javaBook);

3.5. Suppression de tous les livres

Insérons maintenant de nouveaux livres:

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);

Puis supprimez tous les livres:

cassandraTemplate.deleteAll(Book.class);

4. Accès aux données à l'aide de requêtes CQL

Il est toujours possible d'utiliser des requêtes CQL pour la manipulation de données dans la couche d'accès aux données. Le traitement des requêtes CQL est effectué par la classeCqlTemplate, ce qui nous permet d'exécuter des requêtes personnalisées selon les besoins.

Cependant, comme la classeCassandraTemplate est une extension deCqlTemplate, nous pouvons l'utiliser directement pour exécuter ces requêtes.

Examinons les différentes méthodes que nous pouvons utiliser pour manipuler les données à l'aide de requêtes CQL.

4.1. Utilisation deQueryBuilder

QueryBuilder peut être utilisé pour créer une requête pour la manipulation de données dans la base de données. Presque toutes les manipulations standard peuvent être construites à l'aide de blocs de construction prêts à l'emploi:

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);

Si vous regardez attentivement l'extrait de code, vous remarquerez peut-être que la méthodeexecute() est utilisée à la place du type d'opération approprié (insérer, supprimer, etc.). En effet, le type de requête est défini par la sortie desQueryBuilder.

4.2. Utilisation dePreparedStatements

Même siPreparedStatements peut être utilisé dans tous les cas, ce mécanisme est généralement recommandé pour plusieurs inserts pour une ingestion à grande vitesse.

UnPreparedStatement n'est préparé qu'une seule fois, ce qui permet de garantir des performances élevées:

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. Utilisation des instructions CQL

Nous pouvons directement utiliser les instructions CQL pour interroger des données comme suit:

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. Conclusion

Dans cet article, nous avons examiné diverses stratégies de manipulation de données à l'aide de Spring Data Cassandra, y compris les requêtesCassandraTemplate et CQL.

L'implémentation des extraits de code et des exemples ci-dessus peut être trouvée dansmy GitHub project - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.