Support de cours : "JDBC mise en oeuvre"

publicité
Cours informatique
*Java
DataBase Connectivity
Contenu :
•
•
•
•
•
Etapes
Drivers
Statements
ResultSet
Type de données
Estimation temps :
•
•
Cours : 2 x 45 minutes
TP : 120 minutes
HEG Genève
http://www.hesge.ch/heg/
Les grandes étapes
 Charger le driver;
 Établir la connexion avec le SGBD ciblé;
 Facultatif : créer la requête (Statement);
 Envoyer la requête (SQL);
 Traiter les résultats;
 Clore la connexion.
page 2 sur -
v01.01
[email protected]
Charger le driver
 Charger le driver correspondant au SGBD visé;
 Chargement explicite :
o Class.forName(String className);
 Par exemple :
o Access:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
o MySQL:
Class.forName("com.mysql.jdbc.Driver");
o Oracle:
Class.forName("oracle.jdbc.OracleDriver");
 Enregistre la classe chargée dans le DriveManager
 Exception :
o ClassNotFoundException.
page 3 sur -
v01.01
[email protected]
Abstraction
 Abstraction des SGBDR ;
 Ensemble d’interfaces (! pas de classes)
o Driver ;
o Connection ;
o Statement ;
o PrepareStatement ;
o ResultSet.
 Gestionnaire JDBC
o DriverManager.
page 4 sur -
v01.01
[email protected]
Implémentation des interfaces
 Chaque «interface» a son implémentation particulière ;
 Une implémentation spécifique à un SGBD
o PILOTE.
 Le pilote est le point d’accès aux SGBD ;
page 5 sur -
v01.01
[email protected]
Pilotes et gestion
 Driver et DriverManager ;
 Pilote :
o Driver ;
o Interface : java.sql.Driver
 Gestion des pilotes :
o DriverManager ;
o Classe : java.sql.DriverManager
 Un pilote peut gérer plusieurs SGBD.
page 6 sur -
v01.01
[email protected]
Java.sql.Driver
 Interface;
 Implémentation ;
o Chaque vendeur fourni ses propres implémentations
 Intégré dans le cœur de Java
o sun.jdbc.odbc.JdbcOdbcDriver
(aussi pour le SGBDR Acces).
 Issus d’un vendeur (à importer et à placer dans le projet)
o MySql : com.mysql.jdbc.Driver
o Oracle : oracle.jdbc.OracleDriver
o PostgreSQL : org.postgersql.Driver
page 7 sur -
v01.01
[email protected]
Java.sql.Driver
 Les classes des Drivers
o Fichiers dans : *.jar
o Placés dans les distributions des SGBD.
 Références pilotes :
o http://www.oracle.com/
technetwork/java/index-136695.html
page 8 sur -
v01.01
[email protected]
Mise en œuvre JDBC
1. Chargement d’un pilote;
2. Création d’une connexion à un SGBD;
3. Création d’une instruction (d’un «statement»);
4. Exécution de la requête dans le SGBD;
5. Présentation et traitement des résultats;
6. Fermeture et relâchement des ressources.
page 9 sur -
v01.01
[email protected]
Changement d’un pilote
 Charger un pilote
o Charger la classe et l’enregistre dans le DriverManager
 Utilisation de DriverManager
o Classe : java.sql.DriverManager
o Méthodes statiques;
 Chargement des drivers
o Implicitement :
 Instanciation de jdbc.drivers
o Explicitement :
 Utilisation de la méthode statique forName
page 10 sur -
v01.01
[email protected]
Initialisation du chargement
 Propriétés du système (avant appel à l’API)
o jdbc.drivers = nomDeLaClasseDuDriver
 Au moment du démarrage de l’application
o java –Djdbc.drivers = nomDeLaClasse
 Pendant l’exécution du programme
try {
Class.forName ("nomDeLaClasseDriver");
} catch (ClassNotFoundException e) {…}
Par exemple
Class.forName ("com.mysql.jdbc.Driver");
Remarque : le *.jar doit être disponible.
page 11 sur -
v01.01
[email protected]
Approche forName
 La classe est une chaîne de caractère;
 Permet de ne pas «hard-coder» le nom du Driver
 Possibilité de paramétrer le nom du driver
page 12 sur -
v01.01
[email protected]
Création d’une connexion
 Le DriverManager tente de trouver un driver ;
 Résultat :
o Récupérer une référence sur un objet Connection
o Cet objet Connection est initialisé par le DriverManager
Connection con =
DriverManager.getConnection(url, props);
 Possibilité d’inclure des arguments par des propriétés
Properties props = new Properties ();
props.put ("user", "");
props.put ("passwrod", "");
 Typiquement pour les données de sécurité (nom et pswd).
 Exception : java.sql.SQLException
page 13 sur -
v01.01
[email protected]
Exemples de création de connexion
 MySQL:
props.put("user", "root"); props.put("password", "");
props.put("charSet", "UTF-8");
Connection con = DriverManager.getConnection
("jdbc:mysql://localhost:3306/NomBase", props);
 Oracle:
props.put("user", "system"); props.put("password", "123");
Connection con = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:NomInstance", props);
 Access:
props.put("user", "admin"); props.put("password", "");
props.put("charSet", "ISO-8859-1");
Connection con = DriverManager.getConnection
("jdbc:odbc:NomSource", props);
page 14 sur -
v01.01
[email protected]
Chaîne de connexion
 Utilisation d’une chaîne pour l’URL du SGBD
 Chaîne de connexion :
jdbc:subprotocol:subname
 Par exemples :
