JDBC: Gestion des bases de données en Java

Youness Boukouchi
Youness BoukouchiProfesseur assistant at Ecole Nationale des Sciences Appliquées d'Agadir (ENSA-Agadir)
GESTION DES BASES DE DONNÉES EN JAVA
JDBC
Java DataBase Connectivity
parYouness BOUKOUCHI
ENSA-Agadir
4e année Génie Informatique
Définition
■ JDBC (Java DataBase Connectivity) est une bibliothèque d’interfaces et de classes
utilisées pour accéder à un SGBDR.
■ Un programme JDBC envoie à un SGBDR des requêtes écrites en SQL puis
exploite le résultat renvoyé en Java.
■ Chaque éditeur de SGBDR fournit son driver JDBC sous forme d’un ensemble de
classes rassemblées dans un fichier d’archive .jar , qu’il faut ajouter à l’option –
classpath lors de l’exécution de votre programme.
■ L'API JDBC est indépendante des SGBD. Un changement de SGBD ne doit pas
impacter le code applicatif
Prof y.boukouchi - ENSA d'Agadir 2
Les Drivers (Pilotes) JDBC
■ Le code applicatif est basé sur les interfaces du
JDBC. Au niveau du programme d’application on ne
travaille qu’avec les abstractions (interfaces)
sans ce soucier des classes effectives
d’implémentation
■ Les interfaces définissent une abstraction du pilote
(driver) de la base de données. Chaque fournisseur
propose sa propre implémentation de ces
interfaces
■ Pour accéder à un SGBD il est nécessaire de
disposer de classes implémentant ces interfaces.
L'ensemble de ces classes pour un SGBD donné est
appelé pilote (driver) JDBC
■ Drivers (ou pilotes) permettent de traduire les
requêtes JDBC dans le langage du SGBD, ils sont
constitués de classes implantant certaines
interfaces de java.sql.
Prof y.boukouchi - ENSA d'Agadir 3
Prof y.boukouchi - ENSA d'Agadir 4
types de pilotes JDBC
■ Type 1 (JDBC1): pont JDBC-ODBC
■ ‰Type 2 (JDBC2): driver qui fait
appel à des fonctions natives non
Java (le plus souvent en langage
C) de l'API du SGBD que l'on veut
utiliser
■ ‰Type 3 (JDBC3): driver qui
permet l'utilisation d'un serveur
middleware
■ ‰Type 4 (JDBC4): driver écrit
entièrement en Java, qui utilise le
protocole réseau du SGBD
Classes et Interfaces JDBC
■ L'API JDBC définit un
ensemble d'interfaces et
classes (package java.sql)
qui définissent un protocole
de communication entre le
programme java client et le
SGBD.
■ le package java.sql est
complété par le package
javax.sql
Prof y.boukouchi - ENSA d'Agadir 5
Les classes du package java.sql
Les interfaces du package java.sql
MISE EN ŒUVRE DE JDBC
Prof y.boukouchi - ENSA d'Agadir 6
Mise en œuvre de JDBC
■ Etape 0: Importer le package java.sql et le driver
■ Etape 1 Etablir la connexion au SGBD
■ Etape 2 Créer la requête (ou instruction SQL)
■ Etape 3 Exécuter la requête
■ Etape 4 Traiter les données retournées
■ Etape 5 Fermer la connexion
Prof y.boukouchi - ENSA d'Agadir 7
Exemple 1
Prof y.boukouchi - ENSA d'Agadir 8
package jdbc.tp.ensa;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
public class TP1Connexion {
private static String username="admin";
private static String password="admin";
private static String url="jdbc:mysql://localhost:3306/stock";
public static void main(String[] args) throws SQLException {
Connection conn=null;
try {
conn=DriverManager.getConnection(url, username, password);
System.out.println("Connexion etablie à la BD MySQL");
} catch (SQLException e) {
System.err.println("Problème de connexion à la BD ");
}finally {
if (conn!=null){conn.close();}
}
}
}
Les paramètres de connexion à la BD
Importer le package java.sql
Le DriverManager essaie tous les
drivers enregistrés jusqu'à ce
qu'il trouve un driver qui lui
fournisse une connexion.
Exception où cas d’une erreur
La fermeture de la connexion
Exemple 2
Prof y.boukouchi - ENSA d'Agadir 9
...
import java.sql.ResultSet;
import java.sql.Statement;
public class TP2Statement {
private static String username="admin";
...
public static void main(String[] args) throws SQLException {
Connection con=null; Statement stm=null; ResultSet rs=null;
try {
con=DriverManager.getConnection(url, username, password);
stm=con.createStatement();
String reqSQL="select * from produit";
rs=stm.executeQuery(reqSQL);
while(rs.next()){
System.out.println(rs.getInt(1)+":"+rs.getString("nom")+","+rs.getInt(3)+","+rs.getDouble("prix"));
}
} catch (SQLException e) {
System.err.println("Problème de connexion à la BD ");
}finally { if (rs!=null){rs.close();}
if (stm!=null){stm.close();}
if (con!=null){con.close();}
}
}
}
Création de la requête
Exécution de la requête
Parcours des résultats de ResultSet
Libération des ressources
Étape 1 : Etablir la connexion à la BD
■ On utilise la méthode getConnection() de DriverManager avec trois arguments :
– URL de la base de données de la forme : Protocole :<sous-protocole>:<nom-
BD>?param=valeur, ...
■ Protocole: JDBC
■ sous-protocole : mysql
■ exemples
– String url = "jdbc:odbc:maBase"
– String url = "jdbc:mysql://127.0.0.1:3306/maBase"
– String url = "jdbc:postgresql://localhost/maBase"
– User : le nom de l'utilisateur de la base
– Password : son mot de passe
■ Connection connexion = DriverManager.getConnection(url ,user , pw)
■ le DriverManager essaie tous les drivers enregistrés jusqu'à ce qu'il trouve un
driver qui lui fournisse une connexion.
■ La plupart des méthodes lèvent l'exception java.sql.SQLException.
Prof y.boukouchi - ENSA d'Agadir 11
Etape 2 : Créer une requête
■ La requête est créée avec l'interface Statement qui possède les méthodes
nécessaires pour réaliser les requêtes sur la base associée à la connexion
■ 3 types (interfaces) d'objets statement :
– Statement : requêtes simples (SQL statique)
– PreparedStatement : requêtes paramétrables (ou dynamiques) précompilées
(requêtes avec paramètres d'entrée/sortie)
– CallableStatement : encapsule procédures SQL stockées dans le SGBD
■ Création d'un statement :
– Statement stm = connexion.createStatement();
– PreparedStatement stm = connexion.prepareStatement(str);
– CallableStatement stm = connexion.prepareCall(str);
Prof y.boukouchi - ENSA d'Agadir 12
Etape 3 : Exécuter une requête
■ 3 méthodes d'exécutions d’un Statement:
– ResultSet executeQuery (String SQL) : pour les requêtes qui retournent un résultat
(SELECT) résultat accessible au travers d'un objet ResultSet
– int executeUpdate(String SQL) : pour les requêtes qui ne retournent pas de résultat
(INSERT, UPDATE, DELETE, CREATE TABLE et DROP TABLE)
– boolean execute(String SQL) : quand on ne sait pas si la requête retourne ou non un
résultat,procédures stockées.
■ Exécution de la requête :
– String myQuery = " SELECT prenom , nom , email FROM employe " ;
– ResultSet resultat = stm.executeQuery ( myQuery );
■ executeQuery renvoie un objet de type ResultSet décrivant la table des résultats
Prof y.boukouchi - ENSA d'Agadir 13
Etape 4 : traiter les données retournées
■ executeQuery() : renvoie une instance de ResultSet qui permet d'accéder aux
champs des n-uplets sélectionnés.
■ Les rangées du ResultSet se parcourent itérativement ligne (row) par ligne.
■ Exemple:
while(res.next()){ // Parcours du résultat
ref_produit=res.getString(1);
nom_produit=res.getString(2);
prix_produit=res.getDouble(3);
System.out.println(ref_produit+" : "+nom_produit+" : "+prix_produit);
}
– boolean next() : permet d'avancer à la ligne suivante, retourne false si pas de ligne
suivante placé avant la première ligne à la création du ResultSet
– 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 des méthodes (String nomCol) ou
getXXX(int numCol) où XXX dépend du type de la colonne dans la table SQL
Prof y.boukouchi - ENSA d'Agadir 14
Étapes 5 : fermer les connexions
■ Pour terminer proprement un traitement, il faut fermer les différents espaces ouverts. Le
ramasse-miettes peut le faire mais de façon moins efficace
■ Chaque objet possède une méthode close() :
– resultset.close ();
– statement.close ();
– connection.close ();
Prof y.boukouchi - ENSA d'Agadir 15
Traitement des exceptions JDBC
■ Les méthodes JDBC lancent une exception de type SQLException
■ SQLException étend la class Exception
■ Les methodes pour tracer les Exception:
– getMessage()
– getErrorCode()
– getLocalizedMessage()
– getSQLState()
– getNextException()
– setNextException()
– Iterator()
Prof y.boukouchi - ENSA d'Agadir 16
PARCOURS & ACTUALISATION DES DONNÉES
Prof y.boukouchi - ENSA d'Agadir 17
■ Les méthodes de ResultSet sont divisés en 3 catégories:
1. Méthodes de navigation (next(), first(), last(), etc.)
2. Méthodes de Getters (getInt(), getDouble(), getString(), etc.)
3. Méthodes de mise-à-jour (updateInt(), updateFloat(),
UpdateDate(), etc.)
Prof y.boukouchi - ENSA d'Agadir 18
ResultSet : Parcours & Actualisation des données
Parcours & Actualisation des données
■ Méthodes de navigation
Prof y.boukouchi - ENSA d'Agadir 19
Méthode (classe
ResultSet)
Fonction
next() Avance le curseur d’un enregistrement
previous() Recule le curseur d’un enregistrement
absolute(n) Place le curseur sur l’enregistrement de rang n s’il existe
relative(n) Déplace le curseur de n position (n peut être négatif) par rapport à sa
position actuelle
first() Place le curseur sur le premier enregistrement
last() Place le curseur sur le dernier enregistrement
beforFirst() Place le curseur avant le premier enregistrement
beforLast() Place le curseur avant le dernier enregistrement
Parcours & Actualisation des données
■ Les méthodes d’information sur la position du curseur
Prof y.boukouchi - ENSA d'Agadir 20
Méthode (classe
ResultSet)
Fonction
isFirst() Fournit true si le curseur est placé sur le premier enregistrement
Islast() Fournit true si le curseur est placé sur le dernier enregistrement
isBeforFisrt() Fournit true si le curseur est placé avant le premier enregistrement
isBeforLast() Fournit true si le curseur est placé avant le dernier enregistrement
getRow() Fournit un entier correspondant au numéro de l’enregistrement désigné
par le curseur
■ Méthodes de navigation
■ les méthodes d’accès : les getters
■ Les correspondances entre type SQL et type Java sont données par les spécifications JDBC.
Prof y.boukouchi - ENSA d'Agadir 21
Type SQL Description Type Java Méthode java
BIT 1 bit Booblean getBoolean()
TINYINT Entier 8 bits Byte getByte()
SMALLINT Entier 16 bits Short getShort()
INTEGER Entier 32 bits Int getInt()
BIGINT Entier 64 bits Long getLong()
REAL Flottant 32 bits Float getFloat()
DOUBLE Flottant 64 bits Double getDouble()
DECIMAL(c,d) Nombre décimale de c chiffres dont d
décimale représenté de façon exacte
Java,math,BigDecimal getBigDecimal()
NUMERIC(c,d) Nombre décimale de c chiffres dont d
décimale représenté de façon exacte
Java,math,BigDecimal getBigDecimal()
CHAR(n) Chaine d’exactement n caractères String getString()
VARCHAR(n) Chaine d’au plus n caractères String getString()
DATE Date Java.SQL.Date getDate()
TIME Heure Java.SQL.Time getTime()
TIME STAMP Date et heure Java.SQL.Timestamp getTimeStamp()
BLOB Un BLOB ou Binary Large OBject permet de
stocker de grandes quantités de données
sous forme binaire.
java.sql.Blob getBlob()
Parcours & Actualisation des données
Parcours & Actualisation des données
■ Les méthode de mise-à-jour
■ La modification des résultats se fait a l'aide d’une méthode dont le nom est de la
forme :
– updateXXX( le champ concerné , la nouvelle valeur);
où XXX désigne un type Java.
■ Il faut réaliser plusieurs appels pour modifier plusieurs champs de l‘enregistrement
courant.
■ Enfin, il faut valider les modifications en appelant la méthode updateRaw(); si on ne
le fait pas avant déplacement du curseur, les modifications ne seront pas reportées
dans la base.
■ Exemple:
– res.updatelnt ("nom", "Pc portable");
– res.updateString ("quantité", 50);
– res.updateRow();
Prof y.boukouchi - ENSA d'Agadir 22
Parcours & Actualisation des données
■ Les méthode de mise-à-jour
■ La suppression de l’enregistrement courant se fait en appelant la méthode
deleteRow().
■ L‘ajout d'un nouvel enregistrement se fait a l‘aide des méthodes moveTolnsertRow
et insertRow qu‘on utilise suivant ce schéma :
– rs. moveTolnsertRow(); // insère un nouvel enregistrement a la position du curseur.
– rs.updateXXX(..., ...); // utilisation des méthodes updateXXX
– rs.updateXXX(..., ...); //pour donner des valeurs aux différents champs
– ,,,,
– rs.insertRow() ; // l'insertion est reportée dans la base
Prof y.boukouchi - ENSA d'Agadir 23
Parcours & Actualisation des données
■ On peut choisir différent mode de déplacement et différent modes d’actualisations des
données, en fournissant deux arguments à la méthode CreatStatement:
– CreateStatement( Type_défilement,Type_actualisation )
■ Type_défilement :
– ResultSet.TYPE_FORWARD_ONLY : curseur unidirectionnel (valeur par défaut)
– ResultSet.TYPE_SCROLL_INSENSITIVE : curseur bidirectionnel;modification de la base non
reportées dans les résultats
– ResultSet.TYPE_SCROLL_SENSITIVE: curseur bidirectionnel; modification de la base
reportées dans les résultats
■ Type_actualisation:
– ResultSet.CONCUR_READ_ONLY : les résultats ne peuvent pas être modifies pour mettre à
jour la base (valeur par défaut)
– ResultSet.CONCUR_UPDATABLE : les résultats sont modifiables et les modification sont
répercutées sur la base
■ Exemple :
– CreateStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
– Équivaut à : CreateStatement()
Prof y.boukouchi - ENSA d'Agadir 24
Parcours & Actualisation des données
Prof y.boukouchi - ENSA d'Agadir 25
■ Exemple
Statement stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=stm.executeQuery("SELECT Prenom, Nom, Num FROM Individu");
rs.moveToInsertRow();
rs.updateString(1, "Ali");
rs.updateString(2, "Fatima");
rs.updateLong(3, 2780);
rs.insertRow();
rs.moveToCurrentRow();
LES REQUÊTES PRÉPARÉES
Prof y.boukouchi - ENSA d'Agadir 26
Les requêtes préparées
■ Si on doit répéter plusieurs fois la même requête :
– SELECT * FROM produit WHERE reference=‘’A111’’
– SELECT * FROM produit WHERE reference=‘’A112’’
– SELECT * FROM produit WHERE reference=‘’A113’’
■ Alors requête préparée permet d‘écrire une seule requête dans laquelle on prévoit
un ou plusieurs paramètres, par exemple:
– SELECT * FROM produit WHERE reference=?
■ Le symbole ? désigne un paramètre dont la valeur sera fixée par la suite.
■ une requête préparée est transmise au SGDBR à l’aide de la méthode
prepareStatement de la classe Connection et elle est compilée partiellement.
■ On obtient en résultat un objet de type PreparedStatement contenant toutes les
informations nécessaires à l'exploitation de cette requête préparée par le SGDBR:
– String requeteSQL: = "Select * from produits WhERE reference = ?";
– PreparedStatement prepStmt = connec.prepareStatement(requeteSQL);
Prof y.boukouchi - ENSA d'Agadir 27
Les requêtes préparées
■ Ensuite, on peut transmettre au SGBDR, les valeurs voulues des paramètres, à
l'aide de méthodes de la forme setXXX (rang, valeur) de la classe
PreparedStatement, auxquelles on précise :
– le rang du paramètre concerné;
– la valeur prévue pour ce paramètre.
– exemple:prepStmy.setString(1, " A001 ");
■ En fin, on execute la requête par l’une de ces méthodes executeQuery,
executeUpdate ou execute.
– ResultSet res = prepStmt.executeQuery()
■ Exemple :
– String requeteSQL= " UPDATE produit set qte = ? Where reference=?";
– PreparedStatement prepStmt=con,prepareStatement(requeteSQL);
– prepStmt.setInt(1,12);
– prepStmt,setString(2," A001");
– ResultSet res = prepStmt.executeUpdate()
Prof y.boukouchi - ENSA d'Agadir 28
LES PROCÉDURES STOCKÉS
Prof y.boukouchi - ENSA d'Agadir 29
Procédure stocké
■ Une procédure stockée est une série d'instructions SQL désignée par
un nom.
■ Lorsque l'on crée une procédure stockée, on l'enregistre dans la base de
données que l'on utilise, au même titre qu'une table, par exemple.
■ Une fois la procédure créée, il est possible d'appeler celle-ci par son nom.
Les instructions de la procédure sont alors exécutées.
■ Contrairement aux requêtes préparées, qui ne sont gardées en mémoire
que pour la session courante, les procédures stockées sont stockées de
manière durable, et font bien partie intégrante de la base de
données dans laquelle elles sont enregistrées
Prof y.boukouchi - ENSA d'Agadir 30
CREATE PROCEDURE nom_procedure ([param1 [, param2, ...]])
corps de la procédure;
Procédure stocké
■ Exemples:
Prof y.boukouchi - ENSA d'Agadir 31
CREATE PROCEDURE nom_procedure ([param1 [, param2, ...]])
corps de la procédure;
DELIMITER |
CREATE PROCEDURE nom_procedure ([param1 [, param2, ...]])
Begin
corps de la procédure;
End|
-- Le délimiteur c'est le caractère qui permet de délimiter les instructions. Par défaut c’est ‘;’
Prof y.boukouchi - ENSA d'Agadir 32
DELIMITER | -- On change le délimiteur
CREATE PROCEDURE afficherProduits()
-- pas de paramètres
BEGIN
SELECT * FROM produit;
END| -- on termine la commande CREATE
PROCEDURE par le nouveau délimiteur
CALL afficherProduits();
Procédure stocké
Coté serveur Base des données
Coté application Java
Connection con=null;
CallableStatement cstm=null;
ResultSet rs=null;
try{
con=DriverManager.getConnection(url, username,
password);
String procedureSQL="call afficherProduits()";
cstm=con.prepareCall(procedureSQL);
cstm.execute();
rs=cstm.getResultSet();
String format="-%-6d%-30s%-10d%-15fn";
rs.beforeFirst();
while(rs.next()){
System.out.printf(format,rs.getInt("id"),
rs.getString("nom"), rs.getInt("quantite"),
rs.getDouble("prix"));
}
Procédure sans paramètres
Procédure stocké
Les types de Paramètres:
■ Le sens du paramètre peut prendre 3 valeurs :
• IN : le paramètre sera une valeur ou une variable d'entrée, envoyé lors de
l'appel, et qui sera utilisé à l'intérieur de la procédure.
• OUT : le paramètre sera une variable de sortie. Le paramètre indiqué sera
une variable (de session ou de procédure) qui prendra une valeur lors de
la procédure.
• INOUT : le paramètre sera une variable d'entrée-sortie. Cette variable
pourra être utilisé ou non dans la procédure, et verra normalement sa
valeur modifiée lors de la procédure.
Prof y.boukouchi - ENSA d'Agadir 33
Prof y.boukouchi - ENSA d'Agadir 34
DELIMITER | -- On change le délimiteur
CREATE PROCEDURE filterProduitQte(
IN qte int)
BEGIN
select *
from produit
where quantite>=qte;
end|
CALL filterProduitQte(10);
Procédure stocké
Coté serveur Base des données
Coté application Java
try{
con=DriverManager.getConnection(url, username,
password);
String procedureSQL="call filterProduitQte(?);";
cstm=con.prepareCall(procedureSQL);
System.out.print("Veuillez saisir la quantité
:");
int qteProduit=Integer.parseInt(scanner.nextLine());
cstm.setInt(1, qteProduit);
cstm.execute();
rs=cstm.getResultSet();
String format="-%-6d%-30s%-10d%-15fn";
rs.beforeFirst();
while(rs.next()){
System.out.printf(format,rs.getInt("id"),
rs.getString("nom"), rs.getInt("quantite"),
rs.getDouble("prix"));
}
Procédure avec un seul paramètre entrant
Prof y.boukouchi - ENSA d'Agadir 35
DELIMITER | -- On change le délimiteur
CREATE PROCEDURE valeurStock (
OUT pValeur double)
BEGIN
select sum(quantite*prix)
INTO pValeur
from produit;
end|
CALL valeurStock (@valeur);
Select @valeur;
Procédure stocké
Coté serveur Base des données Coté application Java
try{
con=DriverManager.getConnection(url, username,
password);
String procedureSQL="call valeurStock(?);";
cstm=con.prepareCall(procedureSQL);
cstm.registerOutParameter(1, Types.DOUBLE);
cstm.execute();
double valeur=cstm.getDouble(1);
System.out.println("La valeur de stock : "+
valeur);
Procédure avec un seul paramètre sortant
Prof y.boukouchi - ENSA d'Agadir 36
DELIMITER | -- On change le délimiteur
CREATE PROCEDURE valeurStockCumule
(IN pID int,INOUT pStockCumule float)
BEGIN
DECLARE valeur float;
SELECT sum(quantite*prix) INTO valeur
FROM produit
WHERE id=pID;
SET pStockCumule=pStockCumule+valeur;
end|
set @valeurStock=0;
select @valeurStock;
call valeurStockCumule(4,@valeurStock);
select @valeurStock;
call valeurStockCumule(22,@valeurStock);
select @valeurStock;
Procédure stocké
Coté serveur Base des données
Coté application Java
try{
con=DriverManager.getConnection(url, username,
password);
String procedureSQL="call valeurStockCumule(?,?);";
int idProduit=0;
float valeurStockCumule=0;
cstm=con.prepareCall(procedureSQL);
while(idProduit>=0){
System.out.print("Veuillez saisir ID Produit :");
idProduit=Integer.parseInt(scanner.nextLine());
cstm.setInt(1, idProduit);
cstm.setFloat(2,valeurStockCumule );
cstm.registerOutParameter(2, Types.FLOAT);
cstm.execute();
valeurStockCumule=cstm.getFloat(2);
System.out.println("La valeur de stock cumulé: "+
valeurStockCumule);
}
Procédure avec un seul paramètre Entrant/Sortant
LES TRANSACTIONS
Prof y.boukouchi - ENSA d'Agadir 37
Transaction
■ Par défaut la connexion est en « auto-commit » : un commit est
automatiquement lancé après chaque ordre SQL qui modifie la base ‰
■ Pour définir une transaction composée de plusieurs requêtes SQL, il faut
désactiver l'auto-commit : connect.setAutoCommit(false)
■ Il faut alors explicitement valider ou annuler la transaction par:
– connect.commit() : valide une transaction
– connect.rollback() : annule une transaction
Prof y.boukouchi - ENSA d'Agadir 38
Transaction
// 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
con.commit ();
st. close ();
}
catch ( java.sql.SQLException e) { conn.rollback (); }
Prof y.boukouchi - ENSA d'Agadir 39
Batch :Traitement de masse
Prof y.boukouchi - ENSA d'Agadir 40
• JDBC permet de réaliser des mises à jour de masse en regroupant plusieurs traitements
pour les envoyer en une seule fois au SGBD.
• Ceci permet d'améliorer les performances surtout si le nombre de traitements est
important.
• Plusieurs méthodes ont été ajoutées à l'interface Statement pour pouvoir utiliser les mises
à jour de masse :
• void addBatch(String): permet d'ajouter une chaîne contenant une requête SQL
• int[] executeBatch(): permet d'exécuter toutes les requêtes. Elle renvoie un tableau
d'entiers qui contient pour chaque requête, le nombre de mises à jour effectuées.
• void clearBatch(): supprime toutes les requêtes stockées
• Lors de l'utilisation de batchupdate, il est préférable de positionner l'attribut
autocommit à false afin de faciliter la gestion des transactions et le traitement d'une
erreur dans l'exécution d'un ou plusieurs traitements.
connection.setAutoCommit(false);
Statement statement = connection.createStatement();
for(int i=0; i<10 ; i++) {
statement.addBatch("INSERT INTO personne VALUES('nom"+i+"','prenom"+i+"')");
}
statement.executeBatch();
LES METADATA
Prof y.boukouchi - ENSA d'Agadir 41
Les métadatas
■ JDBC permet d’offrir des données sur les données récupérées (Métadonnées) par la
connexion établée et les requetés exécutées.
■ Ces metadatas est très utiles pour savoir les capacités, les limitation et les
possibilité offertes par un système de gestion des bases de données et ainsi que ses
ressources.
■ JDBC support trois type de metaddata:
– Le metadata de la base des données
– Le metadata de ResultSet
– Le metadata des paramétres.
Prof y.boukouchi - ENSA d'Agadir 42
Les métadatas
■ Il existe deux sort de métadonnées:
1. Métadonnées associées à un objet résultat de type ResultSet, elles sont
encapsulées dans objet de type ResultSetMetaData qui dispose de méthodes
permettant d’obtenir des informations sur les champs qui constituent ce résultat à
l’aide de la méthode getMetadata():
■ ResultSetMetaData resMD= res.getMetaData();
■ resMD.getColumnCount(); //le nombre de colonne
■ resMD.getColumnName(int n); //le nom de la colonne de rang n
■ resMD.getColumnTypeName(i); // le type SQL du champ de rang i
■ resMD.getColumnClassName(i); // le type java à utilisé pour le champ de rang i
■ resMD.gettableName(i);// le nom de la table d’où est issu le champ de rang i
■ isNullable()
■ isAutoIncrement()
■ Etc.
Prof y.boukouchi - ENSA d'Agadir 43
2 - Métadonnées associées à la base. à partir d’une connexion établée on peut obtenir les métadonnées
relatives à cette base en créant un objet de type DatabaseMetadata à l’aide de la méthode getMetaData
de la classe Connection:
■ DatabaseMetadata resMDB= connect.getMetaData();
■ Informations sur le SGBD et Pilote:
– resMDB.getDriverName et resMDB.getDriverVersion
– resMDB.getSQLKeywords;// un tableau des mots-clés SQL reconnus par le SGBD
– resMDB.getTypeInfo(); // un ResultSet contenant la liste des types SQL accéptés par le SGBD
– resrMDB.getDatabaseProductName()
– resMDB.getDatabaseProductVersion()
– Etc.
■ Information sur la structure de la base:
– resMDB.getTable(catalogue, schéma, motif-séléction, type_tableaux);
String catalog=null, schemaPattern=null, tableNamePattern=null, types[]={"TABLE"};
ResultSet tables=metaDB.getTables(catalog, schemaPattern, tableNamePattern, types);
System.out.println(" ------ Tables-----");
while(tables.next()){
System.out.println(tables.getString("TABLE_NAME"));
}
Prof y.boukouchi - ENSA d'Agadir 44
Les métadatas
Merci de votre attention.
Prof y.boukouchi - ENSA d'Agadir 45
1 of 44

Recommended

Appalications JEE avec Servlet/JSP by
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPYouness Boukouchi
2.7K views138 slides
Support de cours Spring M.youssfi by
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfiENSET, Université Hassan II Casablanca
97.8K views164 slides
Support programmation orientée aspect mohamed youssfi (aop) by
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)ENSET, Université Hassan II Casablanca
125.6K views78 slides
Support JEE Spring Inversion de Controle IOC et Spring MVC by
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCENSET, Université Hassan II Casablanca
38K views122 slides
Support Web Services SOAP et RESTful Mr YOUSSFI by
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFIENSET, Université Hassan II Casablanca
50.8K views391 slides
Support de cours angular by
Support de cours angularSupport de cours angular
Support de cours angularENSET, Université Hassan II Casablanca
38.2K views92 slides

More Related Content

What's hot

Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate by
Site JEE de ECommerce  Basé sur Spring IOC MVC Security JPA HibernateSite JEE de ECommerce  Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA HibernateENSET, Université Hassan II Casablanca
43.5K views158 slides
Support JEE Servlet Jsp MVC M.Youssfi by
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiENSET, Université Hassan II Casablanca
51.5K views119 slides
Architecture jee principe de inversion de controle et injection des dependances by
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
21K views48 slides
Support de Cours JSF2 Première partie Intégration avec Spring by
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringENSET, Université Hassan II Casablanca
26.4K views59 slides
softCours design pattern m youssfi partie 9 creation des objets abstract fact... by
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...ENSET, Université Hassan II Casablanca
22.8K views30 slides
Support Java Avancé Troisième Partie by
Support Java Avancé Troisième PartieSupport Java Avancé Troisième Partie
Support Java Avancé Troisième PartieENSET, Université Hassan II Casablanca
26.3K views200 slides

What's hot(20)

Similar to JDBC: Gestion des bases de données en Java

Jdbc by
JdbcJdbc
JdbcNizar Turki
467 views15 slides
Marzouk une introduction à jdbc by
Marzouk une introduction à jdbcMarzouk une introduction à jdbc
Marzouk une introduction à jdbcabderrahim marzouk
62 views27 slides
Introduction jdbc by
Introduction  jdbcIntroduction  jdbc
Introduction jdbcKarim Amane
558 views20 slides
Java Database Connectivity by
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
1.4K views42 slides
Jdbc by
JdbcJdbc
Jdbcmohamed el haddad
68 views24 slides
Jdbc par4 by
Jdbc par4Jdbc par4
Jdbc par4Karim Amane
298 views7 slides

Similar to JDBC: Gestion des bases de données en Java (20)

Introduction jdbc by Karim Amane
Introduction  jdbcIntroduction  jdbc
Introduction jdbc
Karim Amane558 views
Java Database Connectivity by Korteby Farouk
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
Korteby Farouk1.4K views
Java et bases de données : JDBC by Mohammed Jaafar
Java et bases de données : JDBCJava et bases de données : JDBC
Java et bases de données : JDBC
Mohammed Jaafar647 views
Accès aux bases de données via jdbc by Rachid Lajouad
Accès aux bases de données via jdbcAccès aux bases de données via jdbc
Accès aux bases de données via jdbc
Rachid Lajouad931 views
Développement Web- PHP (partie II).pdf by YasushiTsubakik
Développement Web- PHP (partie II).pdfDéveloppement Web- PHP (partie II).pdf
Développement Web- PHP (partie II).pdf
YasushiTsubakik9 views
Activity by dido
ActivityActivity
Activity
dido174 views
GWT : under the hood by svuillet
GWT : under the hoodGWT : under the hood
GWT : under the hood
svuillet4.5K views
Fmin103 0910 tpjdbc by Karim Amane
Fmin103 0910 tpjdbcFmin103 0910 tpjdbc
Fmin103 0910 tpjdbc
Karim Amane265 views
Workshop spring session 2 - La persistance au sein des applications Java by Antoine Rey
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
Antoine Rey10.4K views
Aperçu de RequireJS by VISEO
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
VISEO2.5K views

More from Youness Boukouchi

Les fondamentaux de langage C# by
Les fondamentaux de langage C#Les fondamentaux de langage C#
Les fondamentaux de langage C#Youness Boukouchi
2.3K views88 slides
La persistance des données : ORM et hibernate by
La persistance des données : ORM et hibernateLa persistance des données : ORM et hibernate
La persistance des données : ORM et hibernateYouness Boukouchi
1.9K views103 slides
Programmation en C by
Programmation en CProgrammation en C
Programmation en CYouness Boukouchi
1.9K views114 slides
Test logiciel by
Test logicielTest logiciel
Test logicielYouness Boukouchi
11.1K views68 slides
Métriques de qualité logicielle by
Métriques de qualité logicielleMétriques de qualité logicielle
Métriques de qualité logicielleYouness Boukouchi
26.4K views69 slides
Modélisation des processus métiers BPMN by
Modélisation des processus métiers BPMNModélisation des processus métiers BPMN
Modélisation des processus métiers BPMNYouness Boukouchi
14.8K views54 slides

More from Youness Boukouchi(10)

JDBC: Gestion des bases de données en Java

  • 1. GESTION DES BASES DE DONNÉES EN JAVA JDBC Java DataBase Connectivity parYouness BOUKOUCHI ENSA-Agadir 4e année Génie Informatique
  • 2. Définition ■ JDBC (Java DataBase Connectivity) est une bibliothèque d’interfaces et de classes utilisées pour accéder à un SGBDR. ■ Un programme JDBC envoie à un SGBDR des requêtes écrites en SQL puis exploite le résultat renvoyé en Java. ■ Chaque éditeur de SGBDR fournit son driver JDBC sous forme d’un ensemble de classes rassemblées dans un fichier d’archive .jar , qu’il faut ajouter à l’option – classpath lors de l’exécution de votre programme. ■ L'API JDBC est indépendante des SGBD. Un changement de SGBD ne doit pas impacter le code applicatif Prof y.boukouchi - ENSA d'Agadir 2
  • 3. Les Drivers (Pilotes) JDBC ■ Le code applicatif est basé sur les interfaces du JDBC. Au niveau du programme d’application on ne travaille qu’avec les abstractions (interfaces) sans ce soucier des classes effectives d’implémentation ■ Les interfaces définissent une abstraction du pilote (driver) de la base de données. Chaque fournisseur propose sa propre implémentation de ces interfaces ■ Pour accéder à un SGBD il est nécessaire de disposer de classes implémentant ces interfaces. L'ensemble de ces classes pour un SGBD donné est appelé pilote (driver) JDBC ■ Drivers (ou pilotes) permettent de traduire les requêtes JDBC dans le langage du SGBD, ils sont constitués de classes implantant certaines interfaces de java.sql. Prof y.boukouchi - ENSA d'Agadir 3
  • 4. Prof y.boukouchi - ENSA d'Agadir 4 types de pilotes JDBC ■ Type 1 (JDBC1): pont JDBC-ODBC ■ ‰Type 2 (JDBC2): driver qui fait appel à des fonctions natives non Java (le plus souvent en langage C) de l'API du SGBD que l'on veut utiliser ■ ‰Type 3 (JDBC3): driver qui permet l'utilisation d'un serveur middleware ■ ‰Type 4 (JDBC4): driver écrit entièrement en Java, qui utilise le protocole réseau du SGBD
  • 5. Classes et Interfaces JDBC ■ L'API JDBC définit un ensemble d'interfaces et classes (package java.sql) qui définissent un protocole de communication entre le programme java client et le SGBD. ■ le package java.sql est complété par le package javax.sql Prof y.boukouchi - ENSA d'Agadir 5 Les classes du package java.sql Les interfaces du package java.sql
  • 6. MISE EN ŒUVRE DE JDBC Prof y.boukouchi - ENSA d'Agadir 6
  • 7. Mise en œuvre de JDBC ■ Etape 0: Importer le package java.sql et le driver ■ Etape 1 Etablir la connexion au SGBD ■ Etape 2 Créer la requête (ou instruction SQL) ■ Etape 3 Exécuter la requête ■ Etape 4 Traiter les données retournées ■ Etape 5 Fermer la connexion Prof y.boukouchi - ENSA d'Agadir 7
  • 8. Exemple 1 Prof y.boukouchi - ENSA d'Agadir 8 package jdbc.tp.ensa; import java.sql.DriverManager; import java.sql.Connection; import java.sql.SQLException; public class TP1Connexion { private static String username="admin"; private static String password="admin"; private static String url="jdbc:mysql://localhost:3306/stock"; public static void main(String[] args) throws SQLException { Connection conn=null; try { conn=DriverManager.getConnection(url, username, password); System.out.println("Connexion etablie à la BD MySQL"); } catch (SQLException e) { System.err.println("Problème de connexion à la BD "); }finally { if (conn!=null){conn.close();} } } } Les paramètres de connexion à la BD Importer le package java.sql Le DriverManager essaie tous les drivers enregistrés jusqu'à ce qu'il trouve un driver qui lui fournisse une connexion. Exception où cas d’une erreur La fermeture de la connexion
  • 9. Exemple 2 Prof y.boukouchi - ENSA d'Agadir 9 ... import java.sql.ResultSet; import java.sql.Statement; public class TP2Statement { private static String username="admin"; ... public static void main(String[] args) throws SQLException { Connection con=null; Statement stm=null; ResultSet rs=null; try { con=DriverManager.getConnection(url, username, password); stm=con.createStatement(); String reqSQL="select * from produit"; rs=stm.executeQuery(reqSQL); while(rs.next()){ System.out.println(rs.getInt(1)+":"+rs.getString("nom")+","+rs.getInt(3)+","+rs.getDouble("prix")); } } catch (SQLException e) { System.err.println("Problème de connexion à la BD "); }finally { if (rs!=null){rs.close();} if (stm!=null){stm.close();} if (con!=null){con.close();} } } } Création de la requête Exécution de la requête Parcours des résultats de ResultSet Libération des ressources
  • 10. Étape 1 : Etablir la connexion à la BD ■ On utilise la méthode getConnection() de DriverManager avec trois arguments : – URL de la base de données de la forme : Protocole :<sous-protocole>:<nom- BD>?param=valeur, ... ■ Protocole: JDBC ■ sous-protocole : mysql ■ exemples – String url = "jdbc:odbc:maBase" – String url = "jdbc:mysql://127.0.0.1:3306/maBase" – String url = "jdbc:postgresql://localhost/maBase" – User : le nom de l'utilisateur de la base – Password : son mot de passe ■ Connection connexion = DriverManager.getConnection(url ,user , pw) ■ le DriverManager essaie tous les drivers enregistrés jusqu'à ce qu'il trouve un driver qui lui fournisse une connexion. ■ La plupart des méthodes lèvent l'exception java.sql.SQLException. Prof y.boukouchi - ENSA d'Agadir 11
  • 11. Etape 2 : Créer une requête ■ La requête est créée avec l'interface Statement qui possède les méthodes nécessaires pour réaliser les requêtes sur la base associée à la connexion ■ 3 types (interfaces) d'objets statement : – Statement : requêtes simples (SQL statique) – PreparedStatement : requêtes paramétrables (ou dynamiques) précompilées (requêtes avec paramètres d'entrée/sortie) – CallableStatement : encapsule procédures SQL stockées dans le SGBD ■ Création d'un statement : – Statement stm = connexion.createStatement(); – PreparedStatement stm = connexion.prepareStatement(str); – CallableStatement stm = connexion.prepareCall(str); Prof y.boukouchi - ENSA d'Agadir 12
  • 12. Etape 3 : Exécuter une requête ■ 3 méthodes d'exécutions d’un Statement: – ResultSet executeQuery (String SQL) : pour les requêtes qui retournent un résultat (SELECT) résultat accessible au travers d'un objet ResultSet – int executeUpdate(String SQL) : pour les requêtes qui ne retournent pas de résultat (INSERT, UPDATE, DELETE, CREATE TABLE et DROP TABLE) – boolean execute(String SQL) : quand on ne sait pas si la requête retourne ou non un résultat,procédures stockées. ■ Exécution de la requête : – String myQuery = " SELECT prenom , nom , email FROM employe " ; – ResultSet resultat = stm.executeQuery ( myQuery ); ■ executeQuery renvoie un objet de type ResultSet décrivant la table des résultats Prof y.boukouchi - ENSA d'Agadir 13
  • 13. Etape 4 : traiter les données retournées ■ executeQuery() : renvoie une instance de ResultSet qui permet d'accéder aux champs des n-uplets sélectionnés. ■ Les rangées du ResultSet se parcourent itérativement ligne (row) par ligne. ■ Exemple: while(res.next()){ // Parcours du résultat ref_produit=res.getString(1); nom_produit=res.getString(2); prix_produit=res.getDouble(3); System.out.println(ref_produit+" : "+nom_produit+" : "+prix_produit); } – boolean next() : permet d'avancer à la ligne suivante, retourne false si pas de ligne suivante placé avant la première ligne à la création du ResultSet – 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 des méthodes (String nomCol) ou getXXX(int numCol) où XXX dépend du type de la colonne dans la table SQL Prof y.boukouchi - ENSA d'Agadir 14
  • 14. Étapes 5 : fermer les connexions ■ Pour terminer proprement un traitement, il faut fermer les différents espaces ouverts. Le ramasse-miettes peut le faire mais de façon moins efficace ■ Chaque objet possède une méthode close() : – resultset.close (); – statement.close (); – connection.close (); Prof y.boukouchi - ENSA d'Agadir 15
  • 15. Traitement des exceptions JDBC ■ Les méthodes JDBC lancent une exception de type SQLException ■ SQLException étend la class Exception ■ Les methodes pour tracer les Exception: – getMessage() – getErrorCode() – getLocalizedMessage() – getSQLState() – getNextException() – setNextException() – Iterator() Prof y.boukouchi - ENSA d'Agadir 16
  • 16. PARCOURS & ACTUALISATION DES DONNÉES Prof y.boukouchi - ENSA d'Agadir 17
  • 17. ■ Les méthodes de ResultSet sont divisés en 3 catégories: 1. Méthodes de navigation (next(), first(), last(), etc.) 2. Méthodes de Getters (getInt(), getDouble(), getString(), etc.) 3. Méthodes de mise-à-jour (updateInt(), updateFloat(), UpdateDate(), etc.) Prof y.boukouchi - ENSA d'Agadir 18 ResultSet : Parcours & Actualisation des données
  • 18. Parcours & Actualisation des données ■ Méthodes de navigation Prof y.boukouchi - ENSA d'Agadir 19 Méthode (classe ResultSet) Fonction next() Avance le curseur d’un enregistrement previous() Recule le curseur d’un enregistrement absolute(n) Place le curseur sur l’enregistrement de rang n s’il existe relative(n) Déplace le curseur de n position (n peut être négatif) par rapport à sa position actuelle first() Place le curseur sur le premier enregistrement last() Place le curseur sur le dernier enregistrement beforFirst() Place le curseur avant le premier enregistrement beforLast() Place le curseur avant le dernier enregistrement
  • 19. Parcours & Actualisation des données ■ Les méthodes d’information sur la position du curseur Prof y.boukouchi - ENSA d'Agadir 20 Méthode (classe ResultSet) Fonction isFirst() Fournit true si le curseur est placé sur le premier enregistrement Islast() Fournit true si le curseur est placé sur le dernier enregistrement isBeforFisrt() Fournit true si le curseur est placé avant le premier enregistrement isBeforLast() Fournit true si le curseur est placé avant le dernier enregistrement getRow() Fournit un entier correspondant au numéro de l’enregistrement désigné par le curseur ■ Méthodes de navigation
  • 20. ■ les méthodes d’accès : les getters ■ Les correspondances entre type SQL et type Java sont données par les spécifications JDBC. Prof y.boukouchi - ENSA d'Agadir 21 Type SQL Description Type Java Méthode java BIT 1 bit Booblean getBoolean() TINYINT Entier 8 bits Byte getByte() SMALLINT Entier 16 bits Short getShort() INTEGER Entier 32 bits Int getInt() BIGINT Entier 64 bits Long getLong() REAL Flottant 32 bits Float getFloat() DOUBLE Flottant 64 bits Double getDouble() DECIMAL(c,d) Nombre décimale de c chiffres dont d décimale représenté de façon exacte Java,math,BigDecimal getBigDecimal() NUMERIC(c,d) Nombre décimale de c chiffres dont d décimale représenté de façon exacte Java,math,BigDecimal getBigDecimal() CHAR(n) Chaine d’exactement n caractères String getString() VARCHAR(n) Chaine d’au plus n caractères String getString() DATE Date Java.SQL.Date getDate() TIME Heure Java.SQL.Time getTime() TIME STAMP Date et heure Java.SQL.Timestamp getTimeStamp() BLOB Un BLOB ou Binary Large OBject permet de stocker de grandes quantités de données sous forme binaire. java.sql.Blob getBlob() Parcours & Actualisation des données
  • 21. Parcours & Actualisation des données ■ Les méthode de mise-à-jour ■ La modification des résultats se fait a l'aide d’une méthode dont le nom est de la forme : – updateXXX( le champ concerné , la nouvelle valeur); où XXX désigne un type Java. ■ Il faut réaliser plusieurs appels pour modifier plusieurs champs de l‘enregistrement courant. ■ Enfin, il faut valider les modifications en appelant la méthode updateRaw(); si on ne le fait pas avant déplacement du curseur, les modifications ne seront pas reportées dans la base. ■ Exemple: – res.updatelnt ("nom", "Pc portable"); – res.updateString ("quantité", 50); – res.updateRow(); Prof y.boukouchi - ENSA d'Agadir 22
  • 22. Parcours & Actualisation des données ■ Les méthode de mise-à-jour ■ La suppression de l’enregistrement courant se fait en appelant la méthode deleteRow(). ■ L‘ajout d'un nouvel enregistrement se fait a l‘aide des méthodes moveTolnsertRow et insertRow qu‘on utilise suivant ce schéma : – rs. moveTolnsertRow(); // insère un nouvel enregistrement a la position du curseur. – rs.updateXXX(..., ...); // utilisation des méthodes updateXXX – rs.updateXXX(..., ...); //pour donner des valeurs aux différents champs – ,,,, – rs.insertRow() ; // l'insertion est reportée dans la base Prof y.boukouchi - ENSA d'Agadir 23
  • 23. Parcours & Actualisation des données ■ On peut choisir différent mode de déplacement et différent modes d’actualisations des données, en fournissant deux arguments à la méthode CreatStatement: – CreateStatement( Type_défilement,Type_actualisation ) ■ Type_défilement : – ResultSet.TYPE_FORWARD_ONLY : curseur unidirectionnel (valeur par défaut) – ResultSet.TYPE_SCROLL_INSENSITIVE : curseur bidirectionnel;modification de la base non reportées dans les résultats – ResultSet.TYPE_SCROLL_SENSITIVE: curseur bidirectionnel; modification de la base reportées dans les résultats ■ Type_actualisation: – ResultSet.CONCUR_READ_ONLY : les résultats ne peuvent pas être modifies pour mettre à jour la base (valeur par défaut) – ResultSet.CONCUR_UPDATABLE : les résultats sont modifiables et les modification sont répercutées sur la base ■ Exemple : – CreateStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY) – Équivaut à : CreateStatement() Prof y.boukouchi - ENSA d'Agadir 24
  • 24. Parcours & Actualisation des données Prof y.boukouchi - ENSA d'Agadir 25 ■ Exemple Statement stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs=stm.executeQuery("SELECT Prenom, Nom, Num FROM Individu"); rs.moveToInsertRow(); rs.updateString(1, "Ali"); rs.updateString(2, "Fatima"); rs.updateLong(3, 2780); rs.insertRow(); rs.moveToCurrentRow();
  • 25. LES REQUÊTES PRÉPARÉES Prof y.boukouchi - ENSA d'Agadir 26
  • 26. Les requêtes préparées ■ Si on doit répéter plusieurs fois la même requête : – SELECT * FROM produit WHERE reference=‘’A111’’ – SELECT * FROM produit WHERE reference=‘’A112’’ – SELECT * FROM produit WHERE reference=‘’A113’’ ■ Alors requête préparée permet d‘écrire une seule requête dans laquelle on prévoit un ou plusieurs paramètres, par exemple: – SELECT * FROM produit WHERE reference=? ■ Le symbole ? désigne un paramètre dont la valeur sera fixée par la suite. ■ une requête préparée est transmise au SGDBR à l’aide de la méthode prepareStatement de la classe Connection et elle est compilée partiellement. ■ On obtient en résultat un objet de type PreparedStatement contenant toutes les informations nécessaires à l'exploitation de cette requête préparée par le SGDBR: – String requeteSQL: = "Select * from produits WhERE reference = ?"; – PreparedStatement prepStmt = connec.prepareStatement(requeteSQL); Prof y.boukouchi - ENSA d'Agadir 27
  • 27. Les requêtes préparées ■ Ensuite, on peut transmettre au SGBDR, les valeurs voulues des paramètres, à l'aide de méthodes de la forme setXXX (rang, valeur) de la classe PreparedStatement, auxquelles on précise : – le rang du paramètre concerné; – la valeur prévue pour ce paramètre. – exemple:prepStmy.setString(1, " A001 "); ■ En fin, on execute la requête par l’une de ces méthodes executeQuery, executeUpdate ou execute. – ResultSet res = prepStmt.executeQuery() ■ Exemple : – String requeteSQL= " UPDATE produit set qte = ? Where reference=?"; – PreparedStatement prepStmt=con,prepareStatement(requeteSQL); – prepStmt.setInt(1,12); – prepStmt,setString(2," A001"); – ResultSet res = prepStmt.executeUpdate() Prof y.boukouchi - ENSA d'Agadir 28
  • 28. LES PROCÉDURES STOCKÉS Prof y.boukouchi - ENSA d'Agadir 29
  • 29. Procédure stocké ■ Une procédure stockée est une série d'instructions SQL désignée par un nom. ■ Lorsque l'on crée une procédure stockée, on l'enregistre dans la base de données que l'on utilise, au même titre qu'une table, par exemple. ■ Une fois la procédure créée, il est possible d'appeler celle-ci par son nom. Les instructions de la procédure sont alors exécutées. ■ Contrairement aux requêtes préparées, qui ne sont gardées en mémoire que pour la session courante, les procédures stockées sont stockées de manière durable, et font bien partie intégrante de la base de données dans laquelle elles sont enregistrées Prof y.boukouchi - ENSA d'Agadir 30 CREATE PROCEDURE nom_procedure ([param1 [, param2, ...]]) corps de la procédure;
  • 30. Procédure stocké ■ Exemples: Prof y.boukouchi - ENSA d'Agadir 31 CREATE PROCEDURE nom_procedure ([param1 [, param2, ...]]) corps de la procédure; DELIMITER | CREATE PROCEDURE nom_procedure ([param1 [, param2, ...]]) Begin corps de la procédure; End| -- Le délimiteur c'est le caractère qui permet de délimiter les instructions. Par défaut c’est ‘;’
  • 31. Prof y.boukouchi - ENSA d'Agadir 32 DELIMITER | -- On change le délimiteur CREATE PROCEDURE afficherProduits() -- pas de paramètres BEGIN SELECT * FROM produit; END| -- on termine la commande CREATE PROCEDURE par le nouveau délimiteur CALL afficherProduits(); Procédure stocké Coté serveur Base des données Coté application Java Connection con=null; CallableStatement cstm=null; ResultSet rs=null; try{ con=DriverManager.getConnection(url, username, password); String procedureSQL="call afficherProduits()"; cstm=con.prepareCall(procedureSQL); cstm.execute(); rs=cstm.getResultSet(); String format="-%-6d%-30s%-10d%-15fn"; rs.beforeFirst(); while(rs.next()){ System.out.printf(format,rs.getInt("id"), rs.getString("nom"), rs.getInt("quantite"), rs.getDouble("prix")); } Procédure sans paramètres
  • 32. Procédure stocké Les types de Paramètres: ■ Le sens du paramètre peut prendre 3 valeurs : • IN : le paramètre sera une valeur ou une variable d'entrée, envoyé lors de l'appel, et qui sera utilisé à l'intérieur de la procédure. • OUT : le paramètre sera une variable de sortie. Le paramètre indiqué sera une variable (de session ou de procédure) qui prendra une valeur lors de la procédure. • INOUT : le paramètre sera une variable d'entrée-sortie. Cette variable pourra être utilisé ou non dans la procédure, et verra normalement sa valeur modifiée lors de la procédure. Prof y.boukouchi - ENSA d'Agadir 33
  • 33. Prof y.boukouchi - ENSA d'Agadir 34 DELIMITER | -- On change le délimiteur CREATE PROCEDURE filterProduitQte( IN qte int) BEGIN select * from produit where quantite>=qte; end| CALL filterProduitQte(10); Procédure stocké Coté serveur Base des données Coté application Java try{ con=DriverManager.getConnection(url, username, password); String procedureSQL="call filterProduitQte(?);"; cstm=con.prepareCall(procedureSQL); System.out.print("Veuillez saisir la quantité :"); int qteProduit=Integer.parseInt(scanner.nextLine()); cstm.setInt(1, qteProduit); cstm.execute(); rs=cstm.getResultSet(); String format="-%-6d%-30s%-10d%-15fn"; rs.beforeFirst(); while(rs.next()){ System.out.printf(format,rs.getInt("id"), rs.getString("nom"), rs.getInt("quantite"), rs.getDouble("prix")); } Procédure avec un seul paramètre entrant
  • 34. Prof y.boukouchi - ENSA d'Agadir 35 DELIMITER | -- On change le délimiteur CREATE PROCEDURE valeurStock ( OUT pValeur double) BEGIN select sum(quantite*prix) INTO pValeur from produit; end| CALL valeurStock (@valeur); Select @valeur; Procédure stocké Coté serveur Base des données Coté application Java try{ con=DriverManager.getConnection(url, username, password); String procedureSQL="call valeurStock(?);"; cstm=con.prepareCall(procedureSQL); cstm.registerOutParameter(1, Types.DOUBLE); cstm.execute(); double valeur=cstm.getDouble(1); System.out.println("La valeur de stock : "+ valeur); Procédure avec un seul paramètre sortant
  • 35. Prof y.boukouchi - ENSA d'Agadir 36 DELIMITER | -- On change le délimiteur CREATE PROCEDURE valeurStockCumule (IN pID int,INOUT pStockCumule float) BEGIN DECLARE valeur float; SELECT sum(quantite*prix) INTO valeur FROM produit WHERE id=pID; SET pStockCumule=pStockCumule+valeur; end| set @valeurStock=0; select @valeurStock; call valeurStockCumule(4,@valeurStock); select @valeurStock; call valeurStockCumule(22,@valeurStock); select @valeurStock; Procédure stocké Coté serveur Base des données Coté application Java try{ con=DriverManager.getConnection(url, username, password); String procedureSQL="call valeurStockCumule(?,?);"; int idProduit=0; float valeurStockCumule=0; cstm=con.prepareCall(procedureSQL); while(idProduit>=0){ System.out.print("Veuillez saisir ID Produit :"); idProduit=Integer.parseInt(scanner.nextLine()); cstm.setInt(1, idProduit); cstm.setFloat(2,valeurStockCumule ); cstm.registerOutParameter(2, Types.FLOAT); cstm.execute(); valeurStockCumule=cstm.getFloat(2); System.out.println("La valeur de stock cumulé: "+ valeurStockCumule); } Procédure avec un seul paramètre Entrant/Sortant
  • 36. LES TRANSACTIONS Prof y.boukouchi - ENSA d'Agadir 37
  • 37. Transaction ■ Par défaut la connexion est en « auto-commit » : un commit est automatiquement lancé après chaque ordre SQL qui modifie la base ‰ ■ Pour définir une transaction composée de plusieurs requêtes SQL, il faut désactiver l'auto-commit : connect.setAutoCommit(false) ■ Il faut alors explicitement valider ou annuler la transaction par: – connect.commit() : valide une transaction – connect.rollback() : annule une transaction Prof y.boukouchi - ENSA d'Agadir 38
  • 38. Transaction // 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 con.commit (); st. close (); } catch ( java.sql.SQLException e) { conn.rollback (); } Prof y.boukouchi - ENSA d'Agadir 39
  • 39. Batch :Traitement de masse Prof y.boukouchi - ENSA d'Agadir 40 • JDBC permet de réaliser des mises à jour de masse en regroupant plusieurs traitements pour les envoyer en une seule fois au SGBD. • Ceci permet d'améliorer les performances surtout si le nombre de traitements est important. • Plusieurs méthodes ont été ajoutées à l'interface Statement pour pouvoir utiliser les mises à jour de masse : • void addBatch(String): permet d'ajouter une chaîne contenant une requête SQL • int[] executeBatch(): permet d'exécuter toutes les requêtes. Elle renvoie un tableau d'entiers qui contient pour chaque requête, le nombre de mises à jour effectuées. • void clearBatch(): supprime toutes les requêtes stockées • Lors de l'utilisation de batchupdate, il est préférable de positionner l'attribut autocommit à false afin de faciliter la gestion des transactions et le traitement d'une erreur dans l'exécution d'un ou plusieurs traitements. connection.setAutoCommit(false); Statement statement = connection.createStatement(); for(int i=0; i<10 ; i++) { statement.addBatch("INSERT INTO personne VALUES('nom"+i+"','prenom"+i+"')"); } statement.executeBatch();
  • 40. LES METADATA Prof y.boukouchi - ENSA d'Agadir 41
  • 41. Les métadatas ■ JDBC permet d’offrir des données sur les données récupérées (Métadonnées) par la connexion établée et les requetés exécutées. ■ Ces metadatas est très utiles pour savoir les capacités, les limitation et les possibilité offertes par un système de gestion des bases de données et ainsi que ses ressources. ■ JDBC support trois type de metaddata: – Le metadata de la base des données – Le metadata de ResultSet – Le metadata des paramétres. Prof y.boukouchi - ENSA d'Agadir 42
  • 42. Les métadatas ■ Il existe deux sort de métadonnées: 1. Métadonnées associées à un objet résultat de type ResultSet, elles sont encapsulées dans objet de type ResultSetMetaData qui dispose de méthodes permettant d’obtenir des informations sur les champs qui constituent ce résultat à l’aide de la méthode getMetadata(): ■ ResultSetMetaData resMD= res.getMetaData(); ■ resMD.getColumnCount(); //le nombre de colonne ■ resMD.getColumnName(int n); //le nom de la colonne de rang n ■ resMD.getColumnTypeName(i); // le type SQL du champ de rang i ■ resMD.getColumnClassName(i); // le type java à utilisé pour le champ de rang i ■ resMD.gettableName(i);// le nom de la table d’où est issu le champ de rang i ■ isNullable() ■ isAutoIncrement() ■ Etc. Prof y.boukouchi - ENSA d'Agadir 43
  • 43. 2 - Métadonnées associées à la base. à partir d’une connexion établée on peut obtenir les métadonnées relatives à cette base en créant un objet de type DatabaseMetadata à l’aide de la méthode getMetaData de la classe Connection: ■ DatabaseMetadata resMDB= connect.getMetaData(); ■ Informations sur le SGBD et Pilote: – resMDB.getDriverName et resMDB.getDriverVersion – resMDB.getSQLKeywords;// un tableau des mots-clés SQL reconnus par le SGBD – resMDB.getTypeInfo(); // un ResultSet contenant la liste des types SQL accéptés par le SGBD – resrMDB.getDatabaseProductName() – resMDB.getDatabaseProductVersion() – Etc. ■ Information sur la structure de la base: – resMDB.getTable(catalogue, schéma, motif-séléction, type_tableaux); String catalog=null, schemaPattern=null, tableNamePattern=null, types[]={"TABLE"}; ResultSet tables=metaDB.getTables(catalog, schemaPattern, tableNamePattern, types); System.out.println(" ------ Tables-----"); while(tables.next()){ System.out.println(tables.getString("TABLE_NAME")); } Prof y.boukouchi - ENSA d'Agadir 44 Les métadatas
  • 44. Merci de votre attention. Prof y.boukouchi - ENSA d'Agadir 45