JDBC
JDBC
le langage Java
XVI-1
JMF
JDBC
le langage Java
JDBC
JDBC est une API Java (ensemble de classes et d'interfaces dfini par SUN et les acteurs du domaine des BD) permettant d'accder aux bases de donnes l'aide du langage Java via des requtes SQL. Cette API permet d'atteindre de manire quasi-transparente des bases Sybase, Oracle, Informix, ... avec le mme programme Java JDBC. En fait cette API est une spcification de ce que doit implanter un constructeur de BD pour que celle ci soit interrogeable par JDBC. De ce fait dans la programmation JDBC on utilise essentiellement des rfrences d'interface (Connection, Statement, ResultSet, ...). Sun et les constructeurs de BD se sont charger de fournir (vendre ou donner) des classes qui implmentent les interfaces prcites qui permettent de soumettre des requtes SQL et de rcuprer le rsultat. Par exemple Oracle fournit une classe qui, lorsqu'on crit Statement stmt = conn.createStatement(); retourne un objet concret (de classe class OracleStatement implements Statement par exemple) qui est repr par la rfrence stmt de l'interface Statement.
XVI-2
JMF
JDBC
le langage Java
Pilotes (drivers)
L'ensemble des classes qui implmentent les interfaces spcifies par JDBC pour un gestionnaire de bases de donnes particulier est appel un pilote JDBC. Les protocoles d'accs aux BD tant propritaires il y a donc plusieurs drivers pour atteindre diverses BD. Parmi les interfaces, l'une d'entre elles, l'interface Driver, dcrit ce que doit faire tout objet d'une classe qui implmente l'essai de connexion une base de donnes. Entre autre, un tel objet doit obligatoirement s'enregistrer auprs du DriverManager et retourner en cas de succs un objet d'une classe qui implmente l'interface Connection. Ces pilotes (drivers) sont dits jdbc-baseAAtteindre. Le premier pilote (dvelopp par SUN) est un pilote jdbc:odbc. La liste des pilotes disponibles se trouve : http://industry.java.sun.com/products/j dbc/drivers
XVI-3
JMF
JDBC
le langage Java
Architecture JDBC
programme Java (dvelopp par le programmeur i.e. vous mme) (donn par SUN i.e. est une classe Java) (donn ou vendu par un fournisseur d'accs la BD)
bases de donnes
XVI-4
JMF
JDBC
le langage Java
XVI-5
JMF
JDBC
le langage Java
Syntaxe
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conX = DriverManager.getConnection(...); Statement stmt = conX.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c ... FROM ... WHERE ..."); while (rs.next()) { ... // traitement }
XVI-6
JMF
JDBC
le langage Java
XVI-7
JMF
JDBC
le langage Java
Chargement du pilote
On commence un programme JDBC en chargeant dans le programme, le pilote appropri pour la BD. Comme le programme peut interroger divers types de BD il peut avoir plusieurs pilotes. C'est au moment de la connexion que sera choisi le bon pilote par le DriverManager. On a donc une architecture :
programme Java JDBC API gestionnaire de pilotes JDBC pilote A pont JDBC-ODBC pilote ODBC pilote B
bases de donnes
bases de donnes
bases de donnes
Syntaxe :
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
ou encore
Class.forName("oracle.jdbc.driver.OracleDriver");
XVI-8
JMF
JDBC
le langage Java
XVI-9
JMF
JDBC
le langage Java
XVI-10
JMF
JDBC
le langage Java
La connexion
On ouvre une connexion avec une des mthodes DriverManager.getConnection(...) qui retourne un objet d'une classe qui implmente l'interface Connection. Ces mthodes contiennent comme premier argument une "URL JDBC". Elles recherchent le pilote adapt pour grer la connexion avec la base repre par cette URL. Une URL JDBC doit commencer par jdbc. Le second argument est le protocole sous jacent dans lequel le pilote traduit. Le troisime argument est un identificateur de base de donnes. La syntaxe d'une URL JDBC est donc: jdbc:<sous-protocole>:<baseID> la partie baseID est propre au sous-protocole. Exemples d'URL JDBC : jdbc:odbc:test1 ou encore jdbc:odbc:@orsay:1751:test1 jdbc:oracle:thin:@orsay:1751:test1 Les arguments suivants de Driver.getConnection(...) sont des informations ncessaires l'ouverture de la connexion souvent un nom de connexion la base suivi d'un mot de passe.
Connection conX = DriverManager.getConnection(URLjdbc, "dbUser1", "pwuser1");
XVI-11
JMF
JDBC
le langage Java
La classe DriverManager
Cette classe est une classe qui ne contient que des mthodes statiques. Elle fournit des mthodes qui sont des utilitaires pour grer l'accs aux bases de donnes par Java et les diffrents drivers JDBC l'intrieur d'un programme Java. Finalement on ne cre ni ne rcupre d'objet de cette classe.
XVI-12
JMF
JDBC
le langage Java
XVI-13
JMF
JDBC
le langage Java
XVI-14
JMF
JDBC
le langage Java
. . .
. . .
. . .
Un pointeur gr par Java jdbc permet de parcourir tout le ResultSet et est initialis : il est automatiquement positionn avant la premire ligne de rsultat. On parcourt alors tout le ResultSet pour avoir l'ensemble des rponses la requte. La boucle de parcours est :
while( rs.next() ) { // traitement }
XVI-15
JMF
JDBC
le langage Java
On peut aussi dsigner les colonnes par leur nom dans la BD (c'est moins rapide mais plus lisible) et rcrire :
ResultSet rs = stmt.executeQuery("SELECT nom, prenom, age, date FROM LaTable"); String leNom = rs.getString( "nom") ); String lePrenom = rs.getString( "prenom" ); int lage = rs.getInt ( "age" ); Date laDate = rs.getDate( "date ");
XVI-16
JMF
JDBC
le langage Java
XVI-17
JMF
JDBC
le langage Java
un pilote la base de donnes a t trouv par le programme (et la classe DriverManager) parmi les nombreux pilotes qui ont pu tre chargs la suite d'instructions
Class.forName("piloteToBD");
Ce pilote a t capable de faire une connexion la base et de retourner un objet d'une classe qui implmente l'interface Connection. La classe est peut-tre OracleConnection ou SUN_JDBC_ODBC_Connection, peu importe l'essentiel est que cette classe implmente cette interface et qu'on puisse alors repr cet objet par une rfrence d'interface Connection (polymorphisme !!). Voila pourquoi le code que nous crivons est universel et permet d'accder tout type de base.
XVI-18
JMF
JDBC
le langage Java
Le fonctionnement (suite)
Par la suite cet objet repr par conX va retourner, la suite de l'instruction,
Statement smt = conX.createStatement();
un objet d'une classe qui implmente l'interface Statement et qui est propre la base (par exemple OracleStatement ou SUN_JDBC_ODBC_Statement, peu importe l'essentiel est que cette classe implmente l'interface Statement et qu'on puisse alors reprer cet objet par une rfrence d'interface Statement air connu). Enfin l'instruction
ResultSet rs = smt.executeQuery( "SELECT * FROM Livres" );
demande le lancement de la mthode executeQuery(...) sur un objet d'une classe qui implmente Statement et qui est propre la base et cela fonctionne et est universel (pour la troisime fois ;-)).
XVI-19
JMF
JDBC
le langage Java
PreparedStatement
Lors de l'envoi d'une requte pour excution 4 tapes doivent tre faites : - analyse de la requte - compilation de la requte - optimisation de la requte - excution de la requte et ceci mme si cette requte est la mme que la prcdente !! Or les 3 premires tapes ont dja t effectues dans ce cas. Les bases de donnes dfinissent la notion de requte prpare, requte o les 3 premieres tapes ne sont effectues qu'une seule fois. JDBC propose l'interface PreparedStatement pour modliser cette notion. Cette interface drive de l'interface Statement. De plus on ne peut pas avec un Statement construire des requtes o un des arguments est une variable i.e. requtes paramtres. Il faut pour cela utiliser un PreparedStatement.
XVI-20
JMF
JDBC
le langage Java
PreparedStatement : Syntaxe
Mme sans paramtres, les PreparedStatement ne s'utilisent pas comme des Statement. Au lieu d'crire :
Statement smt = conX.createStatement(); ResultSet rs = smt.executeQuery( "SELECT * FROM Livres" );
on crit :
PreparedStatement pSmt = conX.prepareStatement("SELECT * FROM Livres" ); ResultSet rs = pSmt.executeQuery();
savoir la requte est dcrite au moment de la "construction" pas lors de l'excution qui est lance par executeQuery() sans argument.
XVI-21
JMF
JDBC
le langage Java
Requtes paramtres
On utilise donc les PreparedStatement et on crit des requtes de la forme : SELECT nom FROM Personnes WHERE age > ? AND adresse = ? Puis on utilise les mthodes setType(numroDeLArgument, valeur) pour positionner chacun des arguments. Les numros commencent 1 dans l'ordre d'apparition dans la requte. On a donc un code comme :
PreparedStatement pSmt = conX.prepareStatement("SELECT nom FROM Personnes WHERE age > ? AND adresse = ?" ); pSmt .setInt(1, 22); pSmt .setString(2, "Turin"); ResultSet rs = pSmt.executeQuery();
XVI-22
JMF
JDBC
le langage Java
CallableStatement
Certaines requtes pour une base de donnes sont si courantes qu'elles sont intgres dans la base de donnes. On les appelle des procdures stockes et elles ont modlises en JDBC par l'interface CallableStatement qui drive de PreparedStatement. Elle peut donc avoir des paramtres. On lance l'xcution d'une procdure stocke l'aide de la syntaxe : {call nom_Procedure[(?, ?, ...)]} ([ ] signifiant optionnel) Pour une procdure retournant un rsultat on a la syntaxe : {? = call nom_Procedure[(?, ?, ...)]} La syntaxe pour une procdure stocke sans paramtres est : {call nom_Procedure} Utilisation :
CallableStatement cStmt = conX.prepareCall("{call sp_setDomicile(?, ?) }"); cStmt.setString(1, "Djorkaeff"); cStmt.setString(2, "KaisersLautern"); cSmt.executeUpdate();
XVI-23
JMF
JDBC
le langage Java
les MetaData
On peut avoir sur une BD, des informations sur la BD elle mme. Ces informations sont appeles des mtadatas. On obtient un objet de la classe DatabaseMetaData partir de la connexion par :
conX = DriverManager.getConnection(dbURL, "u1db1", "u1db1"); DatabaseMetaData dmd = conX.getMetaData();
partir de l, cette classe fournit beaucoup de renseignements sur la base par exemple :
String nomSGBD = dmd.getDatabaseProductName();
XVI-24
JMF
JDBC
le langage Java
JDBC 2.0
Des ajouts ont t faits aux spcifications JDBC 1.0 et beaucoup d'interfaces et de classes de java.sql ont t enrichis. De plus certains ajouts sont implants dans le paquetage javax.sql. Les ajouts de JDBC 2.0 concernent : - des nouvelles possibilits de traiter les ResultSet (autrement que squenciellement, ...) - le traitement par batch - des types de donnes avancs - la notion d'ensemble de lignes manipulables mme sans connexion maintenue ouverte : les RowSet. - l'utilisation du service de nommage universel de Java, JNDI - l'utilisation du service de transaction de Java JTS.
XVI-25
JMF
JDBC
le langage Java
XVI-26
JMF
JDBC
le langage Java
XVI-27
JMF
JDBC
le langage Java
XVI-28
JMF
JDBC
le langage Java
Bibliographie
Livre JDBC et Java Guide du programmeur, George Reese edition O'Reilly, ISBN 2-84177-042-7 Les spcifications JDBC sont : http://java.sun.com/products/jdk/1.3/do cs/guide/jdbc/getstart/GettingStartedTO C.fm.html La page de dpart de la technologie JDBC http://java.sun.com/products/jdk/1.3/do cs/guide/jdbc/index.html le tutorial de SUN sur JDBC http://www.javasoft.com/docs/books/tuto rial/jdbc/index.html Bases de donnes MS-Access, Conception et programmation, Steven Roman traduit en franais; ed O'Reilly ISBN 2-84177-054-0 Merci Henri ANDR pour ses remarques et suggestions.
XVI-29
JMF