jdbc ( java database connectivity - génie logiciel · 2011. 11. 1. · mise en ÷uvre de jdbc mise...

52

Upload: others

Post on 02-Jan-2021

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

JDBC (Java DataBase Connectivity)

M. Belguidoum

Université Mentouri de Constantine

Département Informatique

M. Belguidoum (UMC) Programmation réseau 1 / 52

Page 2: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Plan

1 Introduction

2 Le paquetage java.sql

3 Mise en ÷uvre de JDBC

4 Equivalence des types java-SQL

5 Fonctionnalités supplémentaires de JDBC

M. Belguidoum (UMC) Programmation réseau 2 / 52

Page 3: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Introduction

Objectifs de JDBC

Permettre aux programmeurs Java d'écrire un code indépendant de labase de données et du moyen de connexion utilisé

API JDBC (Java DataBase Connectivity) 3.0

interface uniforme permettant un accès homogène aux SGBDsimple à mettre en ÷uvreindépendant du SGBD supportsupportant les fonctionnalités de base du langage SQL

M. Belguidoum (UMC) Programmation réseau 3 / 52

Page 4: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Introduction

JDBC : introduction

JDBC (Java Data Base Connectivity) est une API permettant l'accèsà des bases de données relationnelles à partir du langage Java

l'accès aux bases de données est réalisé en trois étapes :

la création d'une connexion à la base.l'envoi d'instructions SQL.l'exploitation des résultats provenant de la base.

JDBC est représentée par le paquetage java.sql (depuis la version1.1 du JDK)

M. Belguidoum (UMC) Programmation réseau 4 / 52

Page 5: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Introduction

JDBC : les drivers

chaque SGBD utilise un pilote (driver) qui lui est propre et qui permetde convertir les requêtes JDBC dans le langage natif du SGBD

le driver est un ensemble de classes qui implantent les interfaces deJDBC

les drivers dont le lien entre le programme Java et le SGBD

ces drivers dits JDBC existent pour tous les principaux SGBD : Oracle,Sybase, Informix, DB2, MySQL,...

M. Belguidoum (UMC) Programmation réseau 5 / 52

Page 6: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Introduction

JDBC : introduction

Les pilotes JDBC sont classés en quatre catégories :

les pilotes de pont JDBC/ODBC : ce type de pilote, fourni avec leJ2SE (Java 2 Standard Edition), permet de convertir les appels JDBCen appels ODBC (Open Database Connectivity). ODBC est fourni enstandard sur les plates-formes Windows et permet la connexion à desbases de natures diverses (Access, SQL Server, Oracle, ...).les pilotes de type 2 : ils sont écrits, en partie, en Java, maisdépendent malgré tout de code natif. En termes de portaged'application Java, ces types de pilotes présentent quelques lacunes.les pilotes de type 3 : ce type de pilote passe par un autre piloteJDBC intermédiaire (fréquemment de type 1 ou 2). Il s'agitcertainement du type de pilote le moins utile des quatre proposés.les pilotes de type 4 : leur code est écrit en Java, donc portable. Cespilotes sont fournis par presque tous les constructeurs de bases dedonnées. Chaque pilote étant adapté à une base de donnéesparticulière. Ces drivers constituent la meilleure solution pour leportage des applications Java.

M. Belguidoum (UMC) Programmation réseau 6 / 52

Page 7: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Introduction

JDBC : pilote de type 1

Pont JDBC-ODBC (Open Data Base Connectivity)

M. Belguidoum (UMC) Programmation réseau 7 / 52

Page 8: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Introduction

JDBC : pilote de type 2

API native

M. Belguidoum (UMC) Programmation réseau 8 / 52

Page 9: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Introduction

JDBC : pilote de type 3

M. Belguidoum (UMC) Programmation réseau 9 / 52

Page 10: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Introduction

JDBC : pilote de type 4

Thin (protocole natif)

M. Belguidoum (UMC) Programmation réseau 10 / 52

Page 11: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Introduction

Les driver JDBC

Liste des drivers disponibles à :http://developers.sun.com/product/jdbc/drivers

sélection d'un driver

choix entre vitesse, �abilité et portabilité.Programme "standalone", avec une interface graphique qui s'exécutetoujours sur un système Windows peut tirer béné�ce de performancesd'un driver type 2 (driver code-natif).Une applet peut nécessiter un driver de type 3 (pour passer un �rewall).Une servlet déployée sur de multiples plateformes peut nécessiter lasouplesse o�erte par des drivers de type 4....

M. Belguidoum (UMC) Programmation réseau 11 / 52

Page 12: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Le paquetage java.sql

JDBC : le paquetage java.sql

M. Belguidoum (UMC) Programmation réseau 12 / 52

Page 13: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Le paquetage java.sql

JDBC : les interfaces

Driver : renvoie une instance de Connection

Connection : connexion à une base

Statement : instruction SQL

PreparedStatement : instruction SQL paramétrée

CallableStatement : procédure stockée dans la base

ResultSet : n-uplets récupérés par une instruction SQL

ResultSetMetaData : description des n-uplets récupérés

DatabaseMetaData : informations sur la base de données

M. Belguidoum (UMC) Programmation réseau 13 / 52

Page 14: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Le paquetage java.sql

JDBC : les classes

DriverManager : gère les drivers, lance les connexions aux bases

Date : date SQL

Time : heures, minutes, secondes SQL

TimeStamp : comme Time, avec une précision à la microseconde

Types : constantes pour désigner les types SQL (conversions)

M. Belguidoum (UMC) Programmation réseau 14 / 52

Page 15: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Le paquetage java.sql

JDBC : les Exceptions

SQLException : est levée dès qu'une connexion ou un ordre SQL nese déroule pas correctement

méthode getMessage() : pour obtenir le message en clair de l'erreurrenvoie également des informations spéci�ques au SGBD :SQLState etle code d'erreur SGBD

SQLWarning : avertissements SQL

DataTruncation : lorsqu'une valeur est tronquée lors d'uneconversion SGBD -Java

M. Belguidoum (UMC) Programmation réseau 15 / 52

Page 16: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Le paquetage java.sql

JDBC : DriverManager

M. Belguidoum (UMC) Programmation réseau 16 / 52

Page 17: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

Mise en ÷uvre de JDBC

1 Importer le package java.sql

2 Enregistrer le driver JDBC

3 Etablir la connexion au SGBD

4 Créer une requête (ou instruction SQL)

5 Exécuter la requête

6 Traiter les données retournées

7 Fermer la connexion

M. Belguidoum (UMC) Programmation réseau 17 / 52

Page 18: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

Interface Driver

La méthode connect() de Driver

nécessite un URL vers la baserenvoie une instance de l'interface Connection (null si le driver neconvient pas)

L'instance de Connection obtenue permet de lancer des requêtes

URL pour accéder à la base (syntaxe dépend du SGBD cible)

jdbc:<sous-protocole>:<nom-BD>?param=valeur, ...

sous-protocole : mysqlnom-BD : //foo.loria.fr:1114:maBaseexemples

String url = "jdbc:odbc:maBase"

String url = "jdbc:mysql://127.0.0.1:3306/maBase"

String url = "jdbc:oracle:thin:@charlemagne:infodb"

String url = "jdbc:mysql://foo.loria.fr:1114:maBase"

M. Belguidoum (UMC) Programmation réseau 18 / 52

Page 19: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

Étape 1 : enregistrer le driver

Rôle de la classe DriverManager : elle gère les di�érents drivers(instances de Driver)

Pour qu'un driver soit disponible, il faut charger sa classe en mémoire

Utiliser la méthode forName de la classe Class avec en paramètre lenom complet de la classe du driver : Class.forName("driverName")crée une instance de la classeenregistre cette instance auprès de la classe DriverManager

Class.forName("oracle.jdbc.driver.OracleDriver");// pilote OracleClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");// pilote ODBCClass.forName("com.mysql.jdbc.Driver");// pilote MySQL

Certains compilateurs refusent cette notation et demandent plutôt :

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

M. Belguidoum (UMC) Programmation réseau 19 / 52

Page 20: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

Étape 2 : connexion à la base

On utilise la méthode getConnection() de DriverManager avectrois arguments :

l'URL (Uniform Ressource Locator) de la base de données de la forme :jdbc:typedriver:base

le nom de l'utilisateur de la base : userson mot de passe : password

Connection connexion = DriverManager.getConnection(url ,user ,password );

le DriverManager essaie tous les drivers enregistrés (chargés enmémoire avec Class.forName()) jusqu'à ce qu'il trouve un driver quilui fournisse une connexion

M. Belguidoum (UMC) Programmation réseau 20 / 52

Page 21: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

Etape 3 : Créer/exécuter une requête

Une fois une Connection créée on peut l'utiliser pour créer et exécuterdes requêtes (statements) SQL.

3 types (interfaces) d'objets statement :

Statement : requêtes simples (SQL statique)PreparedStatement : requêtes précompilées (SQL dynamique sisupporté par SGBD) qui peuvent améliorer les performancesCallableStatement : encapsule procédures SQL stockées dans leSGBD

3 méthodes d'exécutions :executeQuery : pour les requêtes qui retournent un résultat (SELECT)

résultat accessible au travers d'un objet ResultSet

executeUpdate : pour les requêtes qui ne retournent pas de résultat(INSERT, UPDATE, DELETE, CREATE TABLE et DROP TABLE)execute : quand on ne sait pas si la requête retourne ou non unrésultat, procédures stockées

M. Belguidoum (UMC) Programmation réseau 21 / 52

Page 22: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

Etape 3 : Créer/exécuter une requête

Création d'un statement :

Statement state = connexion.createStatement ();

Exécution de la requête :

String myQuery = "SELECT prenom , nom , email " +"FROM employe " +"WHERE (nom='Dupont ') AND (email IS NOT NULL) " +"ORDER BY nom";ResultSet resultat = state.executeQuery(myQuery );

executeQuery(String q) renvoie un objet de type ResultSetdécrivant la table des résultats

M. Belguidoum (UMC) Programmation réseau 22 / 52

Page 23: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

Etape 4 : traiter les données retournées

executeQuery() : renvoie une instance de ResultSet qui permetd'accéder aux champs des n-uplets sélectionnés

seules les données demandées sont transférées en mémoire par ledriver JDBC

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

Les rangées du ResultSet se parcourent itérativement ligne (row) parligne

boolean next() : permet d'avancer à la ligne suivante, retourne falsesi pas de ligne suivantePlacé avant la première ligne à la création du ResultSetLes colonnes sont référencées par leur numéro ou par leur nomL'accès aux valeurs des colonnes se fait par des méthodes (StringnomCol) ou getXXX(int numCol) où XXX dépend du type de lacolonne dans la table SQLPour les très gros row, on peut utiliser des streams.

M. Belguidoum (UMC) Programmation réseau 23 / 52

Page 24: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

Etape 4 : Exemple de lecture des résultats

java.sql.Statement stmt = conn.createStatement ();ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");while (rs.next ()){int i = rs.getInt("a"); // rs.getInt (1); en SQL les numéros de colonnes

// débutent à 1String s = rs.getString("b"); // rs.getString (2);byte b[] = rs.getBytes("c"); // rs.getBytes (3);System.out.println("ROW = " + i + " " + s + " " + b[0]);}

M. Belguidoum (UMC) Programmation réseau 24 / 52

Page 25: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

ResultSet

exécuter next() au moins une fois pour avoir le premier

Impossible de revenir au n-uplet précédent ou de parcourir l'ensembledans un ordre non séquentiel

On peut parcourir le ResultSet d'avant en arrière : next() vs.previous()

en déplacement absolu (aller à la n-ième ligne) : absolute(introw), first(), last(), ...

en déplacement relatif (aller à la n-ième ligne à partir de la positioncourante du curseur) : relative(int row), afterLast(),

beforeFirst(), ...

M. Belguidoum (UMC) Programmation réseau 25 / 52

Page 26: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

ResultSet

Méthodes de parcours

first() : Positionne sur la première ligne (1er enregistrement)last() : Positionne sur la dernière ligne (dernier enregistrement)next() : Passe à la ligne suivanteprevious() : Passe à la ligne précédantebeforeFirst() : Positionne avant la première ligneafterLast() : Positionne après la dernière ligneabsolute(int) : Positionne à une ligne donnéerelative(int) : Déplacement d'un nombre de lignes donné parrapport à ligne courante

Méthodes de test de la position du curseur

boolean isFirst() : True si curseur positionné sur la première ligneboolean isBeforeFirst() : True si curseur positionné avant lapremière ligneboolean isLast() : True si curseur positionné sur la dernière ligneboolean isAfterLast() : True si curseur positionné après la dernièreligne

M. Belguidoum (UMC) Programmation réseau 26 / 52

Page 27: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Mise en ÷uvre de JDBC

Étapes 5 : fermer les connexions

Pour terminer proprement un traitement, il faut fermer les di�érentsespaces ouverts. Le ramasse-miettes peut le faire mais de façon moinse�cace

Chaque objet possède une méthode close() :

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

M. Belguidoum (UMC) Programmation réseau 27 / 52

Page 28: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Equivalence des types java-SQL

Equivalence des types java-SQL

M. Belguidoum (UMC) Programmation réseau 28 / 52

Page 29: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Equivalence des types java-SQL

Exemple complet

import java.sql .*;public class PrintAllEmployees {public static void main(String [] args)throws SQLException , ClassNotFoundException {String dbUrl = "jdbc:mysql :// localhost :3306/ yaps";String user = "root", password = "";// Chargement dynamique du driverClass.forName("com.mysql.jdbc.Driver");Connection conn; // Etablissement de la connexionconn = DriverManager.getConnection(dbUrl , user , password );Statement st = conn.createStatement (); // Création d'un statementString anSQLquery = "SELECT prenom , nom , age FROM employe ";// Exécution de la requêteResultSet r = st.executeQuery(anSQLquery );// Parcours du résultatwhile(r.next ()) {String nom = r.getString("nom");

int age = r.getInt("age");System.out.println(nom + ", " + age + " ans");

}r.close (); st.close (); conn.close (); }}

