Vous êtes sur la page 1sur 41

Baccalauréat en informatique

Programmation avancée en Java


IFT-21133

JDBC
Module 8

Michelle Carrier
Chargé
Chargée d’
d’enseignement

Marc Philippe Parent


Rédacteur

Édition hiver 2007

Département d’informatique
Université virtuelle et de génie logiciel
africaine
Plan

• Introduction,
• Type de pilote,
• Classes et méthodes,
• Connexions,
• Traitement SQL en Java,
• Métadonnées,
• Requête paramétrée,
• Java et procédure stockée,
• Exceptions et avertissement.

Département d’informatique et de génie logiciel – hiver 2007 2


Introduction à JDBC

• Souvent décrit comme Java Database


Connectivity mais en réalité une marque déposé
≠ acronyme,
• Approche la plus fréquente de connexion à un
SGBD relationnels à partir de Java,
• Modélisé à partir de ODBC (Open Database
Connectivity),
• Propose une interface commune d’accès à des
BD hétérogènes et repose sur SQL pour l’accès
aux données,
• Une norme de facto de l'industrie,
• Microsoft respecte cette norme (panneau de
configuration).

Département d’informatique et de génie logiciel – hiver 2007 3


Introduction à JDBC

• Définit une API d’accès à des bases de données


qui accepte les fonctionnalités SQL de base,
• Autorise l’accès à un vaste éventail de SGBD
relationnels,
• Deux interfaces principales :
• une API pour les rédacteurs d’applications,
• une API de pilote de plus bas niveau,
• Les applications peuvent accéder à des BD:
• Pilotes ODBC et de bibliothèques clientes,
• Ou API de JDBC avec des pilotes JDBC en Java
pur.

Département d’informatique et de génie logiciel – hiver 2007 4


JDBC-ODBC et JDBC pure

Département d’informatique et de génie logiciel – hiver 2007 5


Types de pilote

• Le pont JDBC–ODBC:
• Fournit l’accès JDBC par l’entremise de pilotes
ODBC,
• ODBC agit en tant que couche de médiation
entre le pilote JDBC et les bibliothèques
clientes du vendeur,
• Aléas de performances dus à la conversion
entre JDBC et ODBC,
• Ne supporte pas toutes les caractéristiques de
Java,
• Les pilotes ODBC sont largement disponibles
de nos jours.
Département d’informatique et de génie logiciel – hiver 2007 6
Types de pilote

• Le pilote JDBC partiellement en Java


• Convertit les appels à JDBC en appel à l’API
cliente du SGBD,
• Le pilote communique directement avec le
serveur de base de données,
• Une solution possible dans le cas des
applications en intranet,
• Ce type de pilote offre de meilleures
performances que le pont JDBC–ODBC.

Département d’informatique et de génie logiciel – hiver 2007 7


Types de pilote

• Le pilote JDBC en Java pur,


• Traduit les appels à JDBC en un protocole
spécifique au vendeur du logiciel intermédiaire
(middleware), qui est ensuite traduit en un
protocole de SGBD par un serveur de logiciel
intermédiaire,
• L’intermédiaire fournit la connectivité à de
nombreuses bases de données différentes,
• L’alternative JDBC la plus souple,
• Plusieurs vendeurs ont ajouté des pilotes JDBC
à leurs produits intermédiaires de base de
données existants.
Département d’informatique et de génie logiciel – hiver 2007 8
Types de pilote

• Le pilote JDBC en Java pur avec connexion


directe à une base de données:
• Convertit les appels à JDBC en le protocole de
réseau utilisé directement par le SGBD,
• Pilotes téléchargés de façon dynamique,
• Idéale pour l’accès par Internet,
• Complètement implémentée en Java,
• Besoin d’un pilote différent pour chaque base
de données.

Département d’informatique et de génie logiciel – hiver 2007 9


Types de pilote

• L’avantage de l’utilisation des pilotes ODBC,


