Bases de Données / Databases

Site Web de l'équipe BD du LIP6 / LIP6 DB Web Site

Outils pour utilisateurs

Outils du site


site:enseignement:master:bdr:tmejdbc

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
site:enseignement:master:bdr:tmejdbc [04/01/2016 18:00]
hubert créée
site:enseignement:master:bdr:tmejdbc [26/03/2019 09:45] (Version actuelle)
hubert [Préparation]
Ligne 1: Ligne 1:
 +{{indexmenu_n>​4}}
 +
 ====== TME JDBC : Accès à un SGBD depuis Java ====== ====== TME JDBC : Accès à un SGBD depuis Java ======
  
  
 ===== Préparation ===== ===== Préparation =====
 +On considère les tables :
 +  * **JOUEUR**(__NUJOUEUR__,​ NOM, PRENOM, ANNAISS, NATIONALITE)
 +  * **GAIN**(__NUJOUEUR,​ LIEUTOURNOI,​ ANNEE__, PRIME, SPONSOR)
  
-lire le [[http://www-master.ufr-info-p6.jussieu.fr/​2006/Ext/naacke/bdr2008/extra/tme_jdbc.pdf sujet ]] (ou voir poly). Seulement la partie JDBC (pas JSP) +  ​Lire le {{:​site:​enseignement:​master:​bdr:​tme_jdbc_2017.pdf|sujet}} . 
-* lire les [[http://www-ari.ufr-info-p6.jussieu.fr/OUTILS/documentation/​doc/​Java/​jdk1.6/​docs/​api/​index.html | API]] (choisir ​le package java.sql, dans le cadre en haut à gauche) +  * Lire les [[https://www-ppti.ufr-info-p6.jussieu.fr/​doc-online/Java/jdk1.8/docs/api/index.html?​java/​sql/​package-summary.html ​API]] ou [[https://docs.oracle.com/javase/8/​docs/​api/​index.html?​java/​sql/​package-summary.html|API]] ​et sélectionner ​le package ​''​java.sql''​, dans le cadre en haut à gauche. 
-installer ​les fichiers :  tar zxvf $BD_TOOL/​jdbc-etu.tgz +  Installer ​les fichiers ​du TME:  ​ 
-* ceux qui utilisent Eclipse doivent référencer ​le jar /​Infos/​bd/​client10/​ojdbc14.jar dans leur projet+<code bash> ​  
-** cliquer avec le bouton droit sur le nom de votre projet, puis choisir Propriétés +        ​tar zxvf $BD_TOOL/​jdbc-etu.tgz 
-** Sélectionner ''​Java build Path'',​ puis l'onglet ''​Librairies''​ +        cd jdbc-etu ​       # Aller dans le répertoire du tme. 
-** Bouton Add External Jars, sélectionner,​ depuis la racine **/**,  le fichier /​Infos/​bd/​client10/​ojdbc14.jar +        ls                 # Lister les fichiers nécessaires au TME
-** Ok+        javac Joueur.java ​ # Compiler ​le programme affichant les joueurs 
 +        java Joueur ​       # et l'exécuter. 
 +</code>
  
 +===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 :
 +<code bash> ​       ​
 +     # remplacer ... par votre numéro d'​étudiant
 +     ​sqlplus E.../​E...@ora11
 +</​code>​
  
-===== Séance 1 =====+Puis à l'​invite SQL> saisir :
  
-* installer l'environnement de travail ​(voir le polyétape ​uniquement) +<code plsql> 
-* Commencer l'étape 1 du sujet: répondre aux questions a) à d) dans le fichier rapport.txt +   ​@vider 
-* Dans la question 1.1 : compléter les lignes commentaires: +   ​@tennis 
-** Si nécessaire,​ ajuster les informations de connexion : +   ​@quit 
-<​code>​ +</​code>​ 
-       String server = "​db-oracle.ufr-info-p6.jussieu.fr";​+  
 +===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 projetpuis 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 ​===== 
 +  * 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 : 
 +<​code> ​      ​String server = "​db-oracle.ufr-info-p6.jussieu.fr";​
        ​String port = "​1521";​        ​String port = "​1521";​
        ​String database = "​oracle";​        ​String database = "​oracle";​
 </​code>​ </​code>​
  
-Question fréquente concernant la compilation java: Comment éviter les warning et erreurs du compilateur javac concernant le jeu de caractères UTF-8 ? 
-* convertir les fichiers encodée en iso en des fichiers encodés en utf-8 
-<​code>​ 
- iconv -t utf8 -f iso8859-15 Fichier.java > tmp.java && mv tmp.java Fichier.java 
-</​code>​ 
  
  
-==== Question 2 : MaxPrime2. Définir une requête ''​paramétrée''​ : ==== 
  
-* la requête est une chaîne de caractères contenant un point d'interrogation __?__ pour chaque paramètre +==== Question 2 : MaxPrime2. Définir ​une requête ​''​paramétrée'' ====
-* Exemple "​select * from Joueur2 where annaiss = __?__ " +
-* voir l'exemple dans la documentation de l'interface [[http://​www-ari.ufr-info-p6.jussieu.fr/​OUTILS/​documentation/​doc/​Java/​jdk1.6/​docs/​api/​java/​sql/​PreparedStatement.html | PreparedStatement]]+
  
 +  * La requête est une chaîne de caractères contenant un point d'​interrogation ​ **?** pour chaque paramètre.
 +  * Exemple "​select * from Joueur where annaiss = ? "
 +  * voir l'​exemple dans la documentation de l'​interface [[https://​docs.oracle.com/​javase/​8/​docs/​api/​index.html?​java/​sql/​PreparedStatement.html | PreparedStatement]]
  
-=== Questions fréquentes concernant ~MaxPrime2: === 
  
-* Comment ​__comparer ​chaînes__ ​de caractères a et b ?+=== Questions fréquentes concernant MaxPrime2 === 
 + 
 +  ​* Comment ​**comparer ​chaînes** ​de caractères a et b ?
      * utiliser la méthode : a.equals(b)      * utiliser la méthode : a.equals(b)
      * l'​opérateur a==b ne compare pas le contenu des chaînes de caractères mais leur identifiant d'​objet.      * l'​opérateur a==b ne compare pas le contenu des chaînes de caractères mais leur identifiant d'​objet.
-* Comment ​__convertir__ ​une chaîne de caractères en un nombre entier ?+  ​* Comment ​**convertir** ​une chaîne de caractères en un nombre entier ?
      * int n = Integer.parseInt(chaine);​      * int n = Integer.parseInt(chaine);​
  
Ligne 51: Ligne 73:
 ==== Questions 3 : Requête générique ==== ==== Questions 3 : Requête générique ====
  
-* L'​exécution du programme GeneriqueHTML doit produire ce [résultat | http://​www-master.ufr-info-p6.jussieu.fr/​2006/​Ext/​naacke/​bdr2009/​extra/​tme/​GeneriqueHTML.html] +  ​* L'​exécution du programme GeneriqueHTML doit produire ce [[http://​www-master.ufr-info-p6.jussieu.fr/​2006/​Ext/​naacke/​bdr2009/​extra/​tme/​GeneriqueHTML.html ​| résultat ​]]. 
-attention, le paramètre (la requête) doit être entre " "+  Attention lors de l'​exécution de l'​application, le paramètre (la requête) doit être entre guillemets ​" "
  
  
Ligne 58: Ligne 80:
 ===== Séance 2 ===== ===== Séance 2 =====
  
-* Finir la question 3 +  ​* Finir la question 3 
-* Question 4: Schéma d'une relation.+  * Question 4 : Schéma d'une relation.
      * le pattern pour désigner n'​importe quelle chaine de caractère en SQL est "​%"​      * le pattern pour désigner n'​importe quelle chaine de caractère en SQL est "​%"​
-* Question 5: +  ​* Question 5. 
-     ​* ​Ajuster ​l'URL d'​accès à la 2eme base contenant a table Sponsor +     * l'URL d'​accès à la 2ème base contenant a table Sponsor ​est : 
-          * String url2 = "​jdbc:​oracle:​thin:​@oracle.ufr-info-p6.jussieu.fr:​1521:​ora10"; ​(user: anonyme, password: anonyme)+          * String url2 = "​jdbc:​oracle:​thin:​@oracle.ufr-info-p6.jussieu.fr:​1521:​ora10"; ​
  
  
-     ​* ​jointure ​inter-bases : créer un ~PreparedStatement sur les Sponsors, dont le paramètre est l'​attribut de jointure. +     ​* ​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.+     ​* ​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 ===== ===== Séance 3 =====
- +  ​* Finir la question 5 
-* 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 tri puis fusion. Voir la méthode compareTo de la classe String. ​Etendre l'​algorithme pour traiter le cas d'une équi-jointure entre 2 attributs non uniques (''​i.e.''​ 2 clés étrangères) et un ~ResultSet scrollable+     ​* ​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 :
-     ​* ​jointure ​par transfert de clés (semi-jointure). Pour cela générer la table des hommes sur un serveur grâce au fichier ​/​Vrac/​jdbcBDR/​createHommes.sql et la table des femmmes sur l'​autre serveur grâce au fichier ​/​Vrac/​jdbcBDR/​createFemmes.sql ​(copier les deux fichiers dans votre répertoire). 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.          * 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.          * (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+         * 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  [[http://​www-master.ufr-info-p6.jussieu.fr/​2006/​Ext/​naacke/​bdr2009/​extra/​tme/​algo_jointure.pdf ​| jointure ]], tout en utilisant JDBC.
- +
-     * (facultatif) implémenter d'​autres algorithmes de  [jointure | http://​www-master.ufr-info-p6.jussieu.fr/​2006/​Ext/​naacke/​bdr2009/​extra/​tme/​algo_jointure.pdf],​ tout en utilisant JDBC.+
  
  
Ligne 89: Ligne 109:
 ===== Documentation ===== ===== Documentation =====
  
-* Algorithmes de [jointure |  ​http://​www-master.ufr-info-p6.jussieu.fr/​2006/​Ext/​naacke/​bdr2009/​extra/​tme/​algo_jointure.pdf] (anglais)+* Algorithmes de [http://​www-master.ufr-info-p6.jussieu.fr/​2006/​Ext/​naacke/​bdr2009/​extra/​tme/​algo_jointure.pdf ​| jointure ]] (anglais)
  
-si nécessaire utiliser l'​option ''​-encoding''​ pour compiler vos programmes: javac -encoding UTF-8 Fichier.java+Question fréquente concernant la compilation java: Comment éviter les warning et erreurs du compilateur javac concernant le jeu de caractères UTF-8 ? 
 +  ​convertir les fichiers encodée en iso en des fichiers encodés en utf-8 
 +<​code>​ 
 + iconv -t utf8 -f iso8859-15 Fichier.java > tmp.java && mv tmp.java Fichier.java 
 +</​code>​ 
 +Si nécessaire utiliser l'​option ''​-encoding''​ pour compiler vos programmes: ​ 
 +<​code>​javac -encoding UTF-8 Fichier.java</​code>​
  
-* Liens externes : un [cours HTML | http://​nephi.unice.fr/​CoursHTML/​] (université de Nice), ​un autre [manuel HTML | http://​www.infini-fr.com/​Sciences/​Informatique/​Reseaux/​Internet/​WorldWideWeb/​Html/​index.html],​ un [cours java| http://www.infini-fr.com/Sciences/Informatique/​Langages/​Imperatifs/​Java/​java.html],​ Java 1.5 [API | http://​java.sun.com/​j2se/​1.5/docs/api/index.html], ...+* Liens externes : un [[http://​nephi.unice.fr/​CoursHTML/​| cours HTML ]] (université de Nice), ​Java 7 [[https://docs.oracle.com/javase/7/​docs/​api/ ​|API ]], ...
  
 ===== Divers ===== ===== Divers =====
  
  
 +Aller vers  [[site:​enseignement:​master:​bdr:​start | BDR]]
  
site/enseignement/master/bdr/tmejdbc.1451926849.txt.gz · Dernière modification: 04/01/2016 18:00 par hubert