100% ont trouvé ce document utile (2 votes)
53 vues29 pages

JDBC

Transféré par

sowhat-01
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
100% ont trouvé ce document utile (2 votes)
53 vues29 pages

JDBC

Transféré par

sowhat-01
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

JDBC

le langage Java

J DB C Java Database Connectivity

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)

gestionnaire de pilotes JDBC pilote

bases de donnes

XVI-4

JMF

JDBC

le langage Java

Les 4 types de pilotes


Les pilotes sont classs en quatre types : Ceux dits natifs qui utilisent une partie crite dans du code spcifique non Java (souvent en langage C) et appel par ces implantations : les pilotes de classe 1 et 2. Ces pilotes sont rapides mais doivent tre prsent sur le poste client car ne peuvent pas tre tlchargs par le ClassLoader de Java (ce ne sont pas des classes Java mais plutt des librairies dynamiques). Ils ne peuvent donc pas tre utiliss par des applets dans des browsers classiques. Ceux dits 100% Java qui interrogent le gestionnaire de base de donnes avec du code uniquement crits en Java : les pilotes de classe 3 et 4. Ces pilotes peuvent alors tre utiliss par des applets dans des browsers classiques. Plus prcisment : pilote de classe 1 : pilote jdbc:odbc pilote de classe 2 : pilote jdbc:protocole spcifique et utilisant des mthodes natives. pilote de classe 3 : pilote crit en Java jdbc vers un middleware qui fait l'interface avec la BD pilote de classe 4 : pilote crit en Java jdbc:protocole de la BD. Accde directement l'interface rseau de la BD.

XVI-5

JMF

JDBC

le langage Java

Structure d'un programme JDBC


Un code JDBC est de la forme : - recherche et chargement du driver appropri la BD. - tablissement de la connexion la base de donnes. - construction de la requte SQL - envoi de cette requte et rcupration des rponses - parcours des rponses.

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 }

La programmation avec JDBC


On utilise le paquetage java.sql. La plupart des mthodes lvent l'exception java.sql.SQLException.

XVI-6

JMF

JDBC

le langage Java

Les produits JDBC


Javasoft fournit 3 produits composants intgr dans le JDK (1.1 et suivant) : - un gestionnaire de pilotes JDBC. Le gestionnaire de pilotes JDBC permet de connecter les programmes Java au bon pilote JDBC. - un pont JDBC-ODBC - un ensemble de tests pour les pilotes JDBC. Voir http://www.javasoft.com:80/products/jdb c/download2.html la partie "The JDBC Driver Test Suite". Les tests pour les pilotes JDBC vrifient que le pilote implmente la "norme" JDBC COMPLIANT et l'implmentation de toutes les classes et mthodes JDBC ainsi que les fonctionnalits ANSI SQL-2 Entry Level (norme ANSI 1992)

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

Chargement du pilote (suite)


En fait cette instruction construit un objet de la classe Class qui modlise la classe dont le nom est l'argument de la mthode statique forName(...). Cette classe est un driver c'est dire ici une classe qui implmente l'interface Driver. Dans les spcifications de JDBC il est dit qu'obligatoirement ces classes doivent, au moment de leur premier chargement : - crer une instance de cette classe - enregistrer cette instance au sein du DriverManager par la mthode statique registerDriver(...) de cette classe. voir http://java.sun.com/products/jdk/1.1/do cs/guide/jdbc/getstart/drivermanager.do c.html#999050 "All Driver classes should be written with a static section that creates an instance of the class and then registers it with the DriverManager class when it is loaded. Thus, a user would not normally call DriverManager.registerDriver directly; it should be called automatically by a driver when it is loaded. A Driver class is loaded, and therefore automatically registered with the DriverManager"

XVI-9

JMF

JDBC

le langage Java

Chargement du pilote (fin)


Exercice : concrtement comment cela est il crit ? rponse : Quand vous crivez une classe MonDriver implmentant l'interface Driver cette classe doit contenir le bloc static suivant
static { DriverManager.registerDriver(new MonDriver()); }

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

Requtes au bases de donnes


Sans trop rentrer dans les dtails (voir un cours de bases de donnes pour cela), il existe diffrentes sortes de requtes SQL dont : - les requtes SELECT qui oprent sur une ou plusieurs tables et placent le rsultat dans une "table" rsultante. - les requtes d'action qui modifient une ou des colonnes ou lignes de table. On a par exemple comme requte d'action UPDATE, DELETE, APPEND. - des SQL DDL (Data Definition Language) comme CREATE TABLE, DROP TABLE, ... SQL est un langage non sensible la casse (culture IBMSQL et non pas culture Unix-C). En gnral les mots cls du langage SQL sont mis en majuscules. Syntaxiquement en Java on utilise executeQuery(...) si la requte est une requte SELECT et executeUpdate(...) si a requte est une requte d'action ou une SQL DDL.

