JDBC : la porte d'accès aux bases de données

Ce contenu est obsolète. Il peut contenir des informations intéressantes mais soyez prudent avec celles-ci.

Dans ce chapitre, nous ferons nos premiers pas avec Java DataBase Connectivity, communément appelé JDBC. Il s'agit en fait de classes Java permettant de se connecter et d'interagir avec des bases de données. Mais avant toute chose, il nous faut une base de données ! Nous allons donc nous pencher sur l'utilité d'une base de données et verrons comment en installer une que nous utiliserons afin d'illustrer la suite de cette partie.

Pour commencer, je pense qu'un petit rappel sur le fonctionnement des bases de données s'impose.

Rappels sur les bases de données

Lorsque vous réalisez un logiciel, un site web ou quelque chose d'autre, vous êtes confrontés tôt ou tard à cette question : « Comment vais-je procéder pour sauvegarder mes données ? Pourquoi ne pas tout stocker dans des fichiers ? »

Les bases de données (BDD) permettent de stocker des données. Mais concrètement, comment cela fonctionne-t-il ? En quelques mots, il s'agit d'un système de fichiers contenant les données de votre application. Cependant, ces fichiers sont totalement transparents pour l'utilisateur d'une base de données, donc totalement transparents pour vous ! La différence avec les fichiers classiques se trouve dans le fait que ce n'est pas vous qui les gérez : c'est votre BDD qui les organise, les range et, le cas échéant, vous retourne les informations qui y sont stockées. De plus, plusieurs utilisateurs peuvent accéder simultanément aux données dont ils ont besoin, sans compter que de nos jours, les applications sont amenées à traiter une grande quantité de données, le tout en réseau. Imaginez-vous gérer tout cela manuellement alors que les BDD le font automatiquement…

Les données sont ordonnées par « tables », c'est-à-dire par regroupements de plusieurs valeurs. C'est vous qui créerez vos propres tables, en spécifiant quelles données vous souhaiterez y intégrer. Une base de données peut être vue comme une gigantesque armoire à tiroirs dont vous spécifiez les noms et qui contiennent une multitude de fiches dont vous spécifiez aussi le contenu.

Je sais, un schéma est toujours le bienvenu, je vous invite donc à jeter un œil à la figure suivante.

Une BDD contenant deux tables

Dans cette base de données, nous trouvons deux tables : une dont le rôle est de stocker des informations relatives à des personnes (noms, prénoms et âges) ainsi qu'une autre qui s'occupe de stocker des pays, avec leur nom et leur capitale.

Si je reprends ma comparaison ci-dessus, la BDD symbolise l'armoire, chaque table représente un tiroir et chaque ligne de la table correspond à une fiche de ce tiroir ! De plus, ce qui est formidable avec les BDD, c'est que vous pouvez les interroger en leur posant des questions via un langage précis. Vous pouvez interroger votre base de données en lui donnant les instructions suivantes :

  • « Donne-moi la fiche de la table Personne pour le nom HERBY » ;
  • « Donne-moi la fiche de la table Pays pour le pays France » ;
  • etc.

Le langage permettant d'interroger des bases de données est le langage SQL (Structured Query Language ou, en français, « langage de requête structurée »). Grâce aux BDD, vos données sont stockées, classées par vos soins et identifiables facilement sans avoir à gérer votre propre système de fichiers.

Pour utiliser une BDD, vous avez besoin de deux éléments : la base de données et ce qu'on appelle le SGBD (Système de Gestion de Base de Données).

Cette partie ne s'intéresse pas au langage SQL. Vous pouvez cependant trouver un cours sur le Site du Zéro qui traite de MySQL, un SGBDR (« R » signifie « relationnelles ») qui utilise le langage SQL. Je vous invite à lire le chapitre sur l'insertion de données ainsi que le suivant sur la sélection de données.

Quelle base de données utiliser

Il existe plusieurs bases de données et toutes sont utilisées par beaucoup de développeurs. Voici une liste non exhaustive recensant les principales bases :

  • PostgreSQL ;
  • MySQL ;
  • SQL Server ;
  • Oracle ;
  • Access.

