Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Quarkus
  3. L'accès aux bases de données
Extrait - Quarkus Développer des applications microservices en Java pour le cloud et Kubernetes
Extraits du livre
Quarkus Développer des applications microservices en Java pour le cloud et Kubernetes Revenir à la page d'achat du livre

L'accès aux bases de données

Datasource et transaction

1. Datasource et driver JDBC

Pour se connecter à une base de données en Java, on va généralement utiliser un driver JDBC (Java DataBase Connectivity) ainsi qu’un pool de connexions.

Ceux-ci sont configurés via une datasource (source de données en français).

Chaque base de données a son propre driver. Dans ce livre, nous utiliserons la base de données PostgreSQL mais Quarkus supporte la plupart des bases de données relationnelles du marché.

Des extensions Quarkus existent pour les bases de données relationnelles les plus utilisées, offrant une meilleure intégration à Quarkus, et le plus souvent des dev services permettant de les lancer automatiquement en mode dev et au lancement des tests.

Le pool de connexions utilisé par Quarkus est Agroal.

Vous pouvez ajouter les extensions PostgreSQL et Agroal via :

  • la CLI Quarkus :

quarkus extension add agroal,jdbc-postgresql 
  • le plugin Maven :

mvn quarkus:add-extension -Dextensions="agroal,jdbc-postgresql" 

Ceci va ajouter les dépendances Maven suivantes :

<dependency> 
  <groupId>io.quarkus</groupId> 
  <artifactId>quarkus-jdbc-postgresql</artifactId> 
</dependency> 
<dependency> 
  <groupId>io.quarkus</groupId> 
  <artifactId>quarkus-agroal</artifactId> 
</dependency> 

Si vous utilisez Hibernate ORM, qui sera vu un peu plus loin dans ce chapitre, il n’est pas nécessaire d’ajouter l’extension Agroal qui est une dépendance de l’extension Hibernate ORM.

Une fois les extensions ajoutées, il faut configurer une datasource. Comme nous voulons utiliser le dev service pour PostgreSQL, nous configurerons une datasource avec le profil %prod car un dev service ne s’active...

Gestion de migration de base de données

1. Gestion de schéma avec Liquibase

Liquibase est un outil qui permet de définir dans un fichier XML, JSON, YAML ou SQL les changements à appliquer à un schéma de base de données.

Un des intérêts de Liquibase est qu’il permet de définir ces changements indépendamment de la base de données (sauf si le format SQL est choisi).

Vous pouvez ajouter l’extension Liquibase via :

  • la CLI Quarkus :

quarkus extension add liquibase 
  • le plugin Maven :

mvn quarkus:add-extension -Dextensions="liquibase" 

Ceci va ajouter la dépendance Maven suivante :

<dependency> 
  <groupId>io.quarkus</groupId> 
  <artifactId>quarkus-liquibase</artifactId> 
</dependency> 

Chaque changement à réaliser doit être défini dans un fichier change log. Par défaut, Liquibase va exécuter les changements du fichier db/changeLog.xml. Il est possible de changer la localisation du fichier via la propriété de configuration quarkus.liquibase.change-log.

Voici un exemple de fichier de changelog :

<?xml version="1.1" encoding="UTF-8" standalone="no"?> 
<databaseChangeLog> 
    <changeSet author="quarkus" id="1"> 
        <createTable...

Hibernate ORM

Quarkus permet l’accès aux bases de données relationnelles avec l’ORM (Object Relational Mapper) Hibernate.

Pour utiliser Hibernate, vous devez ajouter l’extension Hibernate ORM ainsi qu’un client JDBC. Étant donné que nous avons ajouté le driver JDBC pour PostgreSQL dans la section précédente, nous pouvons ici uniquement ajouter l’extension Hibernate ORM.

Vous pouvez ajouter l’extension Hibernate ORM via :

  • la CLI Quarkus :

quarkus extension add hibernate-orm 
  • le plugin Maven :

mvn quarkus:add-extension -Dextensions="hibernate-orm" 

Ceci va ajouter la dépendance Maven suivante :

<dependency> 
  <groupId>io.quarkus</groupId> 
  <artifactId>quarkus-hibernate-orm</artifactId> 
</dependency> 

Une fois la datasource configurée (voir la section Datasource et driver JDBC), on peut utiliser Hibernate ORM normalement en définissant des entités JPA (Java Persistence API) et en utilisant l’EntityManager d’Hibernate ORM. L’EntityManager peut être injecté comme une dépendance CDI.

Voici un exemple de service permettant de persister un produit dans une base de données avec Hibernate ORM :

@ApplicationScoped 
@Transactional 
public class ProductService { 
    @Inject 
    EntityManager entityManager; 
 
    public void save(Product product) { 
        entityManager.persist(product); 
    } 
} 

L’annotation @Transactional va créer une transaction encapsulant chaque méthode du service. Elle peut être mise au niveau des méthodes si vous ne souhaitez pas ouvrir de transaction pour certaines méthodes ; néanmoins, la définir au niveau du service est plus simple et limite les risques d’erreur.