M. Belguidoum (UMC) Programmation réseau 29 / 52

Page 30: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Equivalence des types java-SQL

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

String anSQLquery = "SELECT prenom , nom , age FROM employe";// Création d'un statementStatement st = conn.createStatement ();// Exécution de la requêteResultSet r = st.executeQuery(anSQLquery );

M. Belguidoum (UMC) Programmation réseau 30 / 52

Page 31: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Equivalence des types java-SQL

Parcours du résultat : ResultSet

String query = "SELECT nom , age ...";ResutSet r = st.executeQuery(query);while(r.next ()) {

String nom = r.getString("nom");int age = r.getInt (2);// ...

}

M. Belguidoum (UMC) Programmation réseau 31 / 52

Page 32: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Equivalence des types java-SQL

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

Dans le cas d'une modi�cation de donnée (INSERT, UPDATE,DELETE), on utilise la méthode executeUpdate(...) qui renvoie unentier spéci�ant le nombre d'enregistrements modi�és

String reqSql = "DELETE FROM ...";int n = st.executeUpdate(reqSql)

M. Belguidoum (UMC) Programmation réseau 32 / 52

Page 33: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Avec JDBC, on peut aussi ...

Exécuter des requêtes SQL pré-compilées :java.sql.PreparedStatement

Exécuter des procédures stockées : java.sql.CallableStatement