Toutes ces bases de données permettent d'effectuer les actions que je vous ai expliquées plus haut. Chacune possède des spécificités : certaines sont payantes (Oracle), d'autres sont plutôt permissives avec les données qu'elles contiennent (MySQL), d'autres encore sont dotées d'un système de gestion très simple à utiliser (MySQL), etc. C'est à vous de faire votre choix en regardant par exemple sur Internet ce qu'en disent les utilisateurs. Pour cette partie traitant des bases de données, mon choix s'est porté sur PostgreSQL qui est gratuit et complet.

Installation de PostgreSQL

Téléchargez une version de PostgreSQL pour Windows, Linux ou Mac OS X. Je vous invite à décompresser l'archive téléchargée et à exécuter le fichier.

À partir de maintenant, si je ne mentionne pas une fenêtre de l'assistant d'installation particulière, vous pouvez laisser les réglages par défaut.

L'installation commence et il vous est demandé votre langue : choisissez et validez. Vous serez invités, par la suite, à saisir un mot de passe pour l'utilisateur, comme à la figure suivante.

Choix du mot de passe

Un mot de passe vous sera également demandé pour le « superadministrateur » (voir figure suivante).

Choix du mot de passe pour le superutilisateur

À la fin de la préinstallation, vous aurez le choix d'exécuter ou non le « Stack Builder » ; ce n'est pas nécessaire, il permet juste d'installer d'autres logiciels en rapport avec PostgreSQL.

Le serveur est à présent installé : il doit en être de même pour le SGBD ! Pour vérifier que l'installation s'est bien déroulée, ouvrez le menu « Démarrer » et rendez-vous dans Tous les programmes (sous Windows) : l'encart PostgreSQL 8.3 (le numéro de version peut être plus récent) doit ressembler à la figure suivante.

Menu « Démarrer » avec PostgreSQL

Dans ce dossier, deux exécutables permettent respectivement de lancer et d'arrêter le serveur. Le dernier exécutable, « pgAdmin III », correspond à notre SGBD : lancez-le, nous allons configurer notre serveur. Dans le menu Fichier, choisissez Ajouter un serveur…, comme indiqué à la figure.

Ajout d'un serveur

Ce qui vous amène à la prochaine étape, représentée à la figure suivante.

Configuration du serveur

Voici à quoi correspondent ces paramètres :

  • Nom : correspond au nom de votre base de données.
  • Hôte : correspond à l'adresse du serveur sur le réseau ; ici, le serveur est situé sur votre ordinateur, écrivez donc « localhost ».
  • Vous n'avez normalement pas besoin de modifier le port ; dans le cas contraire, insérez la valeur qui figure sur l'image, à savoir 5432.
  • Entrez enfin le nom de l'utilisateur et le mot de passe.

Vous devriez maintenant avoir la figure suivante devant les yeux.

Votre première base de données

Nous reviendrons sur tout cela, mais vous pouvez observer que votre serveur, nommé « SDZ », possède une base de données appelée « postgres » ne contenant aucune table. Nous allons maintenant apprendre à créer une base, des tables et surtout faire un bref rappel sur ce fameux langage SQL.

Préparer la base de données

Vous êtes à présent connectés à votre BDD préférée.

Premièrement, les bases de données servent à stocker des informations ; ça, vous le savez. Mais ce que vous ignorez peut-être, c'est que pour ranger correctement nos informations, nous devrons les analyser… Ce chapitre n'a pas pour objectif de traiter de l'analyse combinée avec des diagrammes entités - associations (dans le jargon, cela désigne ce dont on se sert pour créer des BDD, c'est-à-dire pour organiser les informations des tables et de leur contenu)… Nous nous contenterons de poser un thème et d'agir comme si nous connaissions tout cela !

Pour notre base de données, nous allons donc gérer une école dont voici les caractéristiques :

  • cette école est composée de classes ;
  • chaque classe est composée d'élèves ;
  • à chaque classe est attribué un professeur pour chacune des matières dispensées ;
  • un professeur peut enseigner plusieurs matières et exercer ses fonctions dans plusieurs classes.

Vous vous rendez compte qu'il y a beaucoup d'informations à gérer. En théorie, nous devrions établir un dictionnaire des données, vérifier à qui appartient quelle donnée, poursuivre avec une modélisation à la façon MCD (Modèle Conceptuel de Données) et simplifier le tout selon certaines règles, pour terminer avec un MPD (Modèle Physique de Données). Nous raccourcirons le processus : je vous fournis à la figure suivante un modèle tout prêt que je vous expliquerai tout de même.

Modèle de notre BDD

