Vous êtes sur la page 1sur 34

Pr Y.

Lefdaoui

Accs JDBC

Plan du cours
Principes
Architecture Pilotes JDBC Mise en uvre d une application Java-JDBC Accs aux mta-donnes

Pr Y.Lefdaoui

Accs JDBC

Principes de JDBC
Dfinir des donnes Rechercher des donnes Manipuler des donnes

Les standards JDBC sont dfinis pour permettre

une application Java d accder une base de donnes :

JDBC est un middleware destin aux applications et

applets Java

Il existe 2 types de pilotes JDBC pour Oracle :


les pilotes JDBC utiliss par les machines virtuelles Java standard un pilote JDBC spcifique pour les mthodes Java excutes par Oracle Jserver

Pr Y.Lefdaoui

Accs JDBC

Architecture dune application multi-tiers


CLIENT Lger Applet Java Oracle 8i

HTTP

Serveur d application Applet Java

SQL

PL/SQL

Net8
CLIENT LOURD J Application D Java B C
Pr Y.Lefdaoui Accs JDBC

Procdures Java

Net8

Architecture multi-tiers avec JDBC


Dploiement client lourd :
L application accde la BD via JDBC par le protocole

Net8 L application ncessite un poste de travail dit client lourd : elle ralise la fois des oprations sur les donnes et l affichage de ces donnes.

Dploiement client lger :


Le client est un navigateur web qui communique avec un

serveur dapplications par le protocole HTTP Le client ne ralise aucun traitement sur les donnes Le serveur d applications recueille les donnes par une connexion JDBC, puis les traite et transmet le rsultat au client lger.
Pr Y.Lefdaoui Accs JDBC 5

Les pilotes JDBC


JDBC est une bibliothque de classes Java destines

faciliter l accs aux donnes contenues dans une BDR. JDBC permet :

une connexion simultane plusieurs BD la gestion des transactions l interrogation l appel des procdures stockes

Il existe trois types de pilotes JDBC : ceux qui rutilisent ODBC ceux qui se rfrent Net8 ceux qui n ont besoin ni de Net8 ni de ODBC
Pr Y.Lefdaoui Accs JDBC 6

Programmes Java

Interface de programmation JDBC

Pilote Javasoft utilisant JDBC Pilote ODBC pour Oracle8i


Oracle Net8

Pilote JDBC utilisant Net8

Pilote JDBC tlchargeable (Thin JDBC)


Sockets de communication Java

Oracle Net8

Rseau TCP/IP
Rseau vers le serveur Oracle 8i
Pr Y.Lefdaoui Accs JDBC 7

Pilote utilisant Net8


Installer Net8 Installer JDBC Ce pilote se caractrise par une bonne capacit traiter

les charges importantes Il est prconis pour des applications utilisant un serveur dapplications. Les applications sollicitant bcp la BD

Pr Y.Lefdaoui

Accs JDBC

Pilote tlchargeable Thin JDBC


Il ne ncessite pas d installer oracle sur le poste client Il peut tre tlcharg par le rseau comme une applet

Java Le code pilote mule net8 Inconvnients : obligation de tlcharger 300Ko hors application Java

Pr Y.Lefdaoui

Accs JDBC

Mise en uvre d une application Java-JDBC


Importer le package java.sql 1. Enregistrer le driver JDBC 2. Etablir la connexion la base de donnes 3. Crer une zone de description de requte 4. Excuter la requte 5. Traiter les donnes retournes 6. Fermer les diffrents espaces de travail

Pr Y.Lefdaoui

Accs JDBC

10

Enregistrer forName() de la classe Class : On utilise la mthode le driver JDBC

// charger d abord les pilotes jdbc Class.forName( oracle.jdbc.driver.OracleDriver ); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // on peut aussi utiliser DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
certains compilateurs refusent cette notation et demande plutt :

Class.forName("driver_name").newInstance();

Pr Y.Lefdaoui

Accs JDBC

11

URL de connexion
Il faut spcifier dans lURL :

l utilisation de JDBC le driver ou le type de SGBDR l identification de la base locale ou distante avec

ventuellement des paramtres de configuration (nom utilisateur, mot de passe, ...)


Exemples :

String url = "jdbc:odbc:maBase" ; String url = "jdbc:oracle: thin:@banane:1521:dptinfo", "scott", "tiger");


Pr Y.Lefdaoui Accs JDBC 12

Connexion la base
On utilise la mthode getConnection() de DriverManager le DriverManager essaye tous les drivers qui se sont enregistrs

(chargement en mmoire avec Class.forName()) jusqu ce quil trouve un driver qui peut se connecter la base
Exemple

Connection connect = DriverManager.getConnection(url,user,password); Connexion connect = DriverManager.getConnection (jdbc:oracle:thin:scott/tiger@banane:1521:dptinfo);

Pr Y.Lefdaoui

Accs JDBC

13

Cration d un statement
L objet Statement possde les mthodes ncessaires pour raliser les

requtes sur la base associe la connexion dont il dpend

Il existe 3 types de Statement :