Utiliser des transactions

Accéder aux méta-données (schéma) de la base :java.sql.DatabaseMetaData

Manipuler des BLOBs

M. Belguidoum (UMC) Programmation réseau 33 / 52

Page 34: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Requêtes pré-compilées

La plupart des SGBD o�re la possibilité de n'analyser qu'une seule foisune requête

JDBC permet de béné�cier de cette fonctionnalité

L'objet PreparedStatement envoie une requête sans paramètres à labase de données pour précompilation et spéci�era le moment voulu lavaleur des paramètres

plus rapide qu'un Statement classiquele SGBD n'analyse qu'une seule fois la requête (recherche d'unestratégie d'exécution adéquate)pour de nombreuses exécutions d'une même requête SQL avec desparamètres variables

tous les SGBD n'acceptent pas les requêtes précompilées

M. Belguidoum (UMC) Programmation réseau 34 / 52

Page 35: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Création d'une requête pré-compilée

La méthode prepareStatement() de l'objet Connection crée unPreparedStatement :

PreparedStatement ps =c.prepareStatement("SELECT * FROM Clients "+

"WHERE name = ? ");

les paramètres sont spéci�és par un " ?"

ils sont ensuite instanciés par les méthodes setInt(), setString(),setDate(),...

ces méthodes nécessitent 2 arguments (setInt(n, valeur))