o MySql :
"jdbc:mysql://localhost:3306/NomBase"
o Oracle :
"jdbc:oracle:thin:@localhost:1521:NomInstance"
o Access :
"jdbc:odbc:NomSource"
page 15 sur -
v01.01
[email protected]
Interroger un SGBD
 Instruction simple
o Créée par une connexion;
o La requête SQL doit être compilée à chaque fois par le SGBD;
o Utilisé lors d’interrogation unique;
o java.sql.Statement
 Instruction précompilée
o Créée par une connexion
o La requête est précompilée. Le SGBDR ne fait que l’exécuter,
plus de ressource ni de temps pour la compilation au niveau
du SGBD
o Utilisé lors d’interrogations multiple (p.ex. dans une boucle);
o java.sql.PreparedStatement
 Procédure stockée
o Exécuter une procédure au sein du SGBD.
page 16 sur -
v01.01
[email protected]
Instruction simple
 Permet d’interroger un SGBD avec des paramètres
o Pour exécuter une requête SQL simple;
 C’est la connexion qui fourni une référence sur un objet
Statement initialisé
Connection con =
DriverManager.getConnection("jdbc:mysql://localhost:3306/mabase");
Statement stmt = con.CreateStatement();
 Exception : SQLException
 Le stmt doit être fermé en fin d’utilisation
 La requête n’est pas liée à l’objet Statement, mais est passée en
paramètre lors de la demande d’exécution
page 17 sur -
v01.01
[email protected]
Instruction précompilée
 Permet d’interroger simplement un SGBD
o Pour exécuter une une requête SQL paramétrée;
 Requête paramétrée
String sql = "UPDATE employe " +
"
SET NoDept = ? " +
"
WHERE NoEmpl = ?";
 C’est la connexion qui fourni une référence sur un objet
PreparedStatement initialisé
Connection con =
DriverManager.getConnection("jdbc:mysql://localhost:3306/mabase");
PreparedStatement pstmt = con.prepareStatement(sql);
 Passer les paramètres (! typé) :
pstmt.setInt (1, 567);// paramètre de NoDept (1er)
pstmt.setInt (2, 71); // paramètre de NoEmpl (2ème)
 Exception : SQLException
 Le pstmt doit être fermé en fin d’utilisation
page 18 sur -
v01.01
[email protected]
SQL et PreparedStatement
 La chaîne de caractères de la requête peut inclure des
paramètre en les désignant par des «?»;
 Il est possible d’en insérer autant que nécessaire;
 Chaque paramètre («?») est accessible par sa position
(! Le premier ? est sur la position 1 (et non 0));
 Pour insérer un valeur, il faut utiliser la méthode set
 Les paramètres sont typés : setXYZ (pos, valeur)
o XYZ : String, Int, Date, Boolean, Float, etc.
page 19 sur -
v01.01
[email protected]
Méthode et PreparedStatement
 Exécuter une requête de type lecture (SELECT) pour une
requête paramétrée (instruction précompilée). Retourne une
référence sur un objet résultat ResultSet
executeQuery (sql)
 Exécute une requête d’action sur les enregistrements.
Retourne le nombre d’enregistrements affectés par la
requête
executeUpdate()
 Efface les paramètres d’une requête d’une instruction
préparée
clearParametres ()
 Exception : SQLException
 Le stmt ou pstmt doit être fermé en fin d’utilisation.
page 20 sur -
v01.01
[email protected]
Interrogation du SGBDR
 Requête SQL sous forme de chaîne de caractères;
 CRUD sur les enregistrements
o
o
o
o
Création : CREATE;
Lecture : SELECT;
Mise-à-jour : UPDATE;
Suppression : DELETE.
 Résultat obtenu dans un objet de classe ResultSet;
 Exemple :
Connection con =
DriverManager.getConnection("jdbc:mysql://localhost:3306/mabase");
Statement stmt = con.CreateStatement();
String sql = "SELECT * FROM departement";
ResultSet rs = stmt.executeQuery (sql);
page 21 sur -
v01.01
[email protected]
ResultSet
 Résultat d’une requête SELECT
 Objet modélisant le résultat sous forme d’un tableau
o Ligne : enregistrement;
o Colonne : champs.
 Possibilité de parcours «ligne par ligne»
o Chaque ligne peut être considérée comme un tuple.
 Les colonne se réfèrent
o Par leur position;
o Par leur nom.
 L’accès aux données se fait par la méthode getXYZ ()
 Les valeurs sont typées : getXYZ (pos/nom)
o XYZ : String, Int, Date, Boolean, Float, etc.
page 22 sur -
v01.01
[email protected]
Parcourir un ResultSet
 Un ResultSet possède un curseur pointant sur
l’enregistrement courant;
 Au début, le curseur est positionné AVANT le premier
enregistrement (donc pointe sur rien);
 Pour se déplacer sur l’enregistrement suivant
next ()
 Pour accéder au premier enregistrement, commencer
par se positionner par un next () préalable
 La méthode next() retourne une valeur booléenne :
o true : s’il existe un enregistrement sur la position actuelle;
o false : si le curseur à dépassé de dernier enregistrement
page 23 sur -
v01.01
[email protected]
Les types SQL
Source : http://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html
page 24 sur -
v01.01
[email protected]
CONCLUSION
Synthèse…
page 25 sur -
v01.01
[email protected]
PARTIE INTERACTIVE
Questions - réponses
page 26 sur -
v01.01
[email protected]
TRAVAIL PRATIQUE
Temps : 120 minutes
page 27 sur -
v01.01
[email protected]
FIN DU COURS
page 28 sur -
v01.01
[email protected]
Téléchargement