cours informatique 201 -2015 / 01 java database connectivity · o java.sql.statement instruction...
TRANSCRIPT
HEG Genève http://www.hesge.ch/heg/
Contenu : • Etapes • Drivers • Statements • ResultSet • Type de données
Estimation temps :
• Cours : 2 x 45 minutes • TP : 120 minutes
Cours informatique 2014-2015 / 01 *Java DataBase Connectivity
[email protected] page 2 sur - v01.01
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.
[email protected] page 3 sur - v01.01
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.
[email protected] page 4 sur - v01.01
Abstraction
Abstraction des SGBDR ;
Ensemble d’interfaces (! pas de classes)
o Driver ;
o Connection ;
o Statement ;
o PrepareStatement ;
o ResultSet.
Gestionnaire JDBC
o DriverManager.
[email protected] page 5 sur - v01.01
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 ;
[email protected] page 6 sur - v01.01
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.
[email protected] page 7 sur - v01.01
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
[email protected] page 8 sur - v01.01
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
[email protected] page 9 sur - v01.01
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.
[email protected] page 10 sur - v01.01
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
[email protected] page 11 sur - v01.01
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.
[email protected] page 12 sur - v01.01
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
[email protected] page 13 sur - v01.01
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
[email protected] page 14 sur - v01.01
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);
[email protected] page 15 sur - v01.01
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"
[email protected] page 16 sur - v01.01
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.
[email protected] page 17 sur - v01.01
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
[email protected] page 18 sur - v01.01
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
[email protected] page 19 sur - v01.01
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.
[email protected] page 20 sur - v01.01
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.
[email protected] page 21 sur - v01.01
Interrogation du SGBDR
Requête SQL sous forme de chaîne de caractères;
CRUD sur les enregistrements o Création : CREATE; o Lecture : SELECT; o Mise-à-jour : UPDATE; o 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);
[email protected] page 22 sur - v01.01
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.
[email protected] page 23 sur - v01.01
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
[email protected] page 24 sur - v01.01
Les types SQL
Source : http://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html
[email protected] page 25 sur - v01.01
CONCLUSION Synthèse…
[email protected] page 26 sur - v01.01
PARTIE INTERACTIVE Questions - réponses
[email protected] page 27 sur - v01.01
TRAVAIL PRATIQUE Temps : 120 minutes
[email protected] page 28 sur - v01.01
FIN DU COURS