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 :
- DEPT pour les départements de l'entreprise ;
- EMP pour les employés de l'entreprise.
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
- Créez un nouveau projet Netbeans nommé tpjdbc, sans classe principale.
- Démarrez Java DB si ça n'est déjà fait (il suffit de se connecter à la base employes dans l'onglet Services).
- 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.
- É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.
- 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.
- É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.
- 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
- 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.
- 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.
- afficher à nouveau les noms, les numéros de département,
les salaires et les commissions des employés du département
10.
- 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