Tous ces éléments correspondent à nos futures tables ; les attributs qui s'y trouvent se nomment des « champs ». Tous les acteurs mentionnés figurent dans ce schéma (classe, professeur, élève…). Vous constatez que chaque acteur possède un attribut nommé « id » correspondant à son identifiant : c'est un champ de type entier qui s'incrémentera à chaque nouvelle entrée ; c'est également grâce à ce champ que nous pouvons créer des liens entre les acteurs.

Vous devez savoir que les flèches du schéma signifient « a un » ; de ce fait, un élève « a une » classe.

Certaines tables contiennent un champ se terminant par « _k ». Quelques-unes de ces tables possèdent deux champs de cette nature, pour une raison très simple : parce que nous avons décidé qu'un professeur pouvait enseigner plusieurs matières, nous avons alors besoin de ce qu'on appelle une « table de jointures ». Ainsi, nous pouvons spécifier que tel professeur enseigne telle ou telle matière et qu'une association professeur/matière est assignée à une classe. Ces liens se feront par les identifiants (id).

De plus - il est difficile de ne pas avoir remarqué cela - chaque champ possède un type (int, double, date, boolean…). Nous savons maintenant tout ce qui est nécessaire pour construire notre BDD !

Créer la base de données

Pour cette opération, rien de plus simple : pgAdmin met à notre disposition un outil qui facilite la création de bases de données et de tables (exécuter tout cela à la main avec SQL, c'est un peu fastidieux). Pour créer une nouvelle base de données, effectuez un clic droit sur Bases de données, comme àa la figure suivante.

Ajouter une BDD

Le pop-up correspondant à la figure suivante s'affiche alors.

Créer les caractéristiques

Renseignez le nom de la base de données (« Ecole » dans notre cas) et choisissez l'encodage UTF-8. Cet encodage correspond à un jeu de caractères étendu qui autorise les caractères spéciaux. Une fois cela fait, vous devriez obtenir quelque chose de similaire à la figure suivante.

Première BDD

Vous pouvez désormais voir la nouvelle base de données ainsi que le script SQL permettant de la créer. Il ne nous reste plus qu'à créer les tables à l'aide du bon type de données…

Créer les tables

Nous allons maintenant nous attaquer à la création de nos tables afin de pouvoir travailler correctement. Je vous expliquerai comment créer une table simple pour vous donner une idée du principe ; je fournirai aux plus fainéants le script SQL qui finira la création des tables.

Commençons par la table classe, étant donné que c'est l'une des tables qui n'a aucun lien avec une autre. La procédure est la même que précédemment : il vous suffit d'effectuer un clic droit sur Tables cette fois, comme le montre la figure suivante.

Ajouter une table

Ensuite, PostgreSQL vous demande des informations sur la future table :

  • son nom ;
  • le nom de ses champs ;
  • le type de ses champs ;
  • ainsi que d'autres éléments.

La figure suivante désigne l'endroit où vous devez renseigner le nom de la table.

Nommer la table

Ajoutez ensuite les champs, comme le montrent les deux figures suivantes (j'ai ajouté des préfixes aux champs pour qu'il n'y ait pas d'ambiguïté dans les requêtes SQL).

Ajout d'une colonne à la table

Ajout de la colonne cls_id

Le champ cls_id est de type serial afin qu'il utilise une séquence (le champ s'incrémente ainsi automatiquement). Nous allons aussi lui ajouter une contrainte de clé primaire.

Placez donc maintenant la contrainte de clé primaire sur votre identifiant, comme représenté à la figure suivante.

Ajout d'une contrainte de clé primaire

Cliquez sur « Ajouter ». Choisissez la colonne cls_id et cliquez sur « Ajouter ». Validez ensuite le tout (figure suivante).

Ajout d'une contrainte

Vous avez vu comment créer une table avec PostgreSQL, mais je ne vais pas vous demander de le faire pour chacune d'entre elles, je ne suis pas méchant à ce point. Vous n'allez donc pas créer toutes les tables et tous les champs de cette manière, puisque cet ouvrage a pour but de vous apprendre à utiliser les BDD avec Java, pas avec le SGBD… Je vous invite donc à télécharger une archive .zip contenant le script SQL de création des tables restantes ainsi que de leur contenu.

Une fois le dossier décompressé, il ne vous reste plus qu'à ouvrir le fichier avec PostgreSQL en vous rendant dans l'éditeur de requêtes SQL, comme indiqué à la figure suivante.

