Sunteți pe pagina 1din 63

L ’API JDBC

Enseignante : Ettouil Monia

2008/2009
Plan
Problème
Qu’est ce que JDBC ?
Objectifs de JDBC
Avantages
L’API JDBC
Architecture JDBC (modèle à 2 couches)
Drivers JDBC
Modèles de connexion en Java
Scénarios d’utilisation
Mettre en œuvre JDBC
Avec JDBC, on peut aussi ...
Conclusion

2 Enseignante : Ettouil Monia 22/02/2009


Problème
Problème: comment accéder à une BD depuis JAVA ?

Solution: JDBC

Avant le JDBC, il était difficile d’accéder à des bases de données SQL


depuis Java ( obligé d’utiliser des API comme ODBC)

3 Enseignante : Ettouil Monia 22/02/2009


Qu’est ce que JDBC ?
Java DataBase Connectivity .

API Java adaptée à la connexion avec les bases de données


relationnelles (SGBDR)

Fournit un ensemble de classes et d’interfaces permettant


l’utilisation sur le réseau d’un ou plusieurs SGBDR à partir d’un
programme Java.

4 Enseignante : Ettouil Monia 22/02/2009


Objectifs de JDBC
Permettre aux programmeurs Java d’écrire un code indépendant
de la base de données et du moyen de connectivité utilisé
Par l’API JDBC, on peut réaliser :
 une interface uniforme permettant un accès homogène aux SGBD
 simple à mettre en œuvre
 indépendant de la SGBD cible
 supportant les fonctionnalités de base du langage SQL

5 Enseignante : Ettouil Monia 22/02/2009


Avantages
Liés a Java :
portabilité sur de nombreuses SGBDR (Oracle, Informix, Sybase, ..)

uniformité du langage de description des applications, des applets et


des accès aux bases de données

liberté totale vis a vis des constructeurs

6 Enseignante : Ettouil Monia 22/02/2009


L’API JDBC
Est fournie par le package java.sql
permet de formuler et gérer les requêtes aux bases de données
relationnelles
8 interfaces définissant les objets nécessaires :
 à la connexion à une base éloignée
 et à la création et exécution de requêtes SQL

(Statement, CallableStatement, PreparedStatement


DatabaseMetaData, ResultSetMetaData,ResultSet,
Connection, Driver )

7 Enseignante : Ettouil Monia 22/02/2009


L’API JDBC

Vue d’ensemble
du paquetage java.sql

8 Enseignante : Ettouil Monia 22/02/2009


Applets ?
Principe :
 code Java exécuté sur le poste client
 entièrement développé en Java (AWT ou Swing)
Avantages :
 gratuit, pas de code HTML
 permet de gérer des applications complexes
 portable (JDBC)
 indépendant des plate-formes matérielles et logicielles
Inconvénients :
 lent à charger
 les serveursWEB et SGBD doivent être sur la même machine

9 Enseignante : Ettouil Monia 22/02/2009


Architecture JDBC (modèle à 2 couches)
-c’est la couche visible et utile pour
Java Appli/Applet
développer des applications Java accédant à
La couche externe : JDBC
des SGBDR. API
-représentée par le package java.sql
JDBC DriverManager
Les couches
inférieures:
JDBC
DriverAPI

JDBC-ODBC JDBC JDBC JDBC-Net


bridge driver driver driver driver
for for
ODBC Oracle Sybase
driver
Proprietary protocol JDBC protocol
Proprietary protocol
-destinées à faciliter l’implémentation de drivers
Oracle Sybase pour des bases de données.
Oracle Sybase -représentent une interface entre les accès de bas
niveau au moteur du SGBDR et la partie
applicative
10 Enseignante : Ettouil Monia 22/02/2009
Drivers JDBC
Drivers JDBC
4 types de drivers :
Type I : JDBC-ODBC bridge driver
Type II : Native-API, partly-Java driver
Type III : Net-protocol, all-Java driver
Type IV : Native-protocol, all-Java driver

Tous les drivers :


http://www.javasoft.com/products/jdbc/drivers.html