le premier (int) indique le numéro relatif de l'argument dans larequêtele second indique la valeur à positionner

setNull(n,type) positionne le paramètre à NULL (SQL)

M. Belguidoum (UMC) Programmation réseau 35 / 52

Page 36: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Exécution d'une requête pré-compilée

PreparedStatement ps =c.prepareStatement("UPDATE emp SET sal = ? "+ "WHERE name = ?");

�for(int i = 0; i < 10; i++) {

ps.setFloat(1, salary[i]);ps.setString(2, name[i]);int count = ps.executeUpdate ();

}

M. Belguidoum (UMC) Programmation réseau 36 / 52

Page 37: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Avantages des PreparedStatement

Traitement plus rapide si utilisés plusieurs fois avec plusieursparamètres

Amélioration de la portabilité car les méthodes setXXX() n'ont pas àtenir compte des di�érences entre SGBD

Exemple : les SGBD n'utilisent pas tous les mêmes formats de date('JJ/MM/ AA' ou 'AAAA-MM-JJ') ou de chaînes de caractères (pourles caractères d'échappement)

M. Belguidoum (UMC) Programmation réseau 37 / 52

Page 38: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Les procédures stockées

procédures permettant de fournir la même fonctionnalité à plusieursutilisateurs

procédure stockée dans la base côté serveur