Statement : requtes statiques simples PreparedStatement : requtes dynamiques pr-

compiles (avec paramtres d entre/sortie) CallableStatement : procdures stockes

A partir de l objet Connexion, on rcupre le Statement associ :


Statement req1 = connexion.createStatement(); PreparedStatement req2 = connexion.prepareStatement(str); CallableStatement req3 = connexion.prepareCall(str);

Pr Y.Lefdaoui

Accs JDBC

14

Excution dune requte


3 types d excution :

executeQuery(String) : pour les requtes (SELECT) qui

retournent un ResultSet (tuples rsultants) executeUpdate(String) : pour les requtes (INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE) qui retournent un entier (nombre de tuples traits) execute() : procdures stockes
Exemple
Statement st = connexion.createStatement(); ResultSet rs = st.executeQuery("SELECT ename, job FROM emp " + "WHERE empno=7188 ORDER BY ename"); int nb=st.executeUpdate("INSERT INTO dept(DEPT)" + VALUES(06));
Accs JDBC

Pr Y.Lefdaoui

15

Excution dune requte


le code SQL n est pas interprt par Java.
c est le pilote associ la connexion (et au final par le moteur de la

base de donnes) qui interprte la requte SQL


si une requte ne peut s excuter ou quune erreur de syntaxe SQL

a t dtecte, l exception SQLException est leve


le driver JDBC effectue d abord un accs la base pour dcouvrir

les types des colonnes impliques dans la requte puis un 2me pour l excuter..

Pr Y.Lefdaoui

Accs JDBC

16

Traitement des donnes de retour


L objet ResulSet (retourn par l excution de

executeQuery() ) permet d accder aux champs des tuples slectionns


seules les donnes demandes sont transfres en

mmoire par le driver JDBC ; il faut donc les lire "manuellement" et les stocker dans des variables pour un usage ultrieur

Pr Y.Lefdaoui

Accs JDBC

17

ResultSet
Il se parcourt itrativement ligne par ligne avec la

mthode next()
retourne false si dernier tuple lu, true sinon chaque appel fait avancer le curseur sur le tuple suivant initialement, le curseur est positionn avant le premier

tuple, il faut donc excuter next() au moins une fois pour avoir le premier impossible de revenir au tuple prcdent ou de parcourir l ensemble dans un ordre alatoire
Les colonnes sont rfrences par leur numro ou par leur nom

L accs aux valeurs des colonnes se fait par les mthodes de la forme

getXXX()

Pr Y.Lefdaoui

Accs JDBC

18

ResultSet
int val = rs.getInt(3) ; // accs la 3e colonne String prod = rs.getString("PRODUIT") ; Statement st = connection.createStatement(); ResultSet rs = st.executeQuery( "SELECT a, b, c, FROM Table1"); while(rs.next()) { int i = rs.getInt("a"); String s = rs.getString("b"); byte[] b = rs.getBytes("c");

Pr Y.Lefdaoui

Accs JDBC

19

Types de donnes JDBC


Le driver JDBC traduit le type JDBC retourn par le SGBD en un

type Java correspondant


le XXX de getXXX() est le nom du type Java correspondant au

type JDBC attendu


chaque driver a des correspondances entre les types SQL du SGBD

et les types JDBC


le programmeur est responsable du choix de ces mthodes, une

SQLException est gnre si mauvais choix

Pr Y.Lefdaoui

Accs JDBC

20

Correspondances des types


Type JDBC CHAR, VARCHAR , LONGVARCHAR NUMERIC, DECIMAL BINARY, VARBINARY, LONGVARBINARY BIT INTEGER BIGINT REAL DOUBLE, FLOAT DATE TIME . Type Java String java.math.BigDecimal byte[] boolean int long float double java.sql.Date java.sql.Time ..

Pr Y.Lefdaoui

Accs JDBC

21

Cas des valeurs nulles


Pour reprer les valeurs NULL de la base, il faut utiliser la mthode

wasNull() de ResultSet, qui renvoie true si l on vient de lire un NULL, false sinon

les mthodes getXXX() de ResultSet convertissent une valeur

NULL SQL en une valeur acceptable par le type d objet demand :

les mthodes retournant un objet (getString() ,

getObject() et getDate() ) retournent un "null " Java les mthodes numriques (getByte() , getInt() , etc) retournent "0" getBoolean() retourne " false "

Pr Y.Lefdaoui

Accs JDBC

22

Fermeture des espaces


Pour terminer proprement un traitement, il faut fermer les

diffrents espaces ouverts (sinon le garbage collector s en occupera mais cest moins efficace)
Chaque objet possde une mthode close() :

resultset.close(); statement.close(); connection.close();

Pr Y.Lefdaoui

Accs JDBC

23

Exemple dutilisation de jdbc


package ExemplesJDBC; import java.sql.*;

