Ceci est une ancienne révision du document !
Table des matières
TME 8 JDBC (H2)
En construction
Consulter la brève introduction à JDBC vue en cours pdf
L'objectif de ce TME est d'utiliser l'interface JDBC pour interroger la Base de Données tennis à partir d'un programme java. Il vous sera demandé de compléter des squelettes de classes java dans le but de vous connecter au SGBD H2 et d'envoyer des requêtes. Pour ce TME, on utilisera la base Tennis dont le schéma est rappelé ci-dessous.
- JOUEUR(NUJOUEUR, NOM, PRENOM, ANNAISS, NATIONALITE)
- GAIN(NUJOUEUR, LIEUTOURNOI, ANNEE, PRIME, SPONSOR)
- RENCONTRE(NUGAGNANT, NUPERDANT, LIEUTOURNOI, ANNEE)
Les attributs NuGagnant, NuPerdant et NuJoueur sont définis sur le même domaine. Les clés des relations sont soulignées.
Premiers pas en JDBC
Le package JDBC permet d'accéder au SGBD depuis une application écrite en langage java. Consulter la documentation officielle. Notamment le lien suivant qui explique comment utiliser une ResultSet https://docs.oracle.com/cd/E11882_01/java.112/e16548/getsta.htm#JJDBC28066
La réalisation de ce TME nécessite des connaissances de base en compilation de programmes Java.
Pour compiler un fichier source Fichier.java en utilisant une librairie externe lib.jar taper
javac -cp lib.jar: Fichier.java
Cette commande va créer un binaire appelé Fichier.class. Pour exécuter le programme taper
java -cp lib.jar: Fichier
Remarques
- Afin d'éviter les erreurs de compilation dues à l'utilisation de caractères accentués dans les fichiers sources, compiler ces derniers en tapant
javac -encoding UTF-8 Fichier.java
- Les étudiants souhaitant utiliser l'IDE Eclipse peuvent se réferer à la rubrique Configuration d'Eclipse à la fin de la page. A défaut, utiliser un éditeur texte qui reconnait la syntaxe Java (tel que emacs).
Préparation du TME
Télécharger et l'archive contenant les sources en tapant
tar xzf TMEJDBC-H2.tgz cd TMEJDBC-H2
Lancer le serveur en tapant
java -cp h2-1.4.200.jar org.h2.tools.Server -tcp -tcpPort 9093 &
Chargement des données
Pour charger les données, taper les commandes suivantes :
java -cp h2*.jar org.h2.tools.RunScript -url jdbc:h2:~/test -script creations.sql java -cp h2*.jar org.h2.tools.RunScript -url jdbc:h2:~/test -script insertions.sql
Tester la connexion JDBC
Tout le long du TME, vous utiliserez le fichier Tmejdbc.java pour lancer vos programmes.
Compiler puis exécuter Tmejdbc.java en tapant
javac -cp h2-1.4.200.jar: Tmejdbc.java java -cp h2-1.4.200.jar: Tmejdbc
Vous devriez voir s'afficher dans la console le message suivant :
Driver JDBC H2 reconnu! Les tables du compte sont : -GAIN -JOUEUR -RENCONTRE
Exercice 1 : Requêtes fixes
Le but de cet exercice est d'exécuter, via JDBC, des requêtes codées en dur, i.e où les valeurs de prédicats sont définies dans le code source. A chaque question correspond un fichier source qu'il vous faudra éditer en conséquence puis instancier et appeler sa méthode executer(Connexion conn) depuis Tmejdbc.java. Pour consulter le résultat attendu de chaque question résultat).
1- Modifier afficherJoueurs.java pour permettre d'afficher le nom, prénom et la date de naissance de tous les joueurs par ordre alphabétique.
Attention, ne pas ajouter de point virgule à la fin de la chaîne de caractères de la requête
Remarque : Utiliser Tmejdbc.java tout le long du TME pour répondre aux questions. Par exemple, pour cette question, rajouter dans Tmejdbc.java les deux lignes suivantes qui permettent d'instancier un objet de la classe afficherJoueurs et d'exécuter sa méthode executer().
import java.sql.*; public class Tmejdbc { public static void main(String[] args) { Connexion conn = new Connexion(); conn.connecter(); /*rajouter les lignes suivantes pour la question 1*/ afficherJoueurs aj = new afficherJoueurs(); aj.executer(conn); /**/ } }
2- Modifier afficherDuels.java pour afficher les joueurs qui se sont affrontés à Roland Garros en 1994.
3- Modifier sponsorPrimes.java pour afficher les sponsors avec leur plus grande prime. Le résultat devra être trié par ordre décroissant de cette prime.
Exercice 2 : Requêtes paramétrées
On veut paramétrer les trois requêtes précédentes en donnant la possibilité à l'utilisateur de spécifier des critères de sélection. Ces critères devraient être fournis dans la console et utilisés pour interroger la base. Pour ce faire, il faudra utiliser la classe preparedStatement qui permet de fournir les valeurs de prédicats pendant l'exécution (cf https://java.developpez.com/faq/jdbc/?page=Les-instructions-parametrees-moins-PreparedStatement) Pour lire les données depuis la console, utiliser le package java.io.Console dont voici un cas d'usage :
import java.sql.*; import java.io.Console; public class Tmejdbc { public static void main(String[] args) { Connexion conn = new Connexion(); conn.connecter(); /*Instanciation d'une console*/ Console console = System.console(); /*prompt de saisie d'une valeur*/ String annee_saisie = console.readLine("quelle annee ? "); String lieu = console.readLine("quel lieu ? "); /*conversion vers un entier*/ int annee = Integer.parseInt(annee_saisie); /*suite des traitements ...*/ } }
Ce code produit la sortie suivante
quelle annee ? quel lieu ?
4- Modifier joueurAge.java pour retourner le joueurs en fournissant leur année de naissance. Personnaliser le message de réponse de sorte à indiquer le cas où l'année de naissance saisie ne figure pas dans la base. Par exemple, afficher le message “Il n'existe pas de joueur né en …”.
5- Modifier joueursRencontre.java pour retourner les joueurs qui se sont affrontés lors du tournoi (lieutournoi, annee) fourni en argument.
6- Modifier rechercheSponsor.java pour retourner les sponsors dont la prime maximale varie entre montantMin et montantMax fournis en argument.
7- Modifier joueursInfos.java qui, dans un premier temps, liste tous les numéros et noms des joueurs. Dans un deuxième temps l'utilisateur pourra demander les primes des joueurs dont le numéro est fourni dans la console. La sortie du programme est comme suit :
Les joueurs de la base sont : Numéro 1 Nom : MARTINEZ Numéro 2 Nom : NAVRATILOVA Numéro 3 Nom : GRAF Numéro 4 Nom : HALARD Numéro 5 Nom : PIERCE Numéro 6 Nom : EDBERG Numéro 7 Nom : LARSSON Numéro 8 Nom : LECONTE Numéro 9 Nom : FORGET Numéro 10 Nom : FLEURIAN Numéro 11 Nom : WILANDER Numéro 12 Nom : CONNORS Numéro 13 Nom : McENROE Numéro 14 Nom : SAMPRAS Entrer numéro joueur ou taper fin : 14 Les primes du joueur numéro 14 sont : 200000 1800000 700000 1400000 Entrer numéro joueur ou taper fin : fin **Merci et au revoir!**
Bonus : Rajouter un contrôle qui vérifie le numéro de joueur saisi par l'utilisateur sans ré-exécuter de requête.