Icône d'ouverture de l'éditeur de requêtes

Vous pouvez à présent ouvrir le fichier que je vous ai fourni en cliquant sur Fichier > Ouvrir puis choisir le fichier .sql. Exécutez la requête en appuyant sur F5 ou dirigez-vous vers le menu Requête et choisissez l'action Exécuter. Fermez l'éditeur de requêtes.

Votre base est maintenant entièrement créée, et en plus elle contient des données !

Se connecter à la base de données

Beaucoup de choses se passent entre pgAdmin et PostgreSQL (les termes « PostgreSQL » et « Postgres » sont souvent indifféremment utilisés) ! En effet, le premier est un programme qui établit une connexion avec la BDD afin qu'ils puissent communiquer. Cela peut se schématiser par la figure suivante.

Communication entre le SGBD et la BDD

Ceux d'entre vous qui ont déjà installé une imprimante savent que leur machine a besoin d'un driver (appelé aussi pilote, c'est une sorte de mode d'emploi utilisé par l'ordinateur) pour que la communication puisse s'effectuer entre les deux acteurs. Ici, c'est la même chose : pgAdmin utilise un driver pour se connecter à la base de données. Étant donné que les personnes qui ont développé les deux logiciels travaillent main dans la main, il n'y aura pas de problème de communication ; mais qu'en sera-t-il pour Java ?

En fait, avec Java, vous aurez besoin de drivers, mais pas sous n'importe quelle forme : pour vous connecter à une base de données, il vous faut un fichier .jar qui correspond au fameux pilote et qui contient tout ce dont vous aurez besoin pour vous connecter à une base PostgreSQL.

Cela signifie-t-il qu'il existe un fichier .jar par SGBD ?

Tout à fait, il existe un fichier .jar pour se connecter à :

  • MySQL ;
  • SQL Server ;
  • Oracle ;
  • d'autres bases.

Un bémol toutefois : vous pouvez aussi vous connecter à une BDD en utilisant les pilotes ODBC (Open DataBase Connectivity) présents dans Windows. Cela nécessite cependant d'installer les pilotes dans Windows et de les paramétrer dans les sources de données ODBC pour, par la suite, utiliser ces pilotes ODBC afin de se connecter à la BDD dans un programme Java. Je ne parlerai donc pas de cette méthode puisqu'elle ne fonctionne que pour Windows.

Pour trouver le driver JDBC qu'il vous faut, une rapide recherche à l'aide de votre moteur de recherche répondra à vos attentes, comme indiqué à la figure suivante.

Recherche des pilotes JDBC pour PostgreSQL

Sur la page de téléchargement des pilotes pour PostgreSQL, choisissez la dernière version disponible ; pour ma part, j'ai opté pour la version JDBC4. La version JDBC4 offre des nouveautés et une souplesse d'utilisation accrue de JDBC, mais vous devez savoir qu'il existe trois autres types de drivers JDBC ; au total, il en existe donc quatre :

  • des drivers JDBC de type 1 : JDBC-ODBC, ce type utilise l'interface ODBC pour se connecter à une base de données (on en a déjà parlé) ; au niveau de la portabilité, on trouve mieux ;
  • des drivers JDBC de type 2 : ils intègrent les pilotes natifs et les pilotes Java ; en fait, la partie Java traduit les instructions en natif afin d'être comprises et interprétées par les pilotes natifs ;
  • des drivers JDBC de type 3 : écrit entièrement en Java, ce type convertit les appels en un langage totalement indépendant du SGBD ; un serveur intégré traduit ensuite les instructions dans le langage souhaité par le SGBD ;
  • des drivers JDBC de type 4 : des pilotes convertissant directement les appels JDBC en instructions compréhensibles par le SGBD ; ce type de drivers est codé et proposé par les éditeurs de BDD.

Téléchargez donc le fichier .jar dans la rubrique Download du site dédié : http://jdbc.postgresql.org. Nous nous pencherons bientôt sur son utilisation, mais une question se pose encore : où placer l'archive ? Vous avez deux solutions :

  • l'inclure dans votre projet et l'ajouter au CLASSPATH ;
  • la placer dans le dossier lib/ext présent dans le dossier d'installation du JRE.

Le tout est de savoir si votre application est vouée à être exportée sur différents postes ; dans ce cas, l'approche CLASSPATH est la plus judicieuse (sinon, il faudra ajouter l'archive dans tous les JRE…). En ce qui nous concerne, nous utiliserons la deuxième méthode afin de ne pas surcharger nos projets. Je vous laisse donc placer l'archive téléchargée dans le dossier susmentionné.

