TME JDBC : Accès à un SGBD depuis Java
Préparation
On considère les tables :
JOUEUR(NUJOUEUR, NOM, PRENOM, ANNAISS, NATIONALITE)
GAIN(NUJOUEUR, LIEUTOURNOI, ANNEE, PRIME, SPONSOR)
tar zxvf $BD_TOOL/jdbc-etu.tgz
cd jdbc-etu # Aller dans le répertoire du tme.
ls # Lister les fichiers nécessaires au TME.
javac Joueur.java # Compiler le programme affichant les joueurs
java Joueur # et l'exécuter.
Table non visible ?
Seulement si la table Joueur n'est pas visible: vider votre compte oracle et recréer les synonymes vers la base tennis :
# remplacer ... par votre numéro d'étudiant
sqlplus E.../E...@ora11
Puis à l'invite SQL> saisir :
@vider
@tennis
@quit
Eclipse
Ceux qui utilisent Eclipse doivent référencer le jar /Infos/bd/client11/ojdbc6.jar
dans leur projet. Eclipse (luna) doit être lancé depuis la fenêtre shell, pas depuis le menu.
Cliquer avec le bouton droit sur le nom de votre projet, puis choisir Propriétés
Sélectionner Java build Path
, puis l'onglet Librairies
Bouton Add External Jars
, sélectionner, depuis la racine /
, le fichier /Infos/bd/client11/ojdbc6.jar
Ok
Séance 1
Commencer par l'exercice Utilisation des bibliothèques java : répondre aux questions a) à d) dans le fichier rapport.txt
Dans la question 1.1 : compléter les lignes de commentaires.
Si nécessaire, ajuster les informations de connexion :
String server = "db-oracle.ufr-info-p6.jussieu.fr";
String port = "1521";
String database = "oracle";
Question 2 : MaxPrime2. Définir une requête ''paramétrée''
Questions fréquentes concernant MaxPrime2
Questions 3 : Requête générique
Séance 2
Jointure inter-bases : créer un PreparedStatement sur les Sponsors, dont le paramètre est l'attribut de jointure.
Jointure par boucles imbriquées : attention, le ResultSet sur les sponsor (boucle interne) doit être de type scrollable. Voir le paramètre resultSetType de la méthode Connection.createStatement. Voir aussi le champ ResultSet.TYPE_SCROLL_INSENSITIVE.
Séance 3
Finir la question 5
Jointure par tri puis fusion. Voir la méthode compareTo de la classe String. Pour la requête R1 il y a un seul Sponsor par nuplet de Gain, donc il suffit d'itérer sur les n-uplets de gain.
Jointure par transfert de clés (semi-jointure). Pour cela générer la table des hommes sur un serveur grâce au fichier createHommes.sql et la table des femmmes sur l'autre serveur grâce au fichier createFemmes.sql. Les fichiers sont dans votre répertoire de travail. Connectez vous à chaque serveur avec votre propre nom d'utilisateur (Ennnnnn). On veut faire la jointure “tous les couples homme-femme de même âge”. On propose deux méthodes :
récupérer les âges des hommes et les mettre dans une liste liste1. Récupérer les âges des femmes qui joignent avec liste1 dans la liste liste2. Générer la liste des hommes qui joignent (ceux dont l'âge est dans liste2) triée par âge, idem pour les femmes et fusionner les deux listes.
(facultatif) idem pour liste1 puis récupérer les femmes (nuplet complet) qui joignent et les insérer dans une table temporaire que vous créerez. Faire la jointure en SQL entre Hommes et cette table temporaire.
Comparer le temps d'exécution avec le temps d'exécution d'une jointure par tri-fusion entre les deux tables Hommes et Femmes. Pour cela adapter le programme créé pour la base Tennis en modifiant les requêtes envoyées. De plus, cette fois-ci, l'algorithme doit traiter le cas d'une équi-jointure entre 2 attributs non uniques. Il faut donc utiliser un ResultSet scrollable et, par exemple, la méthode relative(). Vous pouvez comparer les temps d'exécution soit en utilisant la commande 'time', soit en modifiant votre code pour compter le nombre de n-uplets transmis entre serveurs (en passant par le client).
Différence entre sqlplus et jdbc concernant les infos de connexion. Sous sqlplus, vous utilisez des alias qui correspondent aux infos de connexion de jdbc : ora10 correspond à la base ora10 du serveur oracle, ora11 correspond à la base oracle du serveur db-oracle.
(facultatif) implémenter d'autres algorithmes de
jointure , tout en utilisant JDBC.
Documentation
* Algorithmes de jointure (anglais)
Question fréquente concernant la compilation java: Comment éviter les warning et erreurs du compilateur javac concernant le jeu de caractères UTF-8 ?
iconv -t utf8 -f iso8859-15 Fichier.java > tmp.java && mv tmp.java Fichier.java
Si nécessaire utiliser l'option -encoding
pour compiler vos programmes:
javac -encoding UTF-8 Fichier.java
* Liens externes : un cours HTML (université de Nice), Java 7 API , …
Divers