XVI-13

JMF

JDBC

le langage Java

Excution d'instructions SQL


Toutes les instructions ANSI SQL-2 Entry Level sont accepts puisque le driver jdbc:protocole SGBD sous-jacent a t test pour cela. On utilise l'un des trois interfaces Statement, PreparedStatement, CallableStatement. Les instructions PreparedStatement sont prcompiles. On utilise CallableStatement pour lancer une procdure du SGBD. Avec un Statement on a :
Statement smt = conX.createStatement(); ResultSet rs = smt.executeQuery( "SELECT * FROM Livres" );

XVI-14

JMF

JDBC

le langage Java

Rcupration des rsultats (suite)


Les rsultats des requtes SELECT ont t mis dans un ResultSet. Cet objet rcupr modlise le rsultat qui peut tre vu comme une table. Par exemple SELECT nom, prenom, adresse FROM Personnes retourne un ResultSet qui modlise :
Zidane Blanc Deschamps Zinedine Laurent Didier Turin Milan Londres

. . .

. . .

. . .

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

Rcupration des rsultats (fin)


Les colonnes demandes par la requte sont numrotes partir de 1 (culture IBM-SQL et non pas culture Unix-C). Remarque La numrotation est relative l'ordre des champs de la requte et non pas l'ordre des champs de la table interroge (videmment). De plus les colonnes sont types en type SQL. Pour rcuprer une valeur de colonne il faut donc indiquer le numro de la colonne ou son nom et faire la conversion de type appropri. Par exemple :
Statement stmt = ...; ResultSet rs = stmt.executeQuery(SELECT nom, prenom, age, date FROM LaTable"); String leNom = rs.getString( 1 ) ); String lePrenom = rs.getString( 2 ); int lage = rs.getInt ( 3 ); Date laDate = rs.getDate( 4);

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

Correspondance type SQL-type Java


Les correspondances entre type SQL et type Java sont donnes par les spcifications JDBC. En voici certaines : SQL type CHAR VARCHAR LONGVARCHAR NUMERIC DECIMAL BIT TINYINT SMALLINT INTEGER BIGINT REAL FLOAT DOUBLE BINARY VARBINARY LONGVARBINARY DATE TIME TIMESTAMP Java Type String String String java.math.BigDecimal java.math.BigDecimal boolean byte short int long float double double byte[] byte[] byte[] java.sql.Date java.sql.Time java.sql.Timestamp

XVI-17

JMF

JDBC

le langage Java

Conclusion : finalement comment cela fonctionne ?


Aprs l'instruction
Connection conX = DriveManager.getConnection(URLjdbc, "dbUser1", "pwuser1");

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();

De mme on peut avoir des mtadatas sur un ResultSet :


//Affichage des colonnes de la table rs = smt.executeQuery( "SELECT * FROM Livres " ); ResultSetMetaData rsmd = rs.getMetaData(); int numCols = rsmd.getColumnCount(); for ( int i = 1; i <= numCols; i++ ) System.out.println( "\t" + i + " : " + rsmd.getColumnLabel( i ) );

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

Traitement avanc des ResultSet


Essentiellement JDBC 2.0 propose sur les ResultSet des dplacements (scrolling) et des mises jour (updatability). Les dplacements peuvent tre relatifs ou absolus. Les ResultSet sont dsormais de 3 "types" : - forwardonly - scroll-insensitive. Le ResultSet admet les dplacements et n'est pas averti des changements dans la base le concernant. - scroll-sensitive. Le ResultSet admet les dplacements et n'est pas averti des changements dans la base le concernant. Ils peuvent aussi avoir des "types de concurrence" : readonly ou updatable. Utilisation :
Statement stmt = conX.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); stmt.setFetchSize(25); ResultSet rs = stmt.executeQuery( "SELECT emp_no, salary FROM employees");

XVI-26

JMF

JDBC

le langage Java

Traitement avanc des ResultSet (suite)


Un ResultSet updatable (de type CONCUR_UPDATABLE) peut mettre jour, insrer, dtruire certaines de ses lignes. Ces modifications sont faites sur le ResultSet pas dans la base. Elles seront faites dans la base l'aide de la mthode updateRow() Exemple :
rs.first(); rs.updateString(1, "100020"); rs.updateFloat("salary", 10000.0f); rs.updateRow();

voir : http://java.sun.com/products/jdk/1.3/do cs/guide/jdbc/spec2/jdbc2.1.frame5.html

XVI-27

JMF

JDBC

le langage Java

Traitement avanc des ResultSet (suite)


Mouvement avanc du curseur. JDBC 2.0 permet de lancer sur un ResultSet les mthodes : public boolean absolute(int row) throws SQLException public boolean relative(int rows) throws SQLException public boolean previous() throws SQLException public void afterLast() throws SQLException public void beforeFirst() throws SQLException

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

Vous aimerez peut-être aussi