12 Enseignante : Ettouil Monia 22/02/2009


Driver de type I
• Le driver accède à un SGBDR en passant par les drivers ODBC
(standard Microsoft) via un pont JDBC-ODBC.
appels JDBC traduits en appels ODBC
(presque tous les SGBDR sont accessibles (Windows).
nécessite l’installation d’un driver ODBC chez le client.
Avantages :
possibilité d’écrire des applications accédant à des données
réparties entre plusieurs sources hétérogènes
on développe l’application indépendamment de la source de données
la base de données utilisée côté serveur peut être inter-changée sans
aucune modification du développement fait dans la partie cliente

13 Enseignante : Ettouil Monia 22/02/2009


Driver de type II
fait appel à des fonctions natives (non Java) de l ’API du SGBDR
 gère des appels C/C++ directement avec la base

fourni par les éditeurs de SGBD et généralement payant


moins ouvert que le pont JDBC-ODBC
plus performant

14 Enseignante : Ettouil Monia 22/02/2009


Driver de type III
• Driver JDBC-Net
• appels JDBC convertis suivant un protocole réseau générique.
• Driver portable car il est entièrement écrit en Java.

15 Enseignante : Ettouil Monia 22/02/2009


Driver de type IV
• Driver 100% Java.
• ne nécessite aucune configuration chez le client.
• interaction directe avec le SGBD via sockets.

Protocole BD spécifique

16 Enseignante : Ettouil Monia 22/02/2009


Types de drivers et applets
Une application Java peut travailler avec tous les types de drivers
Pour une applet :
type I ou II : impossible
 une applet ne peut pas charger à distance du code natif (non Java) sur son poste
d’exécution
type III : possible
 si le serveur middleware se situe au même endroit que le serveurWeb (car
communication par sockets avec l’applet)
type IV : possible
 si le SGBDR installé au même endroit que le serveurWeb

17 Enseignante : Ettouil Monia 22/02/2009


Modèles de connexion en Java
Modèle 2-tiers

Client Serveur
TCP / Protocole propriétaire
Application J
D SGBD
ou
B
Applet C

BD

19 Enseignante : Ettouil Monia 22/02/2009


Modèle 2-tiers
Avantages :
 simple à mettre en œuvre
 bon choix pour des applications clientes peu évoluées, à livrer rapidement et
n’exigeant que peu de maintenance
Inconvénients :
 dépendance forte entre le client et la structure du SGBDR
 modification du client si l’environnement serveur change
 tout le traitement est du côté client

20 Enseignante : Ettouil Monia 22/02/2009


Modèle 3-tiers

Client Serveur
TCP / RMI / CORBA
Application Middleware
ou
Applet JDBC

SGBD

BD

21 Enseignante : Ettouil Monia 22/02/2009


Modèle 3-tiers
Avantages:
 le middleware peut ajouter un niveau de sécurité
 plusieurs supports pour les échanges avec le client :
 sockets, RMI Java, CORBA, …
 applets : le SGBDR peut se trouver sur une autre machine :
 mais le serveurWeb et le middleware dans le même endroit
 facilite l’utilisation de clients « légers »

22 Enseignante : Ettouil Monia 22/02/2009


Scénarios d’utilisation
Scénario 1 :architecture 2-tiers avec une application Java
Client
Java appli

JDBC DriverManager
BD
JDBC Appli. Driver (I ou II)

Intranet

Server
SGBDR

BD

24 Enseignante : Ettouil Monia 22/02/2009


Scénario 2 : architecture 2-tiers avec une applet Java
Client
Java applet

JDBC DriverManager

JDBC Applet Driver (III ou IV)

Intranet
Internet

SGBDR Web server

BD

Server

25 Enseignante : Ettouil Monia 22/02/2009


Scénario 3 :architecture 3-tiers et applet/application Java
Client
Java applet /
application

Intranet/
Internet

Database Server
Middleware server Web server

JDBC DriverManager

SGBDR JDBC Appli. Driver SGBDR

BD BD
Application Server

Intranet
26 Enseignante : Ettouil Monia 22/02/2009
Mettre en œuvre JDBC
API JAVA
• java.sql.DriverManager
Classes de connexion
• java.sql.Connection

• java.sql.Statement
Interfaces de requête sql
• java.sql.PreparedStatement
• java.sql.CallableStatement

• java.sql.ResultSet Classe de traitement des résultats

• java.sql.DatabaseMetaData Classe de récupération d ’info sur


la structure de la BD

28 Enseignante : Ettouil Monia 22/02/2009


Mettre en œuvre JDBC
0. Importer le package java.sql
1. Enregistrer le driver JDBC
2. Établir la connexion à la base de données
3. Créer une zone de description de requête
4. Exécuter la requête (un Statement)
5.Traiter les données retournées (un ResultSet)
6. Fermer les différents espaces

29 Enseignante : Ettouil Monia 22/02/2009


1. Enregistrer le driver JDBC

Fait en instanciant une classe implémentant ce driver :

Class.forName("com.mysql.jdbc.Driver ");
ou
DriverManager.registerDriver(new com.mysql.jdbc.Driver());

30 Enseignante : Ettouil Monia 22/02/2009


2. Connexion à la base
Méthode getConnection() de DriverManager
3 arguments :
 l’URL de la base de données
 le nom de l ’utilisateur de la base
 son mot de passe

String dbUrl = "jdbc:mysql://localhost:3306/yaps";


Stringuser = "root", password
le DriverManager = "";
essaye tous les drivers qui se sont enregistrés
Connection conn;
(chargement en mémoire avec Class.forName()) jusqu’à ce qu’il trouve
conn =un driver qui peut se connecter à la base
DriverManager.getConnection(bdUrl,user,password);

31 Enseignante : Ettouil Monia 22/02/2009


3. Création d’une requête (1/2)
L’objet Statement possède les méthodes nécessaires pour
réaliser les requêtes sur la base associée à la connexion dont il
dépend.

3 types de Statement :
Statement : requêtes statiques simples
PreparedStatement : requêtes dynamiques pré-compilées
(avec paramètres d’entrée/sortie)
CallableStatement : procédures stockées

32 Enseignante : Ettouil Monia 22/02/2009


3. Création d’une requête (2/2)
A partir de l’instance de l’objet Connection, on récupère le
Statement associé :

Statement req1 = connexion.createStatement();

PreparedStatement req2=connexion.prepareStatement(str);

CallableStatement req3 = onnexion.prepareCall(str);

33 Enseignante : Ettouil Monia 22/02/2009


4. Exécution d’une requête (1/3)
3 types d’exécution :
executeQuery() : pour les requêtes (SELECT) qui retournent
un ResultSet.

executeUpdate() : pour les requêtes (INSERT, UPDATE,


DELETE, CREATETABLE, DROP TABLE) qui retournent un entier
(nombre de tuples traités)

execute() : procédures stockées (cas rares)

34 Enseignante : Ettouil Monia 22/02/2009


4. Exécution d’une requête (2/3)
executeQuery() et executeUpdate() de la classe
Statement prennent comme argument une chaîne (String)
indiquant la requête SQL à exécuter :

Statement st = connexion.createStatement();
ResultSet rs = st.executeQuery(
"SELECT nom, prenom FROM clients " +
"WHERE nom=‘Ali’ ORDER BY prenom");
int nb = st.executeUpdate("INSERT INTO dept(DEPT) " +
"VALUES(06)");

35 Enseignante : Ettouil Monia 22/02/2009


4. Exécution d’une requête (3/3)
2 remarques :
le code SQL n’est pas interprété par Java.
 c’est le pilote associé à la connexion (et au final par le moteur de la base de
données) qui interprète la requête SQL
 si une requête ne peut s’exécuter ou qu’une erreur de syntaxe SQL a été
détectée, l’exception SQLException est levée

le driver JDBC effectue d’abord un accès à la base pour découvrir les
types des colonnes impliquées dans la requête puis un 2ème pour
l’exécuter..

36 Enseignante : Ettouil Monia 22/02/2009


5. Traiter les données retournées
L ’objet ResultSet (retourné par l’exécution de
executeQuery() ) permet d’accéder aux champs des tuples
sélectionnés

seules les données demandées sont transférées en mémoire par le


driver JDBC

 il faut donc les lire "manuellement" et les stocker dans des variables pour un
usage ultérieur

37 Enseignante : Ettouil Monia 22/02/2009


5. Traiter les données retournées
Le résultat : ResultSet (1/4)
JDBC 1.x : Il se parcourt itérativement ligne par ligne
par la méthode 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
 exécuter next() au moins une fois pour avoir le premier

while(rs.next()) {// Traitement de chaque tuple}

impossible de revenir au tuple précédent ou de parcourir l’ensemble


dans un ordre aléatoire

38 Enseignante : Ettouil Monia 22/02/2009


5. Traiter les données retournées
Le résultat : ResultSet (2/4)
Avec le JDBC 2.0 :
on peut parcourir le ResultSet d’avant en arrière :
 next() vs. previous()
en déplacement absolu : aller à la n-ième ligne
 absolute(int row), first(), last(), ...
en déplacement relatif : aller à la n-ième ligne à partir de la position
courante du curseur, … :
 relative(int row), afterLast(), beforeFirst(), ...

39 Enseignante : Ettouil Monia 22/02/2009


5. Traiter les données retournées
Le résultat : ResultSet (3/4)
Les colonnes sont référencées par leur numéro ou par leur nom

L’accès aux valeurs des colonnes se fait par les méthodes de la


forme getXXX()
lecture du type de données XXX dans chaque colonne du tuple
courant

int val = rs.getInt(3) ; // accès à la 3e colonne


String prod = rs.getString("PRODUIT") ;

40 Enseignante : Ettouil Monia 22/02/2009


5. Traiter les données retournées
Le résultat : ResultSet (4/4)
Exemple
Statement st = connexion.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");
}

41 Enseignante : Ettouil Monia 22/02/2009


5. Traiter les données retournées
Types de données 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 méthodes


 SQLException générée si mauvais choix

42 Enseignante : Ettouil Monia 22/02/2009


5. Traiter les données retournées
Correspondance des types
Type JDBC Type Java
CHAR,VARCHAR , LONGVARCHAR String
NUMERIC, DECIMAL java.math.BigDecimal
BINARY,VARBINARY, LONGVARBINARY byte[]
BIT boolean
INTEGER int
BIGINT long
REAL float
DOUBLE, FLOAT double
DATE java.sql.Date
TIME java.sql.Time
…. …..

43 Enseignante : Ettouil Monia 22/02/2009


5. Traiter les données retournées
Cas des valeurs nulles
Pour repérer les valeurs NULL de la base :
utiliser la méthode wasNull() de ResultSet
 renvoie true si l’on vient de lire un NULL, false sinon

les méthodes getXXX() de ResultSet convertissent une valeur


NULL SQL en une valeur acceptable par le type d’objet demandé :
 les méthodes retournant un objet (getString(), getDate(),... )
retournent un "null " Java
 les méthodes numériques (getByte() , getInt() , etc) retournent "0"
 getBoolean() retourne " false "

44 Enseignante : Ettouil Monia 22/02/2009


6. Fermer les différents espaces
Pour terminer proprement un traitement, il faut fermer les
différents espaces ouverts.
Chaque objet possède une méthode close() :

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

45 Enseignante : Ettouil Monia 22/02/2009


Exemple
import java.sql.*; try {
public class TestJDBC { con = DriverManager.getConnection(url,args[0],args[1]);
public static void main(String args[]) throws stmt = con.createStatement();
SQLException { ResultSet rs = stmt.executeQuery(query);
String url = System.out.println("Skieurs avec leur specialite:");
"jdbc:oracle:thin:@charlemagne:1521:infodb";
Connection con; while (rs.next()) {
String s = rs.getString("nomski");
Statement stmt;
String query = "select nomski,specialite from skieur"; String n = rs.getString("specialite");
try { System.out.println(s + " " + n);
}
Class.forName("oracle.jdbc.driver.OracleDriver");
//Class.forName("com.mysql.jdbc.Driver"); stmt.close();
con.close();
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException (try): "); } catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
System.err.println(e.getMessage());
} }
}
}

46 Enseignante : Ettouil Monia 22/02/2009


Exemple2
 Invocation d'une requête SQL de mise à jour

Dans le cas d ’une modification de donnée (INSERT, UPDATE, DELETE), on utilise la méthode
executeUpdate(…) qui renvoie un entier spécifiant le nombre d’enregistrements modifiés:
String reqSql = "DELETE FROM ...";
int n = st.executeUpdate(reqSql);

 Invocation d'une requête SQL de sélection

String a = "SELECT prenom, nom, age FROM employe";


// Création d'un statement
Statement st = conn.createStatement();
// Exécution de la requête
ResultSet r = st.executeQuery(a);

47 Enseignante : Ettouil Monia 22/02/2009


Avec JDBC, on peut aussi ...
Avec JDBC, on peut aussi ...
1. Exécuter des requêtes SQL pré-compilées
java.sql.PreparedStatement
2. Exécuter des procédures stockées
java.sql.CallableStatement
3. Utiliser des transactions
4. Accéder aux méta-données (schéma) de la base
java.sql.DatabaseMetaData
5. Manipuler des BLOBs

49 Enseignante : Ettouil Monia 22/02/2009


1. requête SQL précompilée
// requête SQL dynamique paramétrée par des ?
String a = "SELECT * FROM employe WHERE age > ? ";
// Création d'un PreparedStatement
PreparedStatement p = conn.prepareStatement(a);
// => requête SQL compilée par le SGBD
// Passage des paramètres par setXXX
p.setInt(1, 55); // => age > 55
// Exécution de la requête
ResultSet r = p.executeQuery();

50 Enseignante : Ettouil Monia 22/02/2009


2. procédure stockée
// procédure stockée paramétrée par des ?
String aCall = "{ ? = call getNumberOfAgeGreaterThan( ? ) } ";
// Création d'un CallableStatement
CallableStatement cst = conn.prepareCall(aCall);
cst.setInt(2, 55); // => age > 55
// Passage des paramètres d’output
cst.registerOutParameter(1, java.sql.TYPES.INTEGER, 0);
cst.executeQuery(); // Exécution de la procédure
int nb = cst.getInt(1); // Récupération du résultat

51 Enseignante : Ettouil Monia 22/02/2009


3. Transactions
3 services déclarés dans l ’interface Connection :
• setAutoCommit(boolean b)
• commit() : valide une transaction
• rollback() : annule une transaction
Les nouvelles connexions sont initialement en mode autocommit
=> commit implicite après chaque requête SQL
Pour définir une transaction composée de plusieurs requêtes SQL, il
faut désactiver l ’auto-commit :
conn.setAutoCommit(false)
Un appel à commit() ou rollback() va alors créer implicitement une
nouvelle transaction

52 Enseignante : Ettouil Monia 22/02/2009


3. Transactions
Validation de transaction : Commit
Utiliser pour valider tout un groupe de transactions à la fois
Par défaut : mode auto-commit : un "commit " est effectué
automatiquement après chaque ordre SQL
Pour repasser en mode manuel :
connexion.setAutoCommit(false);

L’application doit alors envoyer à la base un "commit" pour rendre


permanent tous les changements occasionnés par la transaction :
connexion.commit();

53 Enseignante : Ettouil Monia 22/02/2009


3. Transactions
Annulation de transaction : Rollback
De même, pour annuler une transaction (ensemble de requêtes
SQL), l’application peut envoyer à la base un "rollback" par :
connexion.rollback();

restauration de l’état de la base après le dernier "commit"

54 Enseignante : Ettouil Monia 22/02/2009


3. Transactions – Exemple
// Désactiver l'auto-commit
conn.setAutoCommit(false);
try {
// les requêtes SQL suivantes constituent une seule transaction
st.executeUpdate("INSERT ...");
st.executeUpdate("DELETE ...");
st.executeUpdate("UPDATE ...");
// valider la transaction
conn.commit();
st.close();
}
catch(java.sql.SQLException e) { conn.rollback(); }

55 Enseignante : Ettouil Monia 22/02/2009


4. Accès aux méta-données
La méthode getMetaData() permet d’obtenir des informations
sur les types de données du ResultSet
elle renvoie des ResultSetMetaData
on peut connaître entre autres :
 le nombre de colonne : getColumnCount()
 le nom d’une colonne : getColumnName(int col)
 le nom de la table : getTableName(int col)
 si un NULL SQL peut être stocké dans une colonne : isNullable()

56 Enseignante : Ettouil Monia 22/02/2009


4. Accès aux méta-données
ResultSetMetaData

ResultSet rs = stmt.executeQuery("SELECT * FROM emp");


ResultSetMetaData rsmd = rs.getMetatData();

int nbColonnes = rsmd.getColumnCount();


for(int i = 1; i <= nbColonnes; i++) {
// colonnes numerotées à partir de 1 (et non 0)
String nomCol = rsmd.getColumnName(i);
}

57 Enseignante : Ettouil Monia 22/02/2009


4. Accès aux méta-données
DatabaseMetaData
Pour récupérer des informations sur la base de données elle-
même, utiliser la méthode getMetaData() de l ’objet
Connection
dépend du SGBD avec lequel on travaille

elle renvoie des DatabaseMetaData

on peut connaître entre autres :


 les tables de la base : getTables()
 le nom de l ’utilisateur : getUserName()
 ...

58 Enseignante : Ettouil Monia 22/02/2009


4. Accès aux méta-données
private DatabaseMetaData metaData;
private java.awt.List listTables= new List(10);

String[] types = { "TABLE", "VIEW" };
String nomTables;

metaData = conn.getMetaData();
ResultSet rs = metaData.getTables(null, null, "%", types);
while (rs.next()) {
nomTable = rs.getString(3);
listTables.add(nomTable);
}

59 Enseignante : Ettouil Monia 22/02/2009


5. CLOB et BLOB
Types pour les données de grande taille
BLOB :Binary Large OBject
Une colonne de type BLOB est en fait un pointeur vers un fichier
CLOB : Character Large OBject
 permettent de stocker des données de grande taille (ex. : fichier)
dans une table

60 Enseignante : Ettouil Monia 22/02/2009


Exemple
1. La table :
create table userImages (
user varchar(50),
image BLOB
)
2. Insérer un BLOB 3. Lire un BLOB
String a = String a = "select image from userImages ";
"insert into userImages values(‘img', ?)"; ResultSet rs = stmt.executeQuery(a);
Statement pstmt = con.prepareStatement(a); while (rs.next) {
File file = new File(" img.jpg"); Blob b = rs.getBlob("image");
InputStream fin = new FileInputStream(file); InputStream stream = b.getBinaryStream();
pstmt.setBinaryStream (1, fin, file.length()); // ...
pstmt.executeUpdate(); }

61 Enseignante : Ettouil Monia 22/02/2009


Exceptions
SQLException est levée dès qu’une connexion ou un ordre
SQL ne se passe pas correctement
la méthode getMessage() donne le message en clair de l’erreur

renvoie aussi des informations spécifiques au gestionnaire de la base


comme :
 SQLState
 code d’erreur fabricant

SQLWarning : avertissements SQL

62 Enseignante : Ettouil Monia 22/02/2009


Conclusions
l ’API JDBC est :
Un jeu unique d’interfaces pour un accès homogène :cache au maximum
les diverses syntaxes SQL des SGBD.
le principe des drivers permet au développeur d’ignorer les détails
techniques liés aux différents moyens d’accès aux BDs :une convention de
nommage basée sur les URL est utilisée pour localiser le bon pilote et lui
passer des informations.
Problèmes
• JDBC n'effectue aucun contrôle sur les instructions SQL
• Correspondance entre classes Java et relations est un travail de bas
niveau.
• API de bas niveau :nécessaire de connaître la syntaxe SQL

63 Enseignante : Ettouil Monia 22/02/2009

S-ar putea să vă placă și