• Normes de facto des accès aux BD à partir
d’ordinateurs personnels et qu’ils sont déjà
disponibles pour la plupart des SGBD usuels,
• Présente cependant des inconvénients :
• Le pilote JDBC partiel ne fonctionnera pas
nécessairement avec un navigateur Web,
• Pour les deux premières approches, un logiciel
de base de données pour chaque client,
• Le pilote JDBC complètement en Java se
télécharge en même temps que l’applet.

Département d’informatique et de génie logiciel – hiver 2007 10


Classes et méthodes

• L’API de JDBC est disponible dans les packages:


• java.sql,
• javax.sql,
• Classes et interfaces principales :
• La classe DriverManager: fournit des
méthodes qui gèrent un ensemble de pilotes
JDBC disponibles,
• L’interface Connection: représente la
connexion à la base de données,
• L’interface Statement: méthodes qui
permettent d’exécuter une instruction SQL
statique.
Département d’informatique et de génie logiciel – hiver 2007 11
Classes et méthodes

• Les principales méthodes de Statement :


• execute(), pour exécuter une instruction SQL
pouvant renvoyer des valeurs multiples,
• (chaque valeur retournée est soit un
ResultSet (set de résultat), soit un nombre
(comptage) de lignes),
• executeQuery() exécute une instruction SQL
SELECT renvoyant un seul ResultSet,
• executeUpdate() exécute une instruction SQL
différente de SELECT.

Département d’informatique et de génie logiciel – hiver 2007 12


Classes et méthodes

• L’interface PreparedStatement: une instruction


SQL précompilée pour exécutions multiples,
• Mêmes méthodes que l’interface Statement,
• L’interface CallableStatement: méthodes pour
exécuter des procédures stockées en SQL,
• L’interface ResultSet: méthodes pour accéder
aux résultats de l’exécution d’une instruction
SQL,
• Entretient un curseur pointant sur la ligne de
données en cours.

Département d’informatique et de génie logiciel – hiver 2007 13


Classes et méthodes

• Le curseur est placé initialement avant la


première ligne;
• next() déplace le curseur à la ligne suivante,
• L’interface DatabaseMetaData fournit des
informations relatives à la base de données,
• L’interface ResultSetMetaData contient des
détails sur un ResultSet,
• Les classes SQLException et SQLWarning
encapsulent les erreurs et les avertissements lors
de connexion aux BD.

Département d’informatique et de génie logiciel – hiver 2007 14


Connexions JDBC

• Avant de pouvoir utiliser un pilote, il faut


l’inscrire auprès du gestionnaire de pilotes JDBC,
• Par exemple le pilote du pont JDBC–ODBC:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
• L’étape suivante consiste à établir une connexion
à la base de données à l’aide de la méthode
getConnection() de la classe DriverManager,
• Cette méthode prend en argument un URL
spécifiant le serveur et la base de données à
utiliser,
• La forme générale de l’URL:
<protocole>:<sous-protocole>:<surnom>
Département d’informatique et de génie logiciel – hiver 2007 15
Connexions JDBC

• Le protocole est « jdbc »,


• Le sous-protocole est le nom du pilote ou du
mécanisme de connectivité à la BD,
• Le plus souvent « odbc »,
• Le surnom identifie la source de données et est
spécifique au pilote JDBC.
• Par exemple, une référence à une source de
données ODBC nommée bddmdr JDBC–ODBC :
jdbc:odbc:bddmdr
• Sur un serveur distant, le surnom prend plutôt la
forme d’une URL normale :
//<nom d’hôte>:[<port>]/sous-surnom

Département d’informatique et de génie logiciel – hiver 2007 16


Connexions JDBC

• Par exemple, l’URL suivante se réfère au pilote


JDBC allégé (thin) d’Oracle sur le serveur du
département,
• jdbc:oracle:thin://s-oracle.ift.ulaval.ca/bddmdr
• getConnection() nécessite un nom d’utilisateur et
un mot de passe:
DriverManager.getConnection("jdbc:oracle:thin://
s-oracle.ift.ulaval.ca/bddmdr","admin",
"dbapass")

