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]