JDBC o�re une interface dédiée

CallableStatement

dérive de l'interface PreparedStatementgère le retour de valeur avec ResultSet

Comment

création d'un objet CallableStatementen utlisant Connection.prepareCall(...)

M. Belguidoum (UMC) Programmation réseau 38 / 52

Page 39: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Appel des procédures stockées

La requête doit être formatée

encadrée par des accolades {...}utilisation du pré�xe call

Trois modes pour l'appel

la procédure renvoie une valeur : { ? = call

nomProcédure(?,?,...)}

la procédure ne renvoie aucune valeur :{ call nomProcédure(?,?,...)}

si on ne lui passe aucun paramètre :{ call nomProcédure }

Passage de paramètres possible : comme pour PreparedStatement

M. Belguidoum (UMC) Programmation réseau 39 / 52

Page 40: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Example CallableStatement sans valeur de retour

CallableStatement testCall;testCall = conn.prepareCall(

"{ call setSalary (?,?) }");testCall.setString (1, "EUR");testCall.setLong(2, 2000);testCall.execute ();

M. Belguidoum (UMC) Programmation réseau 40 / 52

Page 41: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Accéder aux résultats

Un PreparedStatement peut retourner des données grâce à unResultSet

Les procédures stockées étendent le modèle

appel de la procédure précédé du passage des paramètres in et outgrâce aux méthodes setXXX()type des paramètres out et in/out grâce à la méthoderegisterOutParameter()

exécution de la requête grâce à executeQuery(), executeUpdate()ou execute()

récupération des paramètres out et in/out grâce aux méthodesgetXXX()

M. Belguidoum (UMC) Programmation réseau 41 / 52

Page 42: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Exemple d'une procédure stockée

create or replace procedure augmentation(unDept in integer ,pourcentage in number ,cout out number) is

beginupdate emp

set sal = sal * (1 + pourcentage / 100)where dept = unDept;

select sum(sal) * pourcentage / 100 into coutfrom empwhere dept = unDept;

end;

M. Belguidoum (UMC) Programmation réseau 42 / 52

Page 43: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Exemple suite CallableStatement

CallableStatement csmt = conn.prepareCall("{ call augmentation (?, ?, ?) }");

// 2 chiffres après la virgule pour 3ème paramètrecsmt.registerOutParameter (3, Types.DECIMAL , 2);// Augmentation de 2,5 % des salaires du dept 10csmt.setInt(1, 10);csmt.setDouble(2, 2.5);csmt.executeQuery ();double cout = csmt.getDouble (3);System.out.println("Cout total augmentation : "

