Cours "Modèles pour la persistance des objets"

JDBC de base


Objectif du TP :

JDBC est l'API de base pour la persistance des données d'un programme Java dans une base de données relationnelle. Ce TP étudie les bases de l'utilisation de cette API.

Support de cours

Révision SQL : des TPs, support de cours


Installation de l'environnement

Tout d'abord vous devez installer la base de données des employés d'une entreprise qui sera utilisée pendant ce TP.

Cette base très simple contient 2 tables :

Un employé ne peut appartenir qu'à un seul département.

L'installation est décrite ici.


Pour apprendre les bases de l'API JDBC, ce TP utilise le modèle "procédural" (pas de réel modèle objet dans l'application Java ; appels JDBC de la couche client qui travaillent directement avec les tables de la base de données) pour travailler avec une base de données préexistante. Dans les TPs suivants on s'appuiera sur un modèle objet implémenté avec des classes Java, avec une structure des tables de la base de données déduite de ce modèle objet.


Etude d'un exemple

  1. Créez un nouveau projet Netbeans nommé tpjdbc, sans classe principale.
  2. Démarrez Java DB si ça n'est déjà fait (il suffit de se connecter à la base employes dans l'onglet Services).
  3. Il faut ajouter la librairie pour Java DB. Pour cela, allez dans le volet du projet à gauche. Il y a une entrée "Libraries". Clic bouton droit sur cette entrée et "Add Libraries...". Normalement la librairie pour le driver JDBC de Java DB devrait apparaître et vous la choisissez.
    Si elle n'apparaît pas (un bug sur certaines versions de Netbeans), il faut aller chercher le fichier jar qui contient le driver. Après avoir choisi "Add Libraries...", cliquez sur le bouton "Create..." à droite de la fenêtre "Add Library". Nom de la librairie : Driver Java DB", puis clic sur OK. Une nouvelle fenêtre s'affiche ; cliquez sur le bouton "Add Jar/Folder..." et allez chercher le fichier derbyclient.jar dans le répertoire d'installation de GlassFish qui a été installé avec NetBeans (par exemple dans C:\Program Files\glassfish-3.1.2.2\javadb\lib\derbyclient.jar). Si vous ne trouvez pas, voici un driver (peut-être pas à jour lorsque vous lirez cet exercice...) que vous placez dans un répertoire et que vous désignez comme le jar à ajouter. Il vaut mieux ajouter une librairie que d'ajouter directement le jar car vous pourrez ainsi la réutiliser plus facilement dans d'autres projets.
  4. Étudiez la classe Test1.java et copiez-la dans le projet. Modifiez-la pour avoir une connexion à la base que vous venez de créer. Ajoutez la fermeture des ressources JDBC (Statement et Connection). Mettez-la en classe principale du projet et exécutez le projet.
  5. Modifiez l'ordre SQL pour avoir le nom et le nombre d'employés de chacun des départements. Vous avez oublié comment faire en SQL ? Évidemment, il faudra enlever les instructions qui font afficher les détails sur les employés.

Correction

Test1.java

Test1.java avec fermeture automatique des ressources (nécessite le JDK 7)


Utiliser un fichier de propriétés pour se connecter

Pour améliorer la portabilité de vos programmes, il est conseillé de ne pas écrire "en dur" dans le programme les informations nécessaires à la connexion. Ces informations peuvent être incluses dans un fichier de propriétés. On peut ainsi modifier ces informations sans recompiler les classes qui les utilisent. Attention à ne pas mettre d'espaces en fin de ligne dans le fichier de propriétés : ils seraient inclus dans les valeurs des propriétés.

Un fichier de propriétés a le format suivant :

prop1 = val1
prop2 = val2 

Étudiez la classe ConfigConnection (nécessite le JDK 7) et modifiez votre programme de l'exercice précédent pour l'utiliser.

Correction

Test2.java
Fichier de propriétés


Modification des données

Avant de lancer chaque classe Java, visualisez directement les données qui devraient changer (volet Services) et vérifiez que les modifications ont bien été effectuées par le programme Java.

  1. Écrivez un programme Java qui ajoute un employé. Vous devez enlever le mode "autocommit" qui lance un commit automatique après chaque requête.
    Remarque : certains driver font un commit automatique lors de le fermeture de la connexion. Ne vous appuyez pas sur ce fait car d'autres drivers ou même une version future du driver peuvent avoir un comportement différent. Il faut donc toujours lancer un commit ou un rollback explicite à la fin de la session de travail si des données ont été modifiées.
  2. Ce programme augmente aussi de 10 % le salaire des employés qui ont les 3 plus petits salaires. Indications.

Correction

TestModif.java


Méta-données

Écrivez une classe Meta.java qui utilise les "meta données" pour afficher les noms des colonnes et le nom du type de données qu'elles contiennent pour l'ordre SQL "SELECT * FROM emp"
Essayez ensuite l'ordre "SELECT matr, substr(nomE,1,3), sal + coalesce(comm,0) GAIN FROM emp".

Correction

Meta.java


Transaction

Transfert de commission : écrivez une méthode pour transférer une commission d'un employé ("source") à un autre employé ("destination"). La méthode prend en paramètre les matricules des 2 employés. Vous utiliserez la notion de transaction pour, par exemple, remettre la commission à l'employé "source" s'il est impossible d'ajouter la commission à l'employé "destination".

Décomposez cette opération : lecture de la commission de l'employé "source", puis mise à NULL de cette commission, puis modification de la commission de l'employé "destination". Le but de cet exercice est de simuler une opération complexe comportant plusieurs ordres SQL.

Prévoyez les cas particuliers : l'employé "source" n'a pas de commission, un matricule d'employé n'existe pas, etc. Si l'employé destination a déjà une commission, la commision de l'employé source est ajoutée à sa commision.

Pour éviter les mises à jour perdues entre la lecture de la commission de l'employé "source" et la mise à NULL de cette commission, effectuez un blocage pessimiste de cet employé ( avec un "select for update").

Pour simplifier le test de votre programme, passez les matricules des 2 employés concernés en paramètres de la ligne de commande java.

Voici un squelette de classe que vous pouvez utiliser si vous le souhaitez.

Correction

Transaction.java


Pour ceux qui ont déjà fini :

Requêtes paramétrées

Utilisez des requêtes paramétrées pour

  1. afficher les noms, les numéros de département, les salaires et les commissions des employés du département 10, en utilisant 1 paramètre pour le numéro de département ; vous afficherez "Pas de commissions" si un employé a une commission null.
  2. augmenter de 15,5 % tous les employés du département 10, en utilisant 2 paramètres pour le pourcentage d'augmentation (ici 15,5) et le numéro de département.
  3. afficher à nouveau les noms, les numéros de département, les salaires et les commissions des employés du département 10.
  4. afficher les noms, les numéros de département, les salaires et les commissions des employés du département dont le total des salaires est le plus grand.

Ces modifications peuvent être faites en un seul ordre SQL mais pour les besoins de l'exercice, récupérez d'abord le numéro du département et ensuite utilisez la requête paramétrée du 1. pour faire afficher les informations demandées

Correction

Test3.java


Retour