Quarkus fournit une extension facilitant l’utilisation d’Hibernate ORM : Hibernate ORM with Panache.

C’est une surcouche à Hibernate ORM qui propose un ensemble de méthodes standards pour implémenter un DAO (Data Access Object) à partir d’une entité JPA.

Hibernate ORM with Panache propose deux patterns...

Gestion du cache

Quarkus permet la mise en cache du résultat d’une méthode via l’extension quarkus-cache. Celle-ci se base sur le framework de cache Caffeine.

Vous pouvez ajouter l’extension Cache via :

  • la CLI Quarkus :

quarkus extension add cache 
  • le plugin Maven :

mvn quarkus:add-extension -Dextensions="cache" 

Ceci va ajouter la dépendance Maven suivante :

<dependency> 
  <groupId>io.quarkus</groupId> 
  <artifactId>quarkus-cache</artifactId> 
</dependency> 

Pour mettre en cache le résultat d’une méthode, il faut annoter cette méthode avec @CacheResult.

Voici un exemple pour mettre en cache la liste des produits :

@GET 
@CacheResult(cacheName = "product-cache") 
public Collection<ProductEntity> list() { 
    return ProductEntity.listAll(); 
} 

Invalider une entrée de cache peut se faire via l’annotation @CacheInvalidate ; il faut que les paramètres de la méthode annotée avec @CacheInvalidate correspondent à ceux de la méthode annotée avec @CacheResult. Si ce n’est pas le cas, l’annotation @CacheKey permet de spécifier les paramètres de méthode à utiliser. Attention, dans tous les cas, les paramètres doivent se trouver dans le même ordre....

Bean validation

Quarkus permet la validation des paramètres de méthode via l’extension Hibernate Validator. Hibernate Validator est l’implémentation de référence de la spécification Jakarta Bean Validation (JSR 380). Cette spécification permet la validation d’un objet via un ensemble d’annotations.

Vous pouvez ajouter l’extension Hibernate Validator via :

  • la CLI Quarkus :

quarkus extension add hibernate-validator 
  • le plugin Maven :

mvn quarkus:add-extension -Dextensions="hibernate-validator" 

Ceci va ajouter la dépendance Maven suivante :

<dependency> 
  <groupId>io.quarkus</groupId> 
  <artifactId>quarkus-hibernate-validator</artifactId> 
</dependency> 

Nous allons utiliser Hibernate Validator pour valider que les champs name et description de l’objet ProductEntity sont bien présents lors de la création ou la modification de ce dernier, et pour vérifier que le champ name ne dépasse pas 50 caractères.

Tout d’abord, il faut annoter les champs avec les annotations bean validation ; ici nous allons utiliser @NotNull et @Size :

@Entity 
public class ProductEntity extends PanacheEntity { 
    @NotNull public String name; 
    @NotNull @Size(max = 50) public String description; 
} 

Ces annotations sont appelées...

NoSQL avec MongoDB

NoSQL décrit un type de base de données dont le langage de requêtage n’est pas le SQL (bien que certaines bases NoSQL le supportent dorénavant). On oppose les bases NoSQL aux bases de données relationnelles dont le langage de requêtage est le SQL. Les bases de données NoSQL ne supportent généralement pas les relations. Il existe de nombreuses solutions NoSQL, la plupart étant optimisées pour un cas d’utilisation précis.

Quarkus supporte un ensemble de bases de données NoSQL  : Cassandra, Neo4j, Elasticsearch, Redis, MongoDB, etc. Chacune s’intègre via une extension dédiée.

MongoDB est à ce jour la base de données NoSQL dont l’intégration dans Quarkus est la plus poussée. En plus d’une extension permettant l’utilisation du client MongoDB, Quarkus propose une extension MongoDB with Panache dont le but est de simplifier l’accès à la base de données via le pattern DAO. Cette extension est inspirée de l’extension Hibernate ORM with Panache.

MongoDB est une base de données NoSQL orientée document permettant de stocker des documents au format BSON (Binary JSON) dans une collection.

Vous pouvez ajouter l’extension MongoDB Client via :

  • la CLI Quarkus :

quarkus extension add mongodb-client 
  • le plugin Maven :

mvn quarkus:add-extension -Dextensions="mongodb-client" 

Ceci va ajouter la dépendance Maven suivante :

<dependency> 
  <groupId>io.quarkus</groupId> 
  <artifactId>quarkus-mongodb-client</artifactId> 
</dependency> 

Pour configurer la connexion à notre base MongoDB, il faut spécifier la propriété connection-string. Beaucoup d’autres options de configuration reflètent ce qu’il est possible de configurer lors de la création manuelle d’un objet MongoClient.

L’extension MongoDB fournit un dev service pour démarrer automatiquement une base de données MongoDB dans un conteneur pour les tests et en mode dev. Il va donc falloir configurer MongoDB avec le profil %prod pour permettre le fonctionnement de ce dev service :

%prod.quarkus.mongodb.connection-string=mongodb://localhost:27017 

Après cela, vous pouvez...