Introduction à Spring Data JDBC

1. Vue d'ensemble

Spring Data JDBC est un cadre de persistance qui n'est pas aussi complexe que Spring Data JPA. Il ne fournit pas de cache, de chargement différé, d'écriture différée ou de nombreuses autres fonctionnalités de JPA. Néanmoins, il possède son propre ORM et fournit la plupart des fonctionnalités que nous utilisons avec Spring Data JPA, telles que les entités mappées, les référentiels, les annotations de requête et JdbcTemplate .

Une chose importante à garder à l'esprit est que Spring Data JDBC n'offre pas de génération de schéma . En conséquence, nous sommes responsables de la création explicite du schéma.

2. Ajout de Spring Data JDBC au projet

Spring Data JDBC est disponible pour les applications Spring Boot avec le démarreur de dépendance JDBC. Ce démarreur de dépendance n'apporte cependant pas le pilote de base de données . Cette décision doit être prise par le développeur. Ajoutons le démarreur de dépendance pour Spring Data JPA:

 org.springframework.boot spring-boot-starter-data-jdbc  

Dans cet exemple, nous utilisons la base de données H2. Comme nous l'avons mentionné précédemment, Spring Data JDBC n'offre pas de génération de schéma. Dans un tel cas, nous pouvons créer un fichier schema.sql personnalisé qui contiendra les commandes SQL DDL pour créer les objets de schéma. Automatiquement, Spring Boot choisira ce fichier et l'utilisera pour créer des objets de base de données.

3. Ajout d'entités

Comme pour les autres projets Spring Data, nous utilisons des annotations pour mapper les POJO avec des tables de base de données. Dans Spring Data JDBC, l'entité doit avoir un @Id . Spring Data JDBC utilise l' annotation @Id pour identifier les entités.

Semblable à Spring Data JPA, Spring Data JDBC utilise, par défaut, une stratégie de dénomination qui mappe les entités Java aux tables de base de données relationnelle et les attributs aux noms de colonnes. Par défaut, les noms de cas Camel des entités et des attributs sont mappés aux noms de cas de serpent des tables et des colonnes, respectivement. Par exemple, une entité Java nommée AddressBook est mappée à une table de base de données nommée address_book .

De plus, nous pouvons mapper explicitement des entités et des attributs avec des tables et des colonnes en utilisant les annotations @Table et @Column . Par exemple, ci-dessous, nous avons défini l'entité que nous allons utiliser dans cet exemple:

public class Person { @Id private long id; private String firstName; private String lastName; // constructors, getters, setters }

Nous n'avons pas besoin d'utiliser l'annotation @Table ou @Column dans la classe Person . La stratégie de dénomination par défaut de Spring Data JDBC effectue tous les mappages implicitement entre l'entité et la table.

4. Déclaration des référentiels JDBC

Spring Data JDBC utilise une syntaxe similaire à Spring Data JPA. Nous pouvons créer un référentiel Spring Data JDBC en étendant l' interface Repository , CrudRepository ou PagingAndSortingRepository . En implémentant CrudRepository , nous recevons l'implémentation des méthodes les plus couramment utilisées telles que save , delete et findById , entre autres.

Créons un référentiel JDBC que nous allons utiliser dans notre exemple:

@Repository public interface PersonRepository extends CrudRepository { }

Si nous avons besoin de fonctionnalités de pagination et de tri, le meilleur choix serait d'étendre l' interface PagingAndSortingRepository .

5. Personnalisation des référentiels JDBC

Malgré les méthodes intégrées de CrudRepository , nous devons créer nos méthodes pour des cas spécifiques. Une chose importante à noter est que Spring Data JDBC ne prend pas en charge les requêtes dérivées . Cela signifie que nous ne pouvons pas simplement écrire le nom de la méthode et nous attendre à ce que Spring Data JDBC génère la requête.

Chaque fois que nous écrivons une méthode personnalisée, nous devons la décorer avec l' annotation @Query . Dans l' annotation @Query , nous ajoutons notre commande SQL. Dans Spring Data JDBC, nous écrivons des requêtes en SQL brut. Nous n'utilisons aucun langage de requête de niveau supérieur comme JPQL. En conséquence, l'application est étroitement associée au fournisseur de base de données.

Pour cette raison, il devient également plus difficile de passer à une autre base de données.

Une autre différence importante est que Spring Data JDBC ne prend pas en charge le référencement de paramètres avec des numéros d'index . Dans cette version de Spring Data JDBC, nous ne pouvons référencer les paramètres que par leur nom .

Avec l' annotation @Modifying , nous pouvons annoter les méthodes de requête qui modifient l'entité.

Personnalisons maintenant notre PersonRepository avec une requête non modificatrice et une requête modificatrice:

@Repository public interface PersonRepository extends CrudRepository { @Query("select * from person where first_name=:firstName") List findByFirstName(@Param("firstName") String firstName); @Modifying @Query("UPDATE person SET first_name = :name WHERE id = :id") boolean updateByFirstName(@Param("id") Long id, @Param("name") String name); }

6. Remplissage de la base de données

Enfin, nous devons remplir la base de données avec des données qui serviront à tester le référentiel Spring Data JDBC que nous avons créé ci-dessus. Nous allons donc créer un semoir de base de données qui insérera des données factices. Ajoutons l'implémentation du semoir de base de données pour cet exemple:

@Component public class DatabaseSeeder { @Autowired private JdbcTemplate jdbcTemplate; public void insertData() { jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Victor', 'Hugo')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Dante', 'Alighieri')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Stefan', 'Zweig')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Oscar', 'Wilde')"); } }

Comme vu ci-dessus, nous utilisons Spring JDBC pour exécuter les instructions INSERT . En particulier, Spring JDBC gère la connexion avec la base de données et nous permet d'exécuter des commandes SQL à l'aide de JdbcTemplate s. Cette solution est très flexible car nous avons un contrôle total sur les requêtes exécutées.

7. Conclusion

Pour résumer, Spring Data JDBC offre une solution aussi simple que d'utiliser Spring JDBC - il n'y a pas de magie derrière cela. Néanmoins, il offre également une majorité de fonctionnalités auxquelles nous sommes habitués avec Spring Data JPA.

L'un des principaux avantages de Spring Data JDBC est l'amélioration des performances lors de l'accès à la base de données par rapport à Spring Data JPA. Cela est dû au fait que Spring Data JDBC communique directement avec la base de données . Spring Data JDBC ne contient pas l'essentiel de la magie Spring Data lors de l'interrogation de la base de données .

L'un des plus gros inconvénients lors de l'utilisation de Spring Data JDBC est la dépendance vis-à-vis du fournisseur de base de données. Si nous décidons de changer la base de données de MySQL à Oracle, nous pourrions avoir à faire face à des problèmes provenant de bases de données ayant différents dialectes .

L'implémentation de ce didacticiel Spring Data JDBC est disponible sur GitHub.