+ cout);

M. Belguidoum (UMC) Programmation réseau 43 / 52

Page 44: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Transactions

3 services déclarés dans l'interface Connection :

setAutoCommit(boolean b)

commit() : valide une transactionrollback() : annulle une transaction

Les nouvelles connexions sont initialement en mode auto-commit =>commit implicite après chaque requête SQL

Pour dé�nir une transaction composée de plusieurs requêtes SQL, ilfaut désactiver l'auto-commit : conn.setAutoCommit(false)

Un appel à commit() ou rollback() va alors créer implicitement unenouvelle transaction

M. Belguidoum (UMC) Programmation réseau 44 / 52

Page 45: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Transactions : Exemple

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

M. Belguidoum (UMC) Programmation réseau 45 / 52

Page 46: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Accès aux méta-données

JDBC permet de récupérer des informations sur le type de donnéesque l'on vient de récupérer par un SELECT (interfaceResultSetMetaData) et sur la base elle-même (interfaceDatabaseMetaData)

Interface ResultSetMetaData

méthode getMetaData() permet d'obtenir des informations sur lestypes de données du ResultSet

elle renvoie des instances de ResultSetMetaDataon peut connaître :

le nombre de colonne : getColumnCount()

le nom d'une colonne : getColumnName(int col)

le nom de la table : getTableName(int col)

M. Belguidoum (UMC) Programmation réseau 46 / 52

Page 47: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Exemple : ResultSetMetaData

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

ResultSetMetaData rsmd = rs.getMetaData ();int nbColonnes = rsmd.getColumnCount ();for (int i = 1; i <= nbColonnes; i++) {

String typeColonne = rsmd.getColumnTypeName(i);String nomColonne= rsmd.getColumnName(i);System.out.println("Colonne " + i

+ " de nom " + nomColonne+ " de type " + typeColonne );

}

M. Belguidoum (UMC) Programmation réseau 47 / 52

Page 48: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Interface DatabaseMetaData

informations sur la base de données

méthode getMetaData() de l'objet Connection

dépend du SGBD avec lequel on travaille

elle renvoie des instances de DatabaseMetaData

on peut connaître :

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

M. Belguidoum (UMC) Programmation réseau 48 / 52

Page 49: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

CLOB et BLOB

2 types d'objets larges :

CLOB : Character large objectBLOB : Binary large

Une colonne de type BLOB est en fait un pointeur vers un �chier

create table userImages (user varchar (50), image BLOB)String q ="insert into userImages values('dewez ', ?)";Statement pstmt = con.prepareStatement(q);File file = new File("dewez.jpg");InputStream fin = new FileInputStream(file);pstmt.setBinaryStream (1, fin , file.length ());pstmt.executeUpdate ();

M. Belguidoum (UMC) Programmation réseau 49 / 52

Page 50: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Lire un BLOB

String q = "select image from userImages"ResultSet rs = stmt.executeQuery(q);while (rs.next) {Blob b = rs.getBlob("image");InputStream stream = b.getBinaryStream ();// ...}

M. Belguidoum (UMC) Programmation réseau 50 / 52

Page 51: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Conclusion

Interface pour un accès homogène

le concept de Driver masque au maximum les di�érences des SGBDAPI de bas niveau : il faut connaître SQL

Tous les éditeurs proposent un driver JDBC

Problèmes

JDBC n'e�ectue aucun contrôle sur les instructions SQLCorrespondance entre classes Java et relations est un travail de basniveau

M. Belguidoum (UMC) Programmation réseau 51 / 52

Page 52: JDBC ( Java DataBase Connectivity - Génie Logiciel · 2011. 11. 1. · Mise en ÷uvre de JDBC Mise en ÷uvre de JDBC 1 Importer le package java.sql 2 Enregistrer le driver JDBC 3

Fonctionnalités supplémentaires de JDBC

Références

The JDBC Tutorial : Chapter 3 - Advanced Tutorial,http://java.sun.com/developer/Books/JDBCTutorial/

slides de Olivier Perrin et philippe Genoud

Christian Soutou, "Apprendre SQL avec MySQL : Avec 40 exercicescorrigés"

M. Belguidoum (UMC) Programmation réseau 52 / 52