Les ORM (Object-Relational Mapping)¶
Les ORM sont des frameworks qui, comme l’indique leur nom, permettent de créer une correspondance entre un modèle objet et un modèle relationnel de base de données. Un ORM fournit généralement les fonctionnalités suivantes :
génération à la volée des requêtes SQL les plus simples (CRUD)
prise en charge des dépendances entre objets pour la mise en jour en cascade de la base de données
support pour la construction de requêtes complexes par programmation
Java EE fournit une API standard pour l’utilisation d’un ORM : JPA (Java Persistence API) (la JSR-338). Il existe plusieurs implémentations open source qui respectent l’API JPA : EclipseLink (qui est aussi l’implémentation de référence), Hibernate (JBoss - Red Hat), OpenJPA (Apache).
Note
Pour ce cours, nous utiliserons comme exemple l’implémentation fournie par Hibernate. À version identique, le code présenté devrait être compatible avec les autres implémentations de JPA.
JDBC (Java Database Connectivity)¶
Toutes les implémentations des ORM en Java sont basées sur JDBC. JDBC (Java DataBase Connectivity) est l’API standard pour interagir avec les bases données relationnelles en Java. JDBC fait partie de l’édition standard et est donc disponible directement dans le JDK. JDBC est une API de bas niveau. Cela signifie que l’on peut réaliser une application avec toutes les fonctionnalités nécessaires pour l’interaction avec une base de données mais au prix de l’écriture d’un grand nombre de lignes de code (parfois complexes).
Pour utiliser un ORM en Java, nous aurons simplement besoin de comprendre comment configurer une application utilisant JDBC.
Le pilote de base de données¶
JDBC est une API indépendante de la base de données sous-jacente. D’un côté, les développeurs implémentent les interactions avec une base de données à partir de cette API. D’un autre côté, chaque fournisseur de SGBDR livre sa propre implémentation d’un pilote JDBC (JDBC driver). Pour pouvoir se connecter à une base de données, il faut simplement ajouter le driver (qui se présente sous la forme d’un fichier jar) dans le classpath lors de l’exécution du programme.
Des pilotes JDBC sont disponibles pour les SGBDR les plus utilisés : Oracle DB, MySQL, PostgreSQL, Apache Derby, SQLServer, SQLite, HSQLDB (HyperSQL DataBase)…
Pour un projet géré par Maven, le pilote JDBC est une dépendance logicielle comme une autre. Pour l’intégrer dans le livrable, il suffit de le déclarer dans le fichier pom.xml dans la section dependencies :
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
On peut rechercher le pilote souhaité sur le site du Maven Repository.
Prudence
pour des raisons de licence, certains pilotes JDBC ne sont pas disponibles dans les référentiels Maven. C’est le cas notamment du pilote JDBC pour Oracle.
L’URL de connexion et la classe des pilotes¶
Pour établir une connexion, nous avons besoin de connaître la classe du pilote et l’URL de connexion à la base de données. Il n’existe pas vraiment de règle en la matière puisque chaque fournisseur de pilote décide du nom de la classe et du format de l’URL. Le tableau suivant donne les informations nécessaires suivant le SGBDR :
SGBDR |
Nom de la classe du pilote |
Format de l’URL de connexion |
---|---|---|
Oracle DB |
oracle.jdbc.OracleDriver |
|
MySQL <= 5.1 |
com.mysql.jdbc.Driver |
|
MySQL >= 8 |
com.mysql.cj.jdbc.Driver |
|
MariaDB |
org.mariadb.jdbc.Driver |
|
PosgreSQL |
org.postgresql.Driver |
|
HSQLDB (mode fichier) |
org.hsqldb.jdbcDriver |
jdbc:hsqldb:file:[chemin du fichier]
|
HSQLDB (mode mémoire) |
org.hsqldb.jdbcDriver |
Note
Pour MySQL >= 8, il est parfois nécessaire de préciser le fuseau horaire
à utiliser par le serveur en passant le paramètre serverTimezone
dans
l’URI de connexion :
jdbc:mysql://localhost:3306/maBase?serverTimezone=GMT