Département d’informatique et de génie logiciel – hiver 2007 17


Connexions JDBC

• Gestion des transactions:


• Par défaut la connexion est en auto commit,
• Pour empêcher l'autocommit:
conn.setAutoCommit(false);
• Alors, on valide ou annule la transaction en
cours avec les méthodes commit() et
rollback() de la classe Connection.

Département d’informatique et de génie logiciel – hiver 2007 18


Traitement SQL dans Java

• Exécuter des instructions SQL à partir d'une


application Java,
• Mode de fonctionnement:
• 1-Établir une connexion avec la BD,
• 2-Envoyer les instructions SQL,
• 3-Traiter le résultat,
• 4-Fermer la connexion.

Département d’informatique et de génie logiciel – hiver 2007 19


Traitement SQL dans Java

public class baseDonnees {


……………………
//1-initialisation de la connexion.
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection
("jdbc:oracle:thin:@s-
oracle.ift.ulaval.ca:1521:ora8i", login, passwd);
……………………………………………………….
}

Département d’informatique et de génie logiciel – hiver 2007 20


Traitement SQL dans Java

public class baseDonnees {


……………………
// 2-Création de la requête pour envoie de
// l'instruction.
Statement stmt = con.createStatement();
// Soit Insert, Update or Delete comme
// requete_sql.
stmt.executeUpdate("delete from POUBELLE");
// Les requêtes SQL DML qui retournent des données
ResultSet rs = stmt.executeQuery("select NO_CLIENT,
NOM_CLIENT from CLIENT");
……………………………………………………….
}

Département d’informatique et de génie logiciel – hiver 2007 21


Traitement SQL dans Java

• Toutes les commandes de BD peuvent lancer des


exceptions,
• Entre un try-catch (Exception e),
• Ou throws exception au début de la méthode,
• Pour exécuter la requête:
Try {
java.sql.Statement.executeQuery(laRequête);

}
Catch(Exception e){
System.out.println(e.message());
}

Département d’informatique et de génie logiciel – hiver 2007 22


Traitement SQL dans Java

• Récupération des données


• La classe ResultSet fournit des méthodes
getXXX(int numéroColonne)
• La première colonne =1, puis 2, etc.
• Pour récupérer dans le code Java les valeurs des
colonnes des lignes renvoyées par le SELECT
getXXX(String nomColonne)
• Le XXX de getXXX() est le nom du type Java
correspondant au type JDBC attendu.

Département d’informatique et de génie logiciel – hiver 2007 23


Traitement SQL dans Java
Type JDBC/SQL Type Java
CHAR et VARCHAR String
BINARY byte[]
BIT boolean
SMALLINT short
INTEGER int
BIGINT long
DOUBLE ou FLOAT double
NUMERIC et java.math.BigDeci
DECIMAL mal
DATE java.sql.Date
TIME java.sql.Time
Département d’informatique et de génie logiciel – hiver 2007 24
Traitement SQL dans Java

// 3-Traiter le résultat
// Au départ, le rs est positionné avant le début
boolean more = rs.next();
// Parcours des valeurs et ceci pour chaque
// enregistrement
while (more) {
System.out.println("No: " +
rs.getString("NO_CLIENT"));
System.out.println("Nom: " +
rs.getString("NOM_CLIENT"));
more = rs.next(); // passage au prochain
// enregistrement
}
// 4-Fermer la connexion
con.close();

Département d’informatique et de génie logiciel – hiver 2007 25


Traitement SQL dans Java

• Valeur NULL
• Pour repérer les valeurs NULL utiliser la
méthode wasNull() après getXXX(),
Statement stmt1 = conn.createStatement();
ResultSet rset = stmt1.executeQuery("select NOME,
COMM from EMP");
float commission;
while (rset.next()) {
nom = rset.getString(1);
commission = rset.getFloat(2);
if (rset.wasNull())
System.out.println(nom + " n'a pas de
commission");
else
System.out.println(nom + " a " + commission +
"F de commission");
}

Département d’informatique et de génie logiciel – hiver 2007 26


Métadonnées

• Permet de récupérer des informations sur les


données récupérées (ResultSetMetaData),
• Sur la BD (DatabaseMetaData),
• Les données que l'on peut récupérer dépendent
du SGBD, surtout pour DatabaseMetaData,
• L'exemple suivant montre comment obtenir
quelques informations sur les colonnes
renvoyées par un SELECT à l'aide d'un
ResultSetMetaData.

Département d’informatique et de génie logiciel – hiver 2007 27


Métadonnées

ResultSet rs = stmt.executeQuery("SELECT * FROM


emp");
ResultSetMetaData rsmd = rs.getMetaData();
int nbColonnes = rsmd.getColumnCount();
for (int i = 1; i <= nbColonnes; i++) {
// Les colonnes débutent à 1 (et pas 0)
String typeColonne = rsmd.getColumnTypeName(i);
String nomColonne = rsmd.getColumnName(i);
System.out.println("La colonne " + i + " de nom "
+ nomColonne + " est de type " + typeColonne);
}

Département d’informatique et de génie logiciel – hiver 2007 28


Métadonnées

• Extrait de programme, qui ajoute dans une liste


(l'AWT) les noms des tables et vues disponibles :
private DatabaseMetaData metaData;
private java.awt.List listTables = new
java.awt.List(10);
.... {
metaData = conn.getMetaData();
String[] types = { "TABLE", "VIEW" };
ResultSet rs = metaData.getTables(null, null, "%",
types);
String nomTables;
while (rs.next()) {
// Le nom des tables est la 3ème colonne
nomTable = rs.getString(3);
listTables.add(nomTable);
...

Département d’informatique et de génie logiciel – hiver 2007 29


Requête SQL paramétrée

• Un SGBD analyse les requêtes pour les


optimiser,
• Une requête exécutée plusieurs fois avec des
valeurs différentes pour certaines valeurs est
analysé une fois,
• JDBC en profite par les requêtes paramétrées,
• Les instructions paramétrées peuvent avoir des
paramètres qui peuvent recevoir des valeurs
données par le programme Java,
• Intéressant si elles sont exécutées plusieurs fois
dans le programme avec des paramètres
différents.
Département d’informatique et de génie logiciel – hiver 2007 30
Requête SQL paramétrée

• On utilise l'interface PreparedStatement qui


hérite de l'interface Statement,
PreparedStatement pstmt =
conn.prepareStatement("UPDATE emp SET sal
= ? WHERE name = ?");
int nbLignesModifiees;
for (int i=0; i<10; i++) {
psmt.setFloat(1, salaire[i]);
psmt.setString(2, nom[i]);
nbLignesModifiees = psmt.executeUpdate();
}

Département d’informatique et de génie logiciel – hiver 2007 31


Requête SQL paramétrée

• Pour passer la valeur NULL on peut utiliser la


méthode setNull()

Département d’informatique et de génie logiciel – hiver 2007 32


Java et procédure stockée

• Les procédures stockées sont représentées par


CallableStatement qui hérite de l'interface
PreparedStatement,
• D'abord créer une instance de la classe avec
prepareCall() de la classe Connection,
• L'appel des procédures stockées n'est pas
standardisée dans les différents SGBD,
• Voici la syntaxe JDBC:
{ [? = ]call nom-procédure [(?,?,...)] }
• Avant l'appel de la procédure, il faut donner les
valeurs des paramètres et leurs types.

Département d’informatique et de génie logiciel – hiver 2007 33


Java et procédure stockée

• Avant l'appel de la procédure, il faut donner les


valeurs et les types des paramètres,
• Utiliser les méthodes (de CallableStatement)
setXXX() ou getXXX() qui conviennent,
• Le numéro correspond à l'ordre d'apparition des
? dans l'appel de la procédure,
• Le programme Java doit indiquer le type JDBC de
tous les paramètres par référence par la
méthode registerOutParameter(),
• Le lancement de la procédure se fait par l'appel
des méthodes execute(), executeQuery() ou
executeUpdate() selon le cas.

Département d’informatique et de génie logiciel – hiver 2007 34


Java et procédure stockée

// Création de la fonction si elle n’existe pas


déjà
stmt.execute ("create or replace function RAISESAL
(name CHAR, raise NUMBER)return NUMBER is begin
return raise + 100000; end;");
// Préparer l'appel a la fonction à cause des
paramètres et
// de la valeur de retour
CallableStatement cstmt =
conn.prepareCall("{? = call RAISESAL (?, ?)}");
//identification de la valeur de retour ainsi que
//son type
cstmt.registerOutParameter (1, Types.INTEGER);

Département d’informatique et de génie logiciel – hiver 2007 35


Java et procédure stockée

//identification du 1er paramètre


cstmt.setString (2, nomPersonne);

//identification du 2eme paramètre


cstmt.setInt (3, salaire);

//exécution de la fonction
cstmt.executeQuery();

//Afficher le résultat de la fonction

System.out.println(Integer.toString(cstmt.getInt(1
)));

Département d’informatique et de génie logiciel – hiver 2007 36


Exceptions et avertissement

• Les exceptions liées à SQL sont représentées par


la classe SQLException qui hérite de Exception,
• 3 méthodes utiles :
• getMessage() renvoie un message d'erreur
(String),
• getSQLState() renvoie un code d'erreur
(String),
• getErrorCode() renvoir un code d'erreur
spécifique au SGBD (int).

Département d’informatique et de génie logiciel – hiver 2007 37


Exceptions et avertissement

try {
// Code SQL qui peut générer une exception
. . .
}
catch(SQLException e) {
System.out.println(" Les SQLException :");
while (e != null) {
System.out.println("\nMessage : " + e.getMessage
());
System.out.println("Code d'erreur : " +
e.getSQLState ());
System.out.println("Numéro d'erreur : " +
e.getErrorCode ());
e = e.getNextException();
}
}
Département d’informatique et de génie logiciel – hiver 2007 38
Exceptions et avertissement

• Le programme Java peut recevoir un


avertissement du SGBD indiquant une anomalie
de fonctionnement,
• N'est pas aussi grave qu'une exception et
n'interrompt pas l'exécution,
• Liée à l'objet qui a provoqué le problème
(Connection, Statement, ResultSet, etc.),
• Le plus fréquent: une donnée a été tronquée,
• SQLWarning et DataTruncation représentent les
avertissements,
• Bien qu'héritant de Exception, on ne les
attrapent pas avec un bloc try - catch mais avec
getWarnings().

Département d’informatique et de génie logiciel – hiver 2007 39


Exceptions et avertissement

• On créé la classe d'avertissement:


SQLWarning warn = rs.getWarnings();
if (warn != null) {
System.out.println("Avertissements sur le
ResultSet");
while (warn != null) {
System.out.println("Message: " +
warn.getMessage());
System.out.println("Code d'erreur : " +
warn.getSQLState());
System.out.println("Numéro d'erreur : " +
warn.getErrorCode());
warn = warn.getNextWarning();
}
}

Département d’informatique et de génie logiciel – hiver 2007 40


Exceptions et avertissement

• On vérifie dans le code l'avertissement:


. . .
SQLWarning warning = stmt.getWarnings();
if (warning != null) {
System.out.println("Avertissements sur
l'instruction :");
while (warning != null) {
System.out.println("\nMessage: " +
warning.getMessage());
System.out.println("Code d'erreur : " +
warning.getSQLState());
System.out.println("Numéro d'erreur : " +
warning.getErrorCode());
warning = warning.getNextWarning();
}
}

Département d’informatique et de génie logiciel – hiver 2007 41

Vous aimerez peut-être aussi