class JDBCThinGetDeptScott { public static void main (String args []) throws SQLException, ClassNotFoundException, java.io.IOException {

// Charger le pilote JDBC d'Oracle


Class.forName ("oracle.jdbc.driver.OracleDriver");

// Connection une BD distance avec un pilote thin


Connection uneConnection = DriverManager.getConnection ("jdbc:oracle:thin:@banane:1521:dptinfo", "scott", "tiger");

// Cration d'un nonc associ la Connexion


Statement unEnoncSQL = uneConnection.createStatement ();
Pr Y.Lefdaoui Accs JDBC 24

// Excution d'un SELECT


ResultSet rsultSelect = unEnoncSQL.executeQuery ("SELECT deptno, dname + "FROM DEPT " + "WHERE deptno > 10");

// Itrer et extraire les valeurs des colonnes dans des variables


while (rsultSelect.next ()) { int deptno = rsultSelect.getInt ("deptno"); String dname = rsultSelect.getString ("dname"); System.out.println ("Numro du departement:" + deptno); System.out.println ("Nom du departement:" + dname); }

// Fermeture de l'nonc et de la connexion


unEnoncSQL.close(); uneConnection.close(); }}
Pr Y.Lefdaoui Accs JDBC 25

Accs aux mta-donnes


La mthode getMetaData() permet d obtenir des informations sur

les types de donnes du ResultSet

elle renvoie des ResultSetMetaData on peut connatre entre autres :

le nombre de colonne : getColumnCount() le nom d une colonne : getColumnName(int col) le type d une colonne : getColumnType(int col) le nom de la table : getTableName(int col) si un NULL SQL peut tre stock dans une colonne : isNullable()

Pr Y.Lefdaoui

Accs JDBC

26

ResultSetMetaData
Exemple
Resultset rs = stmt.executeQuery ("SELECT * FROM emp"); ResultSetMetaData rsmd = rs.getMetaData(); int nbColonnes = rsmd.getColumnCount(); for(int i = 1; i <= nbColonnes; i++) {

// colonnes numerotees a partir de 1 (et non 0)


String typeCol = rsmd.getColumnTypeName(i); String nomCol = rsmd.getColumnName(i); }

Pr Y.Lefdaoui

Accs JDBC

27

DataBaseMetaData
Pour rcuprer des informations sur la base de donnes elle-mme,

utiliser la mthode getMetaData() de l objet Connection


Elle dpend du SGBD avec lequel on travaille Elle renvoie des DataBaseMetaData on peut connatre entre autres :

les tables de la base : getTables()


le nom de l utilisateur : getUserName() ...

Pr Y.Lefdaoui

Accs JDBC

28

Requtes prcompiles
L objet PreparedStatement envoie une requte sans paramtres

la base de donnes pour pr-compilation et spcifiera le moment voulu la valeur des paramtres
plus rapide qu un Statement classique

le SGBD analyse quune seule fois la requte (recherche

d une stratgie d excution adquate) pour de nombreuses excutions d une mme requte SQL avec des paramtres variables
tous les SGBD nacceptent pas les requtes pr-compiles

Pr Y.Lefdaoui

Accs JDBC

29

Requtes prcompiles
La mthode prepareStatement() de l objet Connection cre un

PreparedStatement :

PreparedStatement ps = c.prepareStatement ("SELECT * FROM ? " + "WHERE id = ? ");

les arguments dynamiques sont spcifis par un ? et sont ensuite

positionns par les mthodes setString() , setInt(), setDate() , de PreparedStatement (setNull() positionne le paramtre NULL)

ces mthodes ncessitent 2 arguments :

le premier (int) indique le numro relatif de l argument

dans la requte le second indique la valeur positionner

Pr Y.Lefdaoui

Accs JDBC

30

Excution d une requte prcompile ps = c.prepareStatement PreparedStatement


("UPDATE emp SET sal = ? WHERE name = ?"); int count; for(int i = 0; i < 10; i++) { ps.setFloat(1, salary[i]); ps.setString(2, name[i]); count = ps.executeUpdate(); }

Pr Y.Lefdaoui

Accs JDBC

31

Exceptions
SQLException est leve ds qu une connexion ou un ordre SQL ne

se passe pas correctement


la mthode getMessage() donne le message en clair de l erreur renvoie aussi des informations spcifiques au gestionnaire de la

base comme :

SQLState code d erreur fabricant


SQLWarning : avertissements SQL

Pr Y.Lefdaoui

Accs JDBC

32

Gestion des transactions


Par dfaut : auto-commit Pour modifier

uneConnection.setAutoCommit(false); Pour un commit explicite :


Pour un rollback :

uneConnection.commit();

uneConnection.rollback();
Accs JDBC

Pr Y.Lefdaoui

33

Performances de JDBC
Quelques limitations :

ResultSet.next() fait un accs la base pour

chaque ligne retourne impossible de ne faire quun accs la base pour obtenir lensemble des lignes rsultats impossible de revenir en arrire dans le ResultSet -> pnalisant si lutilisateur veut naviguer dans les lignes JDBC effectue 2 accs la base par dfaut :

pour dterminer le type des valeurs de retour puis pour rcuprer les valeurs

Pr Y.Lefdaoui

Accs JDBC

34