Connexion

La base de données est prête, les tables sont créées, remplies et nous possédons le driver nécessaire ! Il ne nous reste plus qu'à nous connecter. Créons un nouveau projet dans Eclipse avec une classe contenant une méthode public static void main(String[] args). Voici le code source permettant la connexion :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
//CTRL + SHIFT + O pour générer les imports
public class Connect {
  public static void main(String[] args) {      
    try {
      Class.forName("org.postgresql.Driver");
      System.out.println("Driver O.K.");

      String url = "jdbc:postgresql://localhost:5432/Ecole";
      String user = "postgres";
      String passwd = "postgres";

      Connection conn = DriverManager.getConnection(url, user, passwd);
      System.out.println("Connexion effective !");         

    } catch (Exception e) {
      e.printStackTrace();
    }      
  }
}

Dans un premier temps, nous avons créé une instance de l'objet Driver présent dans le fichier .jar que nous avons téléchargé. Il est inutile de créer une véritable instance de ce type d'objet ; j'entends par là que l'instruction org.postgres.Driver driver = new org.postgres.Driver() n'est pas nécessaire. Nous utilisons alors la réflexivité afin d'instancier cet objet.

À ce stade, il existe comme un pont entre votre programme Java et votre BDD, mais le trafic routier n'y est pas encore autorisé : il faut qu'une connexion soit effective afin que le programme et la base de données puissent communiquer. Cela se réalise grâce à cette ligne de code :

1
Connection conn = DriverManager.getConnection(url, user, passwd);

Nous avons défini au préalable trois String contenant respectivement :

  • l'URL de connexion ;
  • le nom de l'utilisateur ;
  • le mot de passe utilisateur.

L'URL de connexion est indispensable à Java pour se connecter à n'importe quelle BDD. La figure suivante illustre la manière dont se décompose cette URL.

URL de connexion à une BDD via JDBC

Le premier bloc correspond au début de l'URL de connexion, qui commence toujours par jdbc:. Dans notre cas, nous utilisons PostgreSQL, la dénomination postgresql: suit donc le début de l'URL. Si vous utilisez une source de données ODBC, il faut écrire jdbc:odbc:. En fait, cela dépend du pilote JDBC et permet à Java de savoir quel pilote utiliser.

Dans le deuxième bloc se trouve la localisation de la machine physique sur le réseau ; ici, nous travaillons en local, nous utilisons donc //localhost:5432. En effet, le nom de la machine physique est suivi du numéro de port utilisé.

Enfin, dans le dernier bloc, pour ceux qui ne l'auraient pas deviné, il s'agit du nom de notre base de données.

Les informations des deux derniers blocs dépendent du pilote JDBC utilisé. Pour en savoir plus, consultez sa documentation.

En exécutant ce code, vous obtiendrez le résultat affiché à la figure suivante.

Connexion effective

Cette procédure lève une exception en cas de problème (mot de passe invalide…).

L'avantage d'utiliser les fichiers .jar comme drivers de connexion est que vous n'êtes pas tenus d'initialiser le driver par une méthode telle que la réflexivité, tout se passe dans Java. Puisqu'un rappel du protocole à utiliser est présent dans l'URL de connexion, tout est optimal et Java s'en sort tout seul ! Ne vous étonnez donc pas si vous ne voyez plus l'instruction Class.forName("org.postgresql.Driver") par la suite.


  • « JDBC » signifie « Java DataBase Connectivity ».
  • JDBC permet à des programmes Java de communiquer avec des bases de données.
  • Une base de données est un système de fichiers stockant des informations regroupées dans des tables.
  • Vous pouvez interroger une base de données grâce au langage SQL.
  • Il existe plusieurs types de drivers JDBC à utiliser selon la façon dont vous souhaitez vous connecter à la BDD.
  • Pour vous connecter à votre BDD, vous devez utiliser l'objet Connection fourni par l'objet DriverManager.
  • Celui-ci prend en paramètre une URL de connexion permettant d'identifier le type de base de données, l'adresse du serveur et le nom de la base à interroger, en plus du nom d'utilisateur et du mot de passe de connexion.
  • Si une erreur survient pendant la connexion, une exception est levée.