Trang 1
JDBCJDBC Java DataBase Connectivity © Philippe GENOUD UJF Février 2004 1 JDBCJDBC Introduction l Offre une API unique d’accès à toute BD conforme au standard SQL-92 l Objectifs : l Fournir un accès homogène aux SGBD l une application Java est capable d’accéder de façon générique à un SGBD quel que soit son fournisseur l Abstraction des SGBD cibles l Requêtes SQL l Simple à mettre en oeuvre l JDBC 1.0 Core API (JDK 1.1) : package java.sql l JDBC 2.0 (Java 2) © Philippe GENOUD UJF Février 2004 2
Trang 2
JDBCJDBC Architectures Client/ServeurArchitectures Client/Serveur l Client/Serveur : un programme client s ’adresse à un programme sur une machine distante (le serveur) pour échanger des informations et des services SGBD réseau Client Interface Serveur SGBD Interface client SGBD Serveur de programme données • Programme client ne communique pas directement avec SGBD • Sur le poste client : interface client du SGBD qui gère le protocole de communication spécifique au SGBD • Sur le poste serveur : interface serveur du SGBD qui gère les connexions avec les différents clients. © Philippe GENOUD UJF Février 2004 3 JDBCJDBC Architecture d’une application JDBC l JDBC permet de développer des programmes Java clients (applications autonomes, applets composants dans applications N-tiers) qui accèdent à des SGBD • Package java.sql : implémentation de la spécification JDBC fournie en standard avec le JDK • DriverManager : classe java à laquelle s’adressent les autres objets de Application Java Machine l ’application cliente Virtuelle • JDBC interagit avec le SGBD par JDBC (java.sql) DriverManager un driver • Il existe des drivers pour Oracle, Driver JDBC Driver JDBC Sybase, Informix, DB2, … fournisseur 1 fournisseur 2 • JDBC spécifie uniquement l ’architecture que ces drivers doivent respecter. Ils sont réalisés par une tierce partie (fournisseur du SGBD, «éditeur de logiciel…) SGBD SGBD • l’implémenation des drivers est fournisseur 1 fournisseur 2 totalement libre © Philippe GENOUD UJF Février 2004 4
Trang 3
JDBCJDBC Services JDBCServices JDBC l Gestion des drivers l chargement, sélection l Ouverture de connexions à une base de données l SQL dynamique et SQL statique l exécution de requêtes (SQL-92) l Exploitation des résultats l correspondance types SQL-types JAVA l Accès au méta-modèle l informations sur les possibilités du driver l description des objets du SGBD © Philippe GENOUD UJF Février 2004 5 JDBCJDBC Classes et interfaces de JDBCClasses et interfaces de JDBC classes Java.lang.Object Java.util.Date DriverManager DriverPropertyInfo Types Throwable Date Time TimeStamp Exception SQLException Charge et configure le driver client du SGBD BatchUpdateException SQLWarning DataTruncation Requètes SQL interfaces Driver Connection Statement ResultSet ResultSetMetaData DatabaseMetaData PreparedStatement Connexion et authentification Résultats des CallableStatement requètes auprès du SGBD © Philippe GENOUD UJF Février 2004 6
Trang 4
JDBCJDBC Classes et interfaces de JDBCClasses et interfaces de JDBC Requètes SQL interfaces Driver Oracle 8i Driver Connection Statement ResultSet ResultSetMetaData DatabaseMetaData PreparedStatement Connexion et authentification Résultats des auprès du SGBD CallableStatement requètes Les interfaces définissent une abstraction du pilote (driver) de la base de données. Driver MySql Chaque fournisseur propose sa propre implémentation de ces interfaces. Les classes d’implémentation du driver jdbc sont dans une archive (fichier jar ou zip) qu’il faut intégrer (sans le décompresser) au niveau du classpath de l’application au moment de l’exécution Au niveau du programme d’application on ne travaille qu’avec les abstractions (interfaces) sans ce soucier des classes effectives d’implémentation © Philippe GENOUD UJF Février 2004 7 JDBCJDBC Classes et interfaces de JDBCClasses et interfaces de JDBC l Objets instanciés à partir des types Java définis dans java.sql DriverManager DriverManager permet de créer des objets Connection Connection Connection Connection Un objet Connection permet de créer des objets encapsulant des requêtes SQL Statement PreparedStatement CallableStatement Les objets encapsulant les requêtes SQL permettent de créer des objets ResultSet encapsulant le résultat d’une requête ResultSet ResultSet ResultSet © Philippe GENOUD UJF Février 2004 8
Trang 5
JDBCJDBC 1) Chargement du driver l Avant de pouvoir être utilisé, le driver doit être enregistré auprès du DriverManager de jdbc. DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); l Mais si on regarde mieux la doc de JDBC... When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager. l Il est donc préférable d’exploiter les possibilités de chargement dynamique de classes de JAVA l Utiliser la méthode forName de la classe Class avec en paramètre le nom complet de la classe du driver. try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { ... } l Permet de paramètrer le driver sans modifier l’application (par exemple nom du driver stocké dans un fichier de configuration (properties file)) © Philippe GENOUD UJF Février 2004 9 JDBCJDBC 2) Connexion à la base l Ouverture de la connexion : Connection conn = DriverManager.getConnection(url, user, password); l Identification de la BD via un URL (Uniform Ressource Locator) de la forme générale jdbc:driver:base l'utilisation le driver ou le type identification de JDBC du SGBDR de la base La forme exacte dépend de la BD, chaque BD nécessitant des informations spécifiques pour établir la connexion. Par exemple pour le driver Oracle JDBC-Thin : jdbc:oracle:thin:@serveur:port:base nom IP du numéro de port nom de la serveur socket à utiliser base l Exemple : Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@hoff.imag.fr:1521:ufrima", user, password); © Philippe GENOUD UJF Février 2004 10
Trang 6
JDBCJDBC ConnexionsConnexions l Quand getConnection est invoquée le DriverManager interroge chaque driver enregistré, si un driver reconnaît l’url il crée et retourne un objet Connection. l Une application peut maintenir des connexions multiples l le nombre limite de connexions est fixé par le SGBD lui même (de quelques dizaines à des milliers). l Quand une Connection n ’a plus d’utilité prendre soin de la fermer explicitement. l Libération de mémoire et surtout des ressources de la base de données détenues par la connexion Connection con=null; try { con = DriverManager.getConnexion("jdbc:odbc:companydb","", ""); ... } catch (SQLException e) { ... } finally { try { con.close(); } catch (SQLEXception e) { e.printStackTrace(); } } © Philippe GENOUD UJF Février 2004 11 JDBCJDBC 3) Préparer/exécuter une requête l Une fois une Connection créée on peut l’utiliser pour créer et exécuter des requêtes (statements) SQL. l 3 types de statement : l Statement : requêtes simples (SQL statique) l PreparedStatement : requêtes précompilées (SQL dynamique si supporté par SGBD) qui peuvent améliorer les performances l CallableStatement : encapsule procédures SQL stockées dans le SGBD l 3 types d'exécutions : l executeQuery : pour les requêtes qui retournent un résultat (SELECT ) l résultat accessible au travers d ’un objet ResultSet l executeUpdate : pour les requêtes qui ne retournent pas de résultat (INSERT, UPDATE, DELETE, CREATE TABLE et DROP TABLE ) l execute : pour quelques cas rares (quand on ne sait pas si la requête retourne ou non un résultat, procédures stockées) © Philippe GENOUD UJF Février 2004 12
Trang 7
JDBCJDBC Préparer / exécuter une requête simple l Création d'un statement : Statement stmt = conn.createStatement(); l Exécution de la requête : String myQuery = "SELECT prenom, nom, email " + "FROM employe " + "WHERE (nom='Dupont') AND (email IS NOT NULL) " + "ORDER BY nom"; ResultSet rs = stmt.executeQuery(myQuery); l executeQuery() renvoit un objet de type ResultSet l permet de décrire la table des résultats © Philippe GENOUD UJF Février 2004 13 JDBCJDBC Lecture des résultats l executeQuery() renvoie un objet de classe ResultSet l permet de décrire la table des résultats java.sql.Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT nom, code_client FROM Clients"); Nom Prénom Code_client Adresse Nom Code_client DUPONT Jean 12345 135 rue du Lac DUPONT 12345 DUROND Louise 12545 13 avenue de la Mer DUROND 12545 ... ... ... ... ZORG Albert 45677 8 Blvd De la Montagne ZORG 45677 l Les rangées du ResultSet se parcourent itérativement ligne (row) par ligne l boolean next() permet d’avancer à la ligne suivante, ‡ false si pas de ligne suivante l Placé avant la première ligne à la création du ResultSet while (rs.next()) { ... Exploiter les données } © Philippe GENOUD UJF Février 2004 14
Trang 8
JDBCJDBC Lecture des résultats l Les colonnes sont référencées par leur numéro ou par leur nom l L'accès aux valeurs des colonnes se fait par des méthodes getXXX(String nomCol) ou getXXX(int numCol) où XXX représente le type de l'objet l Pour les très gros row, on peut utiliser des streams. java.sql.Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { Attention ! En SQL les numéros de colonnes int i = rs.getInt("a"); // rs.getInt(1); débutent à 1 String s = rs.getString("b"); // rs.getString(2); byte b[] = rs.getBytes("c"); // rs.getBytes(3); System.out.println("ROW = " + i + " " + s + " " + b[0]); } © Philippe GENOUD UJF Février 2004 15 JDBCJDBC Equivalences desEquivalences des types Java-SQLtypes Java-SQL l Pour chaque méthode getXXX le driver JDBC doit effectuer une conversion entre le type de données de la base de données et le type Java correspondant Type SQL Méthode Type Java CHAR getString String Peut être appelée sur n’importe quel type de valeur VARCHAR getString String NUMERIC getBigDecimal java.Math.BigDecimal DECIMAL getBigDecimal java.Math.getBigDecimal getObject peut retourner BIT getBoolean boolean Boolean n’importe quel type de donnée TINYINT getByte byte Integer « packagé » dans un objet java SMALLINT getShort short Integer (object wrapper) INTEGER getInt int Integer BIGINT getLong long Long REAL getFloat float Float getDouble double Double Si une conversion de données FLOAT invalide est effectuée (par ex DOUBLE getDouble double Double DATE -> int), une SQLException DATE getDate java.sql.Date est lancée TIME getTime java.sql.Time getObject TIME STAMP getTimestamp java.sql.Timestamp © Philippe GENOUD UJF Février 2004 16
Trang 9
JDBCJDBC Préparer/exécuter une requête simple l Un objet Statement représente une simple (seule) requête SQL. l Un appel à executeQuery() , executeUpdate() ou execute() ferme implicitement tout ResultSet actif associé avec l ’objet Statement. l Avant d ’exécuter une autre requête avec un objet Statement il faut être sûr d’avoir exploité les résultats de la requête précédente. Statement stmt = conn.createStatement(); Statement stmt = conn.createStatement(); ResultSet rs1 = stmt.executeQuery(myQuery1); ResultSet rs1 = stmt.executeQuery(myQuery1); ResultSet rs2 = stmt.executeQuery(myQuery2); //exploitation des résultats de myQuery1 while (rs1.next() { //exploitation des résultats de myQuery1 ... while (rs1.next() { } ... } ResultSet rs2 = stmt.executeQuery(myQuery2); //exploitation des résultats de myQuery2 //exploitation des résultats de myQuery2 while (rs2.next() { while (rs2.next() { ... ... } } l Si application nécessite d’effectuer plus d’une requête simultanément, nécessaire de créer et utiliser autant d ’objets Statement. © Philippe GENOUD UJF Février 2004 17 JDBCJDBC Préparer/exécuter une requête précompilée l Création d'un preparedStatement (requête SQL dynamique): l paramètres formels spécifiés à l ’aide de ? PreparedStatement ps = conn.prepareStatement( Dès que l ’objet est instancié, la "SELECT * FROM ? WHERE NAME = ? " procédure SQL est transmise au ); SGBD qui la compile l Passage des paramètres effectifs l à l ’aide de méthodes au format setXXX(indice,valeur) où XXX représente le type du paramètre ps.setString(1, "Person" ); l Invocation et exploitation des résultats l phase identique à celle utilisée pour SQL statique for (int i=0; i < names.length; i++) { ps.setString(2, names[i]) ; ResultSet rs = ps.executeQuery(); // ... Exploitation des résultats } © Philippe GENOUD UJF Février 2004 18
Trang 10
JDBCJDBC Procédures stockéesProcédures stockées l La plupart des SGBD incluent un langage de programmation interne (ex: PL/SQL d ’Oracle) permettant aux développeurs d’inclure du code procédural dans la BD, code pouvant être ensuite invoqué depuis d’autres applications. l le code est écrit une seule fois est peut être utilisé par différentes applications. l permet de séparer le code des applications de la structure interne des tables. (cas idéal : en cas de modification de la structure des tables seul les procédures stockées ont besoin d’être modifiées) l Utilisation des procédure stockées depuis JDBC indépendante de la manière dont celles-ci sont gérées par le SGBD l Utilisation possible de la valeur de retour l Gestion des paramètres IN, OUT, INOUT © Philippe GENOUD UJF Février 2004 19 JDBCJDBC Procédures stockéesProcédures stockées l Préparation de l ’appel Appel avec valeur de retour et paramètres CallableStatement proc = conn.callableStatement( "{? = call maProcedure(?,?)}"); Appel sans valeur de retour et avec paramètres CallableStatement proc = conn. callableStatement( "{call maProcedure(?,?)}"); l Préparation des paramètres proc.registerOUTParameter(2,Types.DECIMAL,3); 2ème paramètre de type OUT Nombre de chiffres après décimale l Passage des paramètres IN proc.setByte(1,25); 1er paramètre (type IN) valeur l Appel ResultSet rs = proc.executeQuery(); l Exploitation du ResultSet (idem que pour Statement et PreparedStatement) l Récupération des paramètres OUT java.Math.BigDecimal bigd = proc.getBigDecimal(2,3); © Philippe GENOUD UJF Février 2004 20
Trang 11
JDBCJDBC Accès aux méta-données l Permet de découvrir dynamiquement (au moment de l’exécution) des propriétés concernant la base de données ou les résultats de requêtes l Exemple : lors de l’exécution d’une requête non connue à l’avance. Renvoie String contenant une trueexecuteUpdate ??si requête de type Query requête quelconque falseexecuteQuery ??sinon (Update) Accès au ResultSet produit par la requête if (stmt.execute(cmd)stmt.execute(cmd)cmd ) { ResultSet rs = stmt.getResultSet(); ... //Exploitation du ResultSet Besoin d’accès aux méta- ... données du ResultSet rs.close(); } else System.out.println("nombre de lignes modifiées " + stmt.getUpdateCount() ); } © Philippe GENOUD UJF Février 2004 21 JDBCJDBC Accès aux méta-données l Permet de découvrir dynamiquement (au moment de l’exécution) des propriétés concernant la base de données ou les résultats de requêtes l La méthode getMetaData() de la classe Connection permet d'obtenir les méta-données concernant la base de donnée. l Elle renvoie un DataBaseSetMetaData. l On peut connaître : l les éléments SQL supportés par la base l la structure des données de celle-ci l La méthode getMetaData() de la classe ResultSet permet d'obtenir les méta-données d'un ResultSet. l Elle renvoie un ResultSetMetaData. l On peut connaître : l Le nombre de colonnes : getColumnCount() l Le nom d'une colonne : getColumnName(int col) l Le type d'une colonne : getColumnType(int col) l … © Philippe GENOUD UJF Février 2004 22
Trang 12
JDBCJDBC Gestion des transactionsGestion des transactions l L ’interface Connection offre des services de gestion des transactions l setAutoCommit(boolean autoCommit)définit le mode de la connexion (auto-commit par défaut) l commit()déclenche validation de la transaction l rollback()annule la transaction try { con.setAutoCommit(false); // exécuter les instructions qui constituent la transaction stmt.executeUpdate("UPDATE INVENTORY SET ONHAND = 10 WHERE ID = 5"); stmt.executeUpdate("INSERT INTO SHIPPING (QTY) VALUES (5)"); ... // valide la transaction con.commit() } catch (SQLException e) { con.rollback(); // annulle les opérations de la transaction } © Philippe GENOUD UJF Février 2004 23 JDBCJDBC A propos de SQLExceptionA propos de SQLException l SQLException définit les méthodes suivantes : l getSQLState() : --> un code d’état de la norme SQL ANSI-92 l getErrorCode() : --> un code d ’erreur specifique (« vendor-spécific ») l getNextException() : --> permet aux classes du JDBC de chaîner une suite de SQLExceptions // du code très consciencieux try { ... } catch (SQLException e) { while (e != null) { System.out.println("SQL Exception"); System.out.println(e.getMessage()); System.out.println("ANSI-92 SQL State : "+e.getSQLState()); System.out.println("Vendor error code : "+e.getErrorCode()); e = e.getNextException(); } } © Philippe GENOUD UJF Février 2004 24
Trang 13
JDBCJDBC SQLWarningSQLWarning l Les classes du JDBC ont la possibilité de générer sans les lancer des exceptions quand un problème est intervenu mais qu’il n’est pas suffisamment grave pour interrompre le programme l Exemple : fixer une mode de transaction qui n’est pas supporté la base de données cible (un mode par défaut sera utilisé) l SQLWarning encapsule même information que SQLException l Pour les récupérer pas de bloc try catch mais à l’aide de méthode getWarnings des interfaces Connection, Statement, ResultSet, PreparedSatement, CallableStatement void printWarninsg(SQLWarning warn) { while (warn != null) { System.out.println("\nSQL Warning"); System.out.println(warn.getMessage()); System.out.println("ANSI-92 SQL State : "+warn.getSQLState()); System.out.println("Vendor error code : "+warn.getErrorCode()); warn = warn.getNextException(); } } ... ResultSet rs = stmt.executeQuery("SELECT * FROM CLIENTS"); printWarnings( stmt.getWarnings() ); printWarnings( rs.getWarnings() ); ... © Philippe GENOUD UJF Février 2004 25 JDBCJDBC Api JDBC 2.0Api JDBC 2.0 l JDBC 1.0 l package supplémentaire (add-on) pour JDK 1.0 l intégré l’API de base (core API) du JDK 1.1 l JDBC 2.0 l spécification par SUN en mai 1998 lextensions pour « meilleure » gestion des résultats (ResultSets « scrollables », «modifiables ») lsupport pour BLOBs (Binary Large Objects) et CLOBs (Character Large Objects) l… l intégré à l ’API de Java 2 (JDK 1.2) l compatibilité avec la version 1.0 l code écrit pour JDBC 1.0 compile et fonctionne avec version 2.0 de l ’API © Philippe GENOUD UJF Février 2004 26
Trang 14
JDBCJDBC ResultSet JDBC 2.0ResultSet JDBC 2.0 l Par défaut lorsque l’on crée un Statement les objets ResultSet sont en lecture seule (read only) et à accès séquentiel (forward only) public Statement createStatement() throws SQLException Statement stmt = conn.createStatement(); l Avec JDBC 2.0 possibilité de créer des ResultSet l « Scrollable » l plus de limitation à un parcours séquentiel l « Updateable » l possibilité de modifier les données dans la BD public Statement createStatement(int resultSetType, int resultSetConcurrency) ResultSet.TYPE_FORWARD_ONLY ResultSet.CONCUR_READ_ONLY ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.CONCUR_UPDATABLE ResultSet.TYPE_SCROLL_SENSITIVE Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE , ResultSet.CONCUR_UPDATABLE); © Philippe GENOUD UJF Février 2004 27 JDBCJDBC ResultSet JDBC 2.0ResultSet JDBC 2.0 l Méthodes de parcours first() Positionne sur la première ligne (1er enregistrement) last() Positionne sur la dernière ligne (dernier enregistrement) next() Passe à la ligne suivante previous() Passe à la ligne précédante beforeFirst() Positionne avant la première ligne afterLast() Positionne après la dernière ligne absolute(int) Positionne à une ligne donnée relative(int) Déplacement d’un nombre de lignes donné par rapport à ligne courante l Méthodes de test de la position du curseur boolean isFirst() True si curseur positionné sur la première ligne boolean isBeforeFirst() True si curseur positionné avant la première ligne boolean isLast() True si curseur positionné sur la dernière ligne boolean isAfterLast() True si curseur positionné après la dernière ligne © Philippe GENOUD UJF Février 2004 28
Trang 15
JDBCJDBC ResultSet JDBC 2.0ResultSet JDBC 2.0 l Modification du ResultSet l Se placer sur le rang concerné l Méthodes updateXXX(…) l Puis updateRow() l le faire avant de déplacer le curseur sur une autre ligne Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.TYPE_CONCUR_UPDATEABLE); ResultSet rs = stmt.executeQuery("SELECT NOM,ID_CLIENT FROM CLIENTS); rs.first(); rs.updateInt(2,151970); rs.updateRow(); © Philippe GENOUD UJF Février 2004 29 JDBCJDBC ResultSet JDBC 2.0ResultSet JDBC 2.0 l Insertion d’une ligne l moveToInsertRow() l Méthodes Méthodes updateXXX(…) l Puis insertRow() ResultSet rs = stmt.executeQuery("SELECT NOM,ID_CLIENT FROM CLIENTS); rs.moveToInsertRow(); rs.updateString(1,"Jacques OUILLE"); rs.updateInt(2,151970); rs.updateRow(); l Si aucune valeur n’est spécifiée pour une colonne n’acceptant pas la valeur nul, une SQLException est lancée. l moveToCurrentRow() permet de se repositionner sur la ligne courante avant l’appel à moveToInsertRow() l Suppression d’une ligne l Se placer sur la ligne l deleteRow() rs.last(); rs.deleteRow(); © Philippe GENOUD UJF Février 2004 30
Trang 16
JDBCJDBC ResultSet JDBC 2.0ResultSet JDBC 2.0 l Tous les ResultSet ne sont pas nécessairement modifiables l En général la requête ne doit référencer qu’une seule table sans jointure l Tous les drivers JDBC ne supportent pas nécessairement et entièrement les ResultSet « scrollable » et « updateable » l l’objet DataBaseMetaData fournit de l’information quant au support proposé pour les ResultSet l Il faut être prudent si le logiciel que l’on écrit doit interagir avec une grande variété de drivers JDBC © Philippe GENOUD UJF Février 2004 31 JDBCJDBC javax.sqljavax.sql l javax.sql package d’extension standard de JDBC l Pour les applications J2EE (Java 2 Entreprise Edition) l Inclus en standard dans J2SE (Java 2 Standard Edition) depuis version 1.4 l DataSource : Obtention du nom de la base à partir de serveurs de noms plutôt que d’avoir le nom de la base de données codé « en dur » dans l’application. l Utilisation de JNDI (Java Naming and Directory Interface) pour connexion à une base de donnée l PooledConnection : support pour gestion d’un « pool » de connexion l gestion d’un cache des connexion ouvertes l évite la création de nouvelles connexions (ce qui est coûteux) l RowSet : permet de traiter les résultats des requêtes comme des composants JavaBeans l Support pour les transactions distribuées © Philippe GENOUD UJF Février 2004 32
Trang 17
JDBCJDBC Pour conclure : Un exemple « complet » import java.sql.*; public class TestJDBC { public static void main(String[] args) throws Exception { Class.forName("postgres95.pgDriver"); Connection conn = DriverManager.getConnection("jdbc:pg95:mabase", "dedieu", ""); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * from employe"); while (rs.next()) { String nom = rs.getString("nom"); String prenom = rs.getString("prenom"); String email = rs.getString("email"); } rs.close(); stmt.close(); conn.close(); } } © Philippe GENOUD UJF Février 2004 33 JDBCJDBC bibliographiebibliographie l Java Entreprise in a Nutshell, David Flannagan, Jim Farley, William Cawford et Kris Magnusson, Ed. O ’Reilly , 1999 l Database programming with JDBC and Java, George Reese, Ed. O ’Reilly, 1998 l Tutoriaux en ligne l JDBCshort course http://developer.java.sun.com/developer/onlineTraining/Database/ JDBCShortCourse/index.html l Applications : JDBCTest permet de tester via une interface graphique les différentes fonctionnalités proposées par le JDBC et de voir le code Java correspondant. (http://developer.java.sun.com/developer/onlineTraining/Database/ JDBCShortCourse/jdbc/exercises/JDBCTestConnect/index.html) Home: jdbcmanager.sourceforge.net JDBC Explorer is an open source front-end for Data Base Management Systems that supports visualization and editing (if the corresponding JDBC driver supports ResultSets). Any JDBC database is supported, in the screenshots below you can see the app in action browsing MySQL, MS SQL Server 2000, SAP DB - Ver.7.3. Home: qform.sourceforge.net QueryForm is a GPL'd open source GUI database front-end that, in the words of developer Dave Glasser (email: dglasser@pobox.com), "uses table metadata to build forms on-the-fly through which you can enter queries, browse results, and add, update or delete rows". © Philippe GENOUD UJF Février 2004 34
Trang 18
JDBCJDBC Drivers JDBCDrivers JDBC l 4 catégories de drivers JDBC l type 1 : Pont JDBC-ODBC (Open Data Base Connectivity) ODBC Application Java • interface d’accès (C) aux SGBD définie par Microsoft JDBC (java.sql) DriverManager • standard de fait, très grand nombre de SGBD accessibles Driver type 1 (JDBC/ODBC Bridge) Driver manager ODBC impose chargement dans la mémoire vive de la plateforme d’exécution de librairies dynamiques Driver ODBC Interface client SGBD code binaire ODBC sur le client • alourdit processus d ’installation et de maintenance Interface serveur • problème de sécurité pour les applets SGBD • applets « untrusted » n’ont pas l ’autorisation de charger en mémoire du code natif © Philippe GENOUD UJF Février 2004 35 JDBCJDBC Drivers JDBCDrivers JDBC l Type 2 : API native Application Java JDBC (java.sql) DriverManager interface d’accès entre le driver manager JDBC et l ’interface cliente du SGBD Driver type 2 impose chargement dans la mémoire vive de la Interface client SGBD plateforme d’exécution de librairies dynamiques (code binaire de l ’interface client spécifique au SGBD par exemple librairies OCI, Oracle Call Interface, conçues initialement pour programmeurs C/C++ ) Interface serveur SGBD Driver dédié à un SGBD particulier • moins ouvert que pont JDBC/ODBC • potentiellement plus performant (moins de couches logicielles) mêmes problèmes qu’avec pont JDBC-ODBC • code natif sur plateforme d ’exécution © Philippe GENOUD UJF Février 2004 36
Trang 19
JDBCJDBC Drivers JDBCDrivers JDBC l Type 3 : JDBC-Net Application Java JDBC (java.sql) DriverManager traduit appels JDBC suivant un protocole réseau à vocation universelle indépendant des Driver type 3 fournisseurs de SGBD (Sql*net, NET8) Interface serveur middleware requêtes réseau doivent être ensuite traduites par un serveur dédié aux requêtes spécifiques à un Interface client SGBD SGBD (par exemple WebLogic de BEA) middleware drivers 100% Java peuvent être utilisés depuis une applet (les drivers ne sont plus Interface serveur du code natif et peuvent être chargés comme n’importe quel SGBD composant Java) si l ’application est une applet, le modèle classique de sécurité peut poser des problème de connexion réseau • une applet « untrusted » ne peut ouvrir une connexion qu’avec la machine sur laquelle elle est hébergée • il suffit d ’installer le serveur Web et le serveur middleware sur la même plateforme. Possibilité d ’accéder alors à un SGBD situé n ’importe où sur le réseau. © Philippe GENOUD UJF Février 2004 37 JDBCJDBC Drivers JDBCDrivers JDBC l Type 4 : Thin (protocole natif) le driver interagit directement avec le gestionnaire du SGBD Application Java utilise directement protocole réseau du SGBD (spécifique à un fournisseur de SGBD) JDBC (java.sql) DriverManager Driver type 4 Driver 100% Java (connexion via sockets Java) Interface serveur Solution la plus la plus élégante et la plus souple SGBD si l ’application est une applet, le modèle classique de sécurité des applets impose que le SGBD soit hébergé sur le serveur Web Durant le projet le driver utilisé pour accéder à Oracle sera de ce type © Philippe GENOUD UJF Février 2004 38
Trang 20
JDBCJDBC Drivers JDBCDrivers JDBC l Liste des drivers disponibles à : http://java.sun.com/products/jdbc/jdbc.drivers.html l sélection d’un driver : l choix entre vitesse, fiabilité et portabilité. l Programme « standalone », avec une interface graphique qui s’exécute toujours sur un système Windows NT peut tirer bénéfice de performances d’un driver type 2 (driver code-natif). l Une applet peut nécessiter un driver de type 3 (pour passer un firewall). l Une servlet déployée sur de multiples plateformes peut nécessiter la souplesse offerte par des drivers de type 4. l ... © Philippe GENOUD UJF Février 2004 39
Hiển thị 20 trang đầu. Tải tài liệu để xem đầy đủ.
Bình luận (0)
Chưa có bình luận nào. Hãy là người đầu tiên!