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 :

Ajout du driver MySQL dans le fichier pom.xml
<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

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