JDBC Daniel Tschirhart : Programmation Java V1.35 – 1.1 Daniel Tschirhart : Programmation Java V1.35 - 1.1 JDBC JDBC est l'acronyme de Java DataBase Connectivity et désigne une API définie par Sun pour permettre un accès aux bases de données avec Java Daniel Tschirhart : Programmation Java V1.35 - 1.1 Accès aux bases de donnée Pour pouvoir utiliser JDBC, il faut un pilote spécifique à la base de donnée à laquelle on veut accéder. Les pilotes se présentent généralement sous la forme de fichiers jar dont le chemin doit être ajouté au classpath pour permettre au programme de l'utiliser. JDBC permet d’utiliser quatre types de pilotes. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Pilotes JDBC type 1 JDBC-ODBC bridge : Fonctionne très bien sous Windows. Disponibilité de pilotes ODBC pour la quasi totalité des bases de données. Inconvénients La multiplication du nombre de couches détériore un peu les performances. Lors du déploiement, ODBC et son pilote doivent être installé sur tous les postes où l'application va fonctionner. La partie native (ODBC et son pilote) rend l'application moins portable et dépendant d'une plateforme. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Pilotes JDBC type 2 Pilote écrit en java appelant l'API native de la base de données. Ce type de pilote converti les ordres JDBC pour appeler directement les API de la base de donnée du pilote natif sur le client. Ce type de driver nécessite l'utilisation de code natif sur le client. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Pilotes JDBC type 3 Pilote écrit en Java utilisant un intermédiaire réseau Ce type de pilote utilise un protocole réseau propriétaire spécifique à la base de données. Un serveur dédié reçoit les messages par ce protocole et dialogue directement avec la base de données. Peut être facilement utilisé par une applet mais le serveur intermédiaire doit obligatoirement être installé sur la machine contenant le serveur web. Fonctionne très bien sous Windows. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Pilotes JDBC type 4 Pilote Java utilisant le protocole natif de la base de données : Ce type de pilote, écrit en java appelle directement le SGBD par le réseau. Ce type de pilote est fourni par l'éditeur de la base de données. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Base de donnée H2 La base de donnée H2 possède les caractéristiques principale suivantes. Open source, écrite en Java. Possède une faible empreinte mémoire. Très rapide, supporte les standard SQL et l’API JDBC Mode de fonctionnement dédié (embedded) ou serveur, gère les accès concurrents. Peut être encryptée. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Mode dédié En mode dédiée, l’application ouvre la base de donnée au sein de la même machine Java en utilisant JDBC. Cette méthode est la plus rapide mais présente l’inconvénient de rendre accessible la base uniquement au sein d’une seule machine virtuelle. Il n’y a pas de limites quand au nombre de bases de données pouvant être ouvertes simultanément. URL d’accès : Daniel Tschirhart : Programmation Java V1.35 - 1.1 Mettre en place une petite base de donnée Lancer H2W.bat depuis le répertoire bin de H2 Choisir la configuration Generic H2 (Embedded) Connecter-vous à la base test qui sera créé à la racine de votre compte Daniel Tschirhart : Programmation Java V1.35 - 1.1 Mettre en place une table et des enregistrements Exécuter les commandes suivantes dans la console H2. Ces commandes construisent une table avec pour clé un entier (ID) et pour donnée une colonne NAME, puis insère ensuite deux enregistrements : Pour la clé 1 : ‘Hello’ Pour la clé 2 : ‘World’ Puis remplace la donnée correspondant à la clé 1 par ‘Hi’ et supprime la clé 2 Daniel Tschirhart : Programmation Java V1.35 - 1.1 Mode client-serveur L’application ouvre la base de donnée à distance à l’aide de l’API JDBC ou ODBC. Le serveur peut résider au sein de la machine virtuelle du client, sur une autre machine virtuelle, ou sur une autre station Plusieurs client peuvent se connecter simultanément à la même base de donnée. Mode de fonctionnement plus lent car tous les accès se font en utilisant TCP/IP. Il n’y a pas de limites quand au nombre de bases de données pouvant être ouvertes simultanément. URL d’accès : Daniel Tschirhart : Programmation Java V1.35 - 1.1 Mise en place d’un serveur H2 Copier h2-xxx.jar sous h2.jar (répertoire program files/H2/bin) Modifier le fichier wrapper.conf situé dans le répertoire services de H2 afin d’autoriser ou non les connexion distantes. Aller dans le répertoire H2/service et lancer les commandes 1, 2 (Attention il faut avoir les droits administrateur). Ces procédures comportent quelques erreurs. Charger les fichier modifiés depuis le serveur de cours. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Test de connexion au serveur à l’aide de la console en mode local Pré condition : le serveur est lancé Lancer H2W.bat et choisir Generic H2 (server) Paramétrer le nom de la base de donnée à utiliser Vous devez retrouver la base précédemment créée. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Test de connexion au serveur à l’aide de la console en mode distant Sur une autre machine connecté au même réseau, lancer la console H2 (H2W.bat) et choisir Generic H2 (server) Paramétrer l’adresse du serveur (adresse IP ou nom de la machine) et le nom de la base de donnée à utiliser. Vous devez retrouver la base précédemment créée. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Mise en place de H2 dans Java Télécharger et installer la base H2 sur Internet. URL: http://www.h2database.com Installer H2 dans votre projet eclipse : Importer H2xy.jar (depuis C:\Program Files\H2\bin) dans le répertoire bin de votre projet. Tester avec le programme ci-dessous: Daniel Tschirhart : Programmation Java V1.35 - 1.1 Classes de l'API JDBC Importer les classes jdbc import java.sql.*; Quatre classes importantes correspondant chacune à une étape d’accès aux données Classe Rôle DriverManager Charge et configure le pilote de la base de donnée. Connection Réalise la connexion et l’authentification à la base de donnée. Statement Précise la requête SQL et la transmet à la base de donnée. ResultSet Permet de parcourir les enregistrement de la base de données. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Chargement du pilote La documentation du pilote fournit le nom de la classe à utiliser généralement sous la forme : jdbc.DriverXXX Le chargeur confie l’instanciation du pilote à la méthode static forName de la classe Class : Class.forName("jdbc.DriverXXX"); static forName() peut lever l'exception ClassNotFoundException. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Exemple de chargement de pilote H2 Daniel Tschirhart : Programmation Java V1.35 - 1.1 Etablissement de la connexion La connexion est établie à l’aide de la fonction statique getConnection(String url, String user, String password) de la classe DriverManager. La syntaxe de l’url d’accès peut varier d'un type de base de données à l'autre mais elle est toujours de la forme : protocole:sous_protocole:nom protocole : jbdc désigne JDBC. sous_protocole : odbc désigne ODBC. nom doit être celui saisi dans le nom de la source ODBC. La méthode getConnection() peut lever une exception de la classe java.sql.SQLException. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Exemple d’établissement de la connexion pour une base H2 Daniel Tschirhart : Programmation Java V1.35 - 1.1 Test de connexion au serveur à l’aide de Java Test du serveur en mode local Daniel Tschirhart : Programmation Java V1.35 - 1.1 Test de connexion au serveur à l’aide de Java Test du serveur en mode distant. Remplacer la connexion par l’adresse du serveur par exemple : Ou le nom du serveur exemple : Daniel Tschirhart : Programmation Java V1.35 - 1.1 Accéder à la base de données Une fois la connexion établie, on peut passer des ordres SQL. Les classes pouvant être utilisées lors de l'accès à la base de données sont les suivantes : Classe Rôle DataBaseMetaData Fourni les information sur la base : nom des tables, index, version, ... ResultSet Résultat d'une requête et information sur une table. L'accès se fait enregistrement par enregistrement (ligne par ligne). ResultSetMetaData Information sur les colonnes (nom et type) d'un résultSet. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Exécution des requêtes SQL Les requêtes d'interrogation SQL sont exécutées avec les méthodes d'un objet Statement obtenu à partir d'un objet Connection. Lors de l'appel à la méthode d'exécution, il est nécessaire de lui fournir en paramètre la requête SQL sous forme de chaine. Pour une requête de type interrogation (SELECT), la méthode à utiliser est executeQuery(). Daniel Tschirhart : Programmation Java V1.35 - 1.1 Exécution des requêtes SQL Pour des traitements de mise à jour, la méthode à utiliser est executeUpdate(). Le résultat d'une requête d'interrogation est renvoyé dans un objet de la classe ResultSet par la méthode executeQuery(). Daniel Tschirhart : Programmation Java V1.35 - 1.1 Classe ResultSet Cette classe permet l'abstraction d'une table composée de plusieurs enregistrements (lignes) dont chacun est constitué de colonnes contenant les données. Méthode Rôle getXX(XX) XX = int ou float. Retourne le contenu de la colonne dont le numéro (entier) est passé en paramètre. Nota les numéros démarrent à partir de 1. getXX(String) Retourne le contenu de la colonne dont le nom est passé en paramètre. getDate(int) Retourne le contenu de la colonne sous forme de date dont le numéro est passé en paramètre. getDate(String) Idem mais nom de la colonne explicite. next() Se déplace sur le prochain enregistrement : retourne false si la fin est atteinte close() Détruit la table et ferme le ResultSet getMetaData() Retourne un objet ResultSetMetaData associé au ResultSet. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Obtenir des informations sur la base de données : getMetaData La méthode getMetaData() issus d'un objet ResultSet retourne un objet de type ResultSetMetaData. Cet objet permet de connaître le nombre, le nom et le type des colonnes. Méthode Rôle int getColumnCount() Retourne le nombre de colonnes du ResultSet. String getColumnName(int) Retourne le nom de la colonne dont le numéro est fourni. String getColumnLabel(int) retourne le libellé de la colonne de numéro donné. Daniel Tschirhart : Programmation Java V1.35 - 1.1 Exemple Daniel Tschirhart : Programmation Java V1.35 - 1.1 Classe ResultSet Java 2 Daniel Tschirhart : Programmation Java V1.35 - 1.1 Classe ResultSet java 2 Durant le parcours d'un ResultSet, il est possible d'effectuer des mises à jour sur la ligne courante du curseur. Pour cela, il faut déclarer l'objet ResultSet comme acceptant les mises à jour. . JDBC 2.0 propose de les réaliser les mise à jour via des appels de méthodes plutôt que d'utiliser des requêtes SQL Daniel Tschirhart : Programmation Java V1.35 - 1.1 Exemple Demo