0% ont trouvé ce document utile (0 vote)
4 vues20 pages

8 - Java DataBase Connectivity

JDBC (Java DataBase Connectivity) fournit une API standardisée pour accéder aux bases de données conformes au standard SQL-92, permettant une abstraction des SGBD et un accès homogène. Il permet aux applications Java de se connecter à divers SGBD via des drivers, gérant les connexions, l'exécution de requêtes SQL et le traitement des résultats. Les classes et interfaces de JDBC facilitent la création et l'exécution de requêtes, ainsi que la gestion des résultats à travers des objets comme Connection, Statement et ResultSet.

Transféré par

sbet2049
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
4 vues20 pages

8 - Java DataBase Connectivity

JDBC (Java DataBase Connectivity) fournit une API standardisée pour accéder aux bases de données conformes au standard SQL-92, permettant une abstraction des SGBD et un accès homogène. Il permet aux applications Java de se connecter à divers SGBD via des drivers, gérant les connexions, l'exécution de requêtes SQL et le traitement des résultats. Les classes et interfaces de JDBC facilitent la création et l'exécution de requêtes, ainsi que la gestion des résultats à travers des objets comme Connection, Statement et ResultSet.

Transféré par

sbet2049
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 20

JDBC

Java DataBase Connectivity

© Philippe GENOUD UJF Février 2004 1

JDBC Introduction

l Offre une API unique d’accès à toute BD conforme au


standard SQL-92
l Objectifs :
l Fournir un accès homogène aux SGBD
l une application Java est capable d’accéder de façon
générique à un SGBD quel que soit son fournisseur
l Abstraction des SGBD cibles
l Requêtes SQL
l Simple à mettre en oeuvre
l JDBC 1.0 Core API (JDK 1.1) : package java.sql
l JDBC 2.0 (Java 2)

© Philippe GENOUD UJF Février 2004 2

1
JDBC Architectures
Architectures Client/Serveur
Client/Serveur
l Client/Serveur : un programme client s ’adresse à un programme sur une
machine distante (le serveur) pour échanger des informations et des
services

SGBD réseau

Client
Interface Serveur SGBD

Interface client SGBD

Serveur de programme
données

• Programme client ne communique pas directement avec SGBD


• Sur le poste client : interface client du SGBD qui gère le protocole de communication
spécifique au SGBD
• Sur le poste serveur : interface serveur du SGBD qui gère les connexions avec les différents
clients.
© Philippe GENOUD UJF Février 2004 3

JDBC Architecture d’une


application JDBC
l JDBC permet de développer des programmes Java clients (applications
autonomes, applets composants dans applications N-tiers) qui accèdent à
des SGBD
• Package java.sql : implémentation
de la spécification JDBC fournie en
standard avec le JDK
• DriverManager : classe java à laquelle
s’adressent les autres objets de Application Java Machine
l ’application cliente Virtuelle

• JDBC interagit avec le SGBD par JDBC (java.sql) DriverManager


un driver
• Il existe des drivers pour Oracle, Driver JDBC Driver JDBC
Sybase, Informix, DB2, … fournisseur 1 fournisseur 2
• JDBC spécifie uniquement
l ’architecture que ces drivers doivent
respecter. Ils sont réalisés par une tierce
partie (fournisseur du SGBD, «éditeur de
logiciel…) SGBD SGBD
• l’implémenation des drivers est
fournisseur 1 fournisseur 2
totalement libre

© Philippe GENOUD UJF Février 2004 4

2
JDBC Services
Services JDBC
JDBC

l Gestion des drivers


l chargement, sélection
l Ouverture de connexions à une base de données
l SQL dynamique et SQL statique
l exécution de requêtes (SQL-92)
l Exploitation des résultats
l correspondance types SQL-types JAVA
l Accès au méta-modèle
l informations sur les possibilités du driver
l description des objets du SGBD

© Philippe GENOUD UJF Février 2004 5

JDBC Classes
Classes et
et interfaces
interfaces de
de JDBC
JDBC
classes Java.lang.Object

Java.util.Date DriverManager DriverPropertyInfo Types Throwable

Date Time TimeStamp Exception

SQLException
Charge et configure le
driver client du SGBD
BatchUpdateException SQLWarning

DataTruncation

Requètes SQL
interfaces

Driver Connection Statement ResultSet ResultSetMetaData DatabaseMetaData

PreparedStatement
Connexion et
authentification Résultats des
CallableStatement
auprès du SGBD requètes

© Philippe GENOUD UJF Février 2004 6

3
JDBC Classes
Classes et
et interfaces
interfaces de
de JDBC
JDBC
Requètes SQL
interfaces
Driver Oracle 8i
Driver Connection Statement ResultSet ResultSetMetaData DatabaseMetaData

PreparedStatement
Connexion et
authentification Résultats des
auprès du SGBD CallableStatement
requètes

Les interfaces définissent une


abstraction du pilote (driver) de la
base de données. Driver MySql
Chaque fournisseur propose sa
propre implémentation de ces
interfaces.

Les classes d’implémentation du


driver jdbc sont dans une archive
(fichier jar ou zip) qu’il faut intégrer
(sans le décompresser) au niveau du
classpath de l’application au moment
de l’exécution

Au niveau du programme
d’application on ne travaille qu’avec
les abstractions (interfaces) sans ce
soucier des classes effectives
d’implémentation

© Philippe GENOUD UJF Février 2004 7

JDBC Classes
Classes et
et interfaces
interfaces de
de JDBC
JDBC
l Objets instanciés à partir des types Java définis dans java.sql

DriverManager
DriverManager permet de créer
des objets Connection

Connection Connection Connection

Un objet Connection permet de créer


des objets encapsulant des requêtes SQL

Statement PreparedStatement CallableStatement

Les objets encapsulant les requêtes


SQL permettent de créer des objets
ResultSet encapsulant le résultat
d’une requête
ResultSet ResultSet ResultSet

© Philippe GENOUD UJF Février 2004 8

4
JDBC 1) Chargement du driver
l Avant de pouvoir être utilisé, le driver doit être enregistré auprès du
DriverManager de jdbc.
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

l Mais si on regarde mieux la doc de JDBC...

When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager.

l Il est donc préférable d’exploiter les possibilités de chargement dynamique de


classes de JAVA
l Utiliser la méthode forName de la classe Class avec en paramètre le nom
complet de la classe du driver.
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch (ClassNotFoundException e) {
...
}

l Permet de paramètrer le driver sans modifier l’application (par exemple


nom du driver stocké dans un fichier de configuration (properties file))
© Philippe GENOUD UJF Février 2004 9

JDBC 2) Connexion à la base


l Ouverture de la connexion :
Connection conn = DriverManager.getConnection(url,
user, password);
l Identification de la BD via un URL (Uniform Ressource Locator)
de la forme générale
jdbc:driver: base
l'utilisation le driver ou le type identification
de JDBC du SGBDR de la base

La forme exacte dépend de la BD, chaque BD nécessitant des informations spécifiques


pour établir la connexion. Par exemple pour le driver Oracle JDBC-Thin :
jdbc:oracle:thin:@ serveur:port :base
nom IP du numéro de port nom de la
serveur socket à utiliser base
l Exemple :

Connection conn = DriverManager.getConnection(


"jdbc:oracle:thin:@hoff.imag.fr:1521:ufrima",
user, password);
© Philippe GENOUD UJF Février 2004 10

5
JDBC Connexions
Connexions
l Quand getConnection est invoquée le DriverManager interroge chaque driver
enregistré, si un driver reconnaît l’url il crée et retourne un objet Connection.
l Une application peut maintenir des connexions multiples
l le nombre limite de connexions est fixé par le SGBD lui même (de quelques
dizaines à des milliers).
l Quand une Connection n ’a plus d’utilité prendre soin de la fermer explicitement.

l Libération de mémoire et surtout des ressources de la base de données


détenues par la connexion
Connection con=null;

try {
con = DriverManager.getConnexion("jdbc:odbc:companydb","", "");
...
}
catch (SQLException e) {
...
}
finally {
try {
con.close();
} catch (SQLEXception e) {
e.printStackTrace();
}
}
© Philippe GENOUD UJF Février 2004 11

JDBC 3) Préparer/exécuter une requête

l Une fois une Connection créée on peut l’utiliser pour créer et exécuter
des requêtes (statements) SQL.
l 3 types de statement :
l Statement : requêtes simples (SQL statique)
l PreparedStatement : requêtes précompilées (SQL dynamique si
supporté par SGBD) qui peuvent améliorer les performances
l CallableStatement : encapsule procédures SQL stockées dans le
SGBD
l 3 types d'exécutions :
l executeQuery : pour les requêtes qui retournent un résultat (SELECT )
l résultat accessible au travers d ’un objet ResultSet

l executeUpdate : pour les requêtes qui ne retournent pas de résultat


(INSERT, UPDATE, DELETE, CREATE TABLE et DROP TABLE )
l execute : pour quelques cas rares (quand on ne sait pas si la requête
retourne ou non un résultat, procédures stockées)
© Philippe GENOUD UJF Février 2004 12

6
JDBC Préparer / exécuter une
requête simple

l Création d'un statement :


Statement stmt = conn.createStatement();

l 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 rs = stmt.executeQuery(myQuery);

l executeQuery() renvoit un objet de type ResultSet


l permet de décrire la table des résultats

© Philippe GENOUD UJF Février 2004 13

JDBC Lecture des résultats

l executeQuery() renvoie un objet de classe ResultSet


l permet de décrire la table des résultats
java.sql.Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT nom, code_client FROM Clients");

Nom Prénom Code_client Adresse Nom Code_client


DUPONT Jean 12345 135 rue du Lac DUPONT 12345
DUROND Louise 12545 13 avenue de la Mer DUROND 12545
... ...
... ...
ZORG Albert 45677 8 Blvd De la Montagne ZORG 45677

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


l boolean next() permet d’avancer à la ligne suivante, à false si pas de
ligne suivante
l Placé avant la première ligne à la création du ResultSet

while (rs.next())
{
... Exploiter les données
}

© Philippe GENOUD UJF Février 2004 14

7
JDBC Lecture des résultats

l Les colonnes sont référencées par leur numéro ou par leur nom
l L'accès aux valeurs des colonnes se fait par des méthodes getXXX(String nomCol)
ou getXXX(int numCol) où XXX représente le type de l'objet
l Pour les très gros row, on peut utiliser des streams.

java.sql.Statement stmt = conn.createStatement();


ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next())
Attention ! En SQL les
{ numéros de colonnes
int i = rs.getInt("a"); // rs.getInt(1); débutent à 1
String s = rs.getString("b"); // rs.getString(2);
byte b[] = rs.getBytes("c"); // rs.getBytes(3);
System.out.println("ROW = " + i + " " + s + " " + b[0]);
}

© Philippe GENOUD UJF Février 2004 15

Equivalences
Equivalences des
des
JDBC types Java-SQL
types Java-SQL

l Pour chaque méthode getXXX le driver JDBC doit effectuer une conversion
entre le type de données de la base de données et le type Java correspondant
Type SQL Méthode Type Java
CHAR getString String Peut être appelée sur
n’importe quel type de valeur
VARCHAR getString String
NUMERIC getBigDecimal java.Math.BigDecimal
DECIMAL getBigDecimal java.Math.getBigDecimal
getObject peut retourner
BIT getBoolean boolean Boolean
n’importe quel type de donnée
TINYINT getByte byte Integer « packagé » dans un objet java
SMALLINT getShort short Integer (object wrapper)
INTEGER getInt int Integer
BIGINT getLong long Long
REAL getFloat float Float
FLOAT getDouble double Double Si une conversion de données
invalide est effectuée (par ex
DOUBLE getDouble double Double DATE -> int), une SQLException
DATE getDate java.sql.Date est lancée
TIME getTime java.sql.Time
getObject
TIME STAMP getTimestamp java.sql.Timestamp

© Philippe GENOUD UJF Février 2004 16

8
JDBC Préparer/exécuter une
requête simple

l Un objet Statement représente une simple (seule) requête SQL.


l Un appel à executeQuery() , executeUpdate() ou execute() ferme
implicitement tout ResultSet actif associé avec l ’objet Statement.
l Avant d ’exécuter une autre requête avec un objet Statement il faut être
sûr d’avoir exploité les résultats de la requête précédente.

Statement stmt = conn.createStatement(); Statement stmt = conn.createStatement();

ResultSet rs1 = stmt.executeQuery(myQuery1); ResultSet rs1 = stmt.executeQuery(myQuery1);


ResultSet rs2 = stmt.executeQuery(myQuery2); //exploitation des résultats de myQuery1
while (rs1.next() {
//exploitation des résultats de myQuery1 ...
while (rs1.next() { }
...
} ResultSet rs2 = stmt.executeQuery(myQuery2);
//exploitation des résultats de myQuery2 //exploitation des résultats de myQuery2
while (rs2.next() { while (rs2.next() {
... ...
} }

l Si application nécessite d’effectuer plus d’une requête simultanément,


nécessaire de créer et utiliser autant d ’objets Statement.
© Philippe GENOUD UJF Février 2004 17

JDBC Préparer/exécuter une


requête précompilée
l Création d'un preparedStatement (requête SQL dynamique):
l paramètres formels spécifiés à l ’aide de ?

PreparedStatement ps = conn.prepareStatement( Dès que l ’objet est instancié, la


"SELECT * FROM ? WHERE NAME = ? " procédure SQL est transmise au
); SGBD qui la compile

l Passage des paramètres effectifs


l à l ’aide de méthodes au format setXXX(indice,valeur) où XXX
représente le type du paramètre

ps.setString(1, "Person" );

l Invocation et exploitation des résultats


l phase identique à celle utilisée pour SQL statique

for (int i=0; i < names.length; i++) {


ps.setString(2, names[i]) ;
ResultSet rs = ps.executeQuery();
// ... Exploitation des résultats
}

© Philippe GENOUD UJF Février 2004 18

9
JDBC Procédures
Procédures stockées
stockées

l La plupart des SGBD incluent un langage de programmation interne (ex:


PL/SQL d ’Oracle) permettant aux développeurs d’inclure du code procédural
dans la BD, code pouvant être ensuite invoqué depuis d’autres applications.
l le code est écrit une seule fois est peut être utilisé par différentes
applications.
l permet de séparer le code des applications de la structure interne des
tables. (cas idéal : en cas de modification de la structure des tables seul les
procédures stockées ont besoin d’être modifiées)

l Utilisation des procédure stockées depuis JDBC indépendante de la manière


dont celles-ci sont gérées par le SGBD
l Utilisation possible de la valeur de retour

l Gestion des paramètres IN, OUT, INOUT

© Philippe GENOUD UJF Février 2004 19

JDBC Procédures
Procédures stockées
stockées
l Préparation de l ’appel
Appel avec valeur de retour et paramètres
CallableStatement proc = conn.callableStatement(
"{? = call maProcedure(?,?)}");
Appel sans valeur de retour et avec paramètres
CallableStatement proc = conn. callableStatement(
"{call maProcedure(?,?)}");
l Préparation des paramètres
proc.registerOUTParameter(2,Types.DECIMAL,3);
2ème paramètre de type OUT Nombre de chiffres après décimale

l Passage des paramètres IN


proc.setByte(1,25);
1er paramètre (type IN) valeur

l Appel
ResultSet rs = proc.executeQuery();
l Exploitation du ResultSet (idem que pour Statement et PreparedStatement)
l Récupération des paramètres OUT
java.Math.BigDecimal bigd = proc.getBigDecimal(2,3);

© Philippe GENOUD UJF Février 2004 20

10
JDBC Accès aux méta-données

l Permet de découvrir dynamiquement (au moment de l’exécution) des propriétés


concernant la base de données ou les résultats de requêtes
l Exemple : lors de l’exécution d’une requête non connue à l’avance.

Renvoie String contenant une


executeUpdate
true si requête de??
type Query requête quelconque
executeQuery
false ??
sinon (Update)
Accès au ResultSet
produit par la requête
if (stmt.execute(cmd))
stmt.execute(cmd)
cmd {
ResultSet rs = stmt.getResultSet();
...
//Exploitation du ResultSet Besoin d’accès aux méta-
... données du ResultSet
rs.close();
}
else
System.out.println("nombre de lignes modifiées " + stmt.getUpdateCount() );
}

© Philippe GENOUD UJF Février 2004 21

JDBC Accès aux méta-données

l Permet de découvrir dynamiquement (au moment de l’exécution) des propriétés


concernant la base de données ou les résultats de requêtes
l La méthode getMetaData() de la classe Connection permet d'obtenir les
méta-données concernant la base de donnée.
l Elle renvoie un DataBaseSetMetaData.

l On peut connaître :

l les éléments SQL supportés par la base

l la structure des données de celle-ci


l La méthode getMetaData() de la classe ResultSet permet d'obtenir les
méta-données d'un ResultSet.
l Elle renvoie un ResultSetMetaData.

l On peut connaître :
l Le nombre de colonnes : getColumnCount()

l Le nom d'une colonne : getColumnName(int col)


l Le type d'une colonne : getColumnType(int col)

l …

© Philippe GENOUD UJF Février 2004 22

11
JDBC Gestion
Gestion des
des transactions
transactions

l L ’interface Connection offre des services de gestion des transactions


l setAutoCommit(boolean autoCommit)définit le mode de la
connexion (auto-commit par défaut)
l commit()déclenche validation de la transaction

l rollback()annule la transaction

try {
con.setAutoCommit(false);
// exécuter les instructions qui constituent la transaction
stmt.executeUpdate("UPDATE INVENTORY SET ONHAND = 10 WHERE ID = 5");
stmt.executeUpdate("INSERT INTO SHIPPING (QTY) VALUES (5)");
...
// valide la transaction
con.commit()
}
catch (SQLException e) {
con.rollback(); // annulle les opérations de la transaction
}

© Philippe GENOUD UJF Février 2004 23

JDBC A
A propos
propos de
de SQLException
SQLException

l SQLException définit les méthodes suivantes :


l getSQLState() : --> un code d’état de la norme SQL ANSI-92
l getErrorCode() : --> un code d ’erreur specifique (« vendor-spécific »)
l getNextException() : --> permet aux classes du JDBC de chaîner une
suite de SQLExceptions
// du code très consciencieux
try {

...
}
catch (SQLException e) {
while (e != null) {
System.out.println("SQL Exception");
System.out.println(e.getMessage());
System.out.println("ANSI-92 SQL State : "+e.getSQLState());
System.out.println("Vendor error code : "+e.getErrorCode());
e = e.getNextException();
}

© Philippe GENOUD UJF Février 2004 24

12
JDBC SQLWarning
SQLWarning
l Les classes du JDBC ont la possibilité de générer sans les lancer des exceptions
quand un problème est intervenu mais qu’il n’est pas suffisamment grave pour
interrompre le programme
l Exemple : fixer une mode de transaction qui n’est pas supporté la base de
données cible (un mode par défaut sera utilisé)
l SQLWarning encapsule même information que SQLException

l Pour les récupérer pas de bloc try catch mais à l’aide de méthode
getWarnings des interfaces Connection, Statement, ResultSet,
PreparedSatement, CallableStatement
void printWarninsg(SQLWarning warn) {
while (warn != null) {
System.out.println("\nSQL Warning");
System.out.println(warn.getMessage());
System.out.println("ANSI-92 SQL State : "+warn.getSQLState());
System.out.println("Vendor error code : "+warn.getErrorCode());
warn = warn.getNextException();
}
} ...
ResultSet rs = stmt.executeQuery("SELECT * FROM CLIENTS");
printWarnings( stmt.getWarnings() );
printWarnings( rs.getWarnings() );
...

© Philippe GENOUD UJF Février 2004 25

JDBC Api
Api JDBC
JDBC 2.0
2.0

l JDBC 1.0
l package supplémentaire (add-on) pour JDK 1.0
l intégré l’API de base (core API) du JDK 1.1
l JDBC 2.0

l spécification par SUN en mai 1998


lextensions pour « meilleure » gestion des résultats (ResultSets
« scrollables », «modifiables »)
lsupport pour BLOBs (Binary Large Objects) et CLOBs (Character Large
Objects)
l…

l intégré à l ’API de Java 2 (JDK 1.2)


l compatibilité avec la version 1.0
l code écrit pour JDBC 1.0 compile et fonctionne avec version 2.0 de l ’API

© Philippe GENOUD UJF Février 2004 26

13
JDBC ResultSet
ResultSet JDBC
JDBC 2.0
2.0

l Par défaut lorsque l’on crée un Statement les objets ResultSet sont en lecture
seule (read only) et à accès séquentiel (forward only)
public Statement createStatement() throws SQLException

Statement stmt = conn.createStatement();

l Avec JDBC 2.0 possibilité de créer des ResultSet


l « Scrollable »

l plus de limitation à un parcours séquentiel

l « Updateable »

l possibilité de modifier les données dans la BD

public Statement createStatement(int resultSetType, int resultSetConcurrency)

ResultSet.TYPE_FORWARD_ONLY ResultSet.CONCUR_READ_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.CONCUR_UPDATABLE
ResultSet.TYPE_SCROLL_SENSITIVE

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE ,


ResultSet.CONCUR_UPDATABLE);

© Philippe GENOUD UJF Février 2004 27

JDBC ResultSet
ResultSet JDBC
JDBC 2.0
2.0
l 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 suivante

previous() Passe à la ligne précédante

beforeFirst() Positionne avant la première ligne

afterLast() Positionne après la dernière ligne

absolute(int) Positionne à une ligne donnée

relative(int) Déplacement d’un nombre de lignes donné par rapport à ligne courante

l Méthodes de test de la position du curseur


boolean isFirst() True si curseur positionné sur la première ligne

boolean isBeforeFirst() True si curseur positionné avant la première ligne

boolean isLast() True si curseur positionné sur la dernière ligne

boolean isAfterLast() True si curseur positionné après la dernière ligne

© Philippe GENOUD UJF Février 2004 28

14
JDBC ResultSet
ResultSet JDBC
JDBC 2.0
2.0

l Modification du ResultSet
l Se placer sur le rang concerné
l Méthodes updateXXX(…)

l Puis updateRow()

l le faire avant de déplacer le curseur sur une autre ligne

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,


ResultSet.TYPE_CONCUR_UPDATEABLE);
ResultSet rs = stmt.executeQuery("SELECT NOM,ID_CLIENT FROM CLIENTS);
rs.first();
rs.updateInt(2,151970);
rs.updateRow();

© Philippe GENOUD UJF Février 2004 29

JDBC ResultSet
ResultSet JDBC
JDBC 2.0
2.0
l Insertion d’une ligne
l moveToInsertRow()

l Méthodes Méthodes updateXXX(…)

l Puis insertRow()

ResultSet rs = stmt.executeQuery("SELECT NOM,ID_CLIENT FROM CLIENTS);


rs.moveToInsertRow();
rs.updateString(1,"Jacques OUILLE");
rs.updateInt(2,151970);
rs.updateRow();
l Si aucune valeur n’est spécifiée pour une colonne n’acceptant pas la
valeur nul, une SQLException est lancée.
l moveToCurrentRow() permet de se repositionner sur la ligne
courante avant l’appel à moveToInsertRow()
l Suppression d’une ligne
l Se placer sur la ligne
l deleteRow()

rs.last();
rs.deleteRow();

© Philippe GENOUD UJF Février 2004 30

15
JDBC ResultSet
ResultSet JDBC
JDBC 2.0
2.0

l Tous les ResultSet ne sont pas nécessairement modifiables


l En général la requête ne doit référencer qu’une seule table sans jointure

l Tous les drivers JDBC ne supportent pas nécessairement et entièrement les


ResultSet « scrollable » et « updateable »
l l’objet DataBaseMetaData fournit de l’information quant au support
proposé pour les ResultSet
l Il faut être prudent si le logiciel que l’on écrit doit interagir avec une
grande variété de drivers JDBC

© Philippe GENOUD UJF Février 2004 31

JDBC javax.sql
javax.sql

l javax.sql package d’extension standard de JDBC


l Pour les applications J2EE (Java 2 Entreprise Edition)
l Inclus en standard dans J2SE (Java 2 Standard Edition) depuis version 1.4

l DataSource : Obtention du nom de la base à partir de serveurs de noms


plutôt que d’avoir le nom de la base de données codé « en dur » dans
l’application.
l Utilisation de JNDI (Java Naming and Directory Interface) pour connexion
à une base de donnée
l PooledConnection : support pour gestion d’un « pool » de connexion
l gestion d’un cache des connexion ouvertes
l évite la création de nouvelles connexions (ce qui est coûteux)
l RowSet : permet de traiter les résultats des requêtes comme des
composants JavaBeans
l Support pour les transactions distribuées

© Philippe GENOUD UJF Février 2004 32

16
JDBC Pour conclure :

Un exemple « complet »
import java.sql.*;
public class TestJDBC {
public static void main(String[] args) throws Exception {
Class.forName("postgres95.pgDriver");

Connection conn = DriverManager.getConnection("jdbc:pg95:mabase",


"dedieu", "");
Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * from employe");


while (rs.next()) {
String nom = rs.getString("nom");
String prenom = rs.getString("prenom");
String email = rs.getString("email");
}

rs.close();
stmt.close();
conn.close();
}
}
© Philippe GENOUD UJF Février 2004 33

JDBC bibliographie
bibliographie
l Java Entreprise in a Nutshell, David Flannagan, Jim Farley, William
Cawford et Kris Magnusson, Ed. O ’Reilly , 1999
l Database programming with JDBC and Java, George Reese, Ed. O ’Reilly,
1998
l Tutoriaux en ligne

l JDBCshort course
http://developer.java.sun.com/developer/onlineTraining/Database/
JDBCShortCourse/index.html

l Applications : JDBCTest permet de tester via une interface graphique les


différentes fonctionnalités proposées par le JDBC et de voir le code Java
correspondant.
(http://developer.java.sun.com/developer/onlineTraining/Database/
JDBCShortCourse/jdbc/exercises/JDBCTestConnect/index.html)
Home: jdbcmanager.sourceforge.net

JDBC Explorer is an open source front-end for Data Base Management Systems that supports visualization and editing (if
the corresponding JDBC driver supports ResultSets). Any JDBC database is supported, in the screenshots below you
can see the app in action browsing MySQL, MS SQL Server 2000, SAP DB - Ver.7.3.

Home: qform.sourceforge.net

QueryForm is a GPL'd open source GUI database front-end that, in the words of developer Dave
Glasser (email: [email protected]), "uses table metadata to build forms on-the-fly through which
you can enter queries, browse results, and add, update or delete rows".
© Philippe GENOUD UJF Février 2004 34

17
JDBC Drivers
Drivers JDBC
JDBC
l 4 catégories de drivers JDBC
l type 1 : Pont JDBC-ODBC (Open Data Base Connectivity)

ODBC Application Java


• interface d’accès (C) aux SGBD définie par
Microsoft JDBC (java.sql) DriverManager
• standard de fait, très grand nombre de SGBD
accessibles Driver type 1 (JDBC/ODBC Bridge)
Driver manager ODBC
impose chargement dans la mémoire vive de la
Driver ODBC
plateforme d’exécution de librairies dynamiques
Interface client SGBD

code binaire ODBC sur le client


• alourdit processus d ’installation et de maintenance Interface serveur
• problème de sécurité pour les applets SGBD
• applets « untrusted » n’ont pas l ’autorisation de charger
en mémoire du code natif

© Philippe GENOUD UJF Février 2004 35

JDBC Drivers
Drivers JDBC
JDBC

l Type 2 : API native

Application Java

JDBC (java.sql) DriverManager


interface d’accès entre le driver manager
JDBC et l ’interface cliente du SGBD Driver type 2
impose chargement dans la mémoire vive de la Interface client SGBD
plateforme d’exécution de librairies dynamiques
(code binaire de l ’interface client spécifique au SGBD
par exemple librairies OCI, Oracle Call Interface, conçues
initialement pour programmeurs C/C++ )

Interface serveur
SGBD
Driver dédié à un SGBD particulier
• moins ouvert que pont JDBC/ODBC
• potentiellement plus performant (moins de couches logicielles)
mêmes problèmes qu’avec pont JDBC-ODBC
• code natif sur plateforme d ’exécution

© Philippe GENOUD UJF Février 2004 36

18
JDBC Drivers
Drivers JDBC
JDBC

l Type 3 : JDBC-Net Application Java

JDBC (java.sql) DriverManager


traduit appels JDBC suivant un protocole réseau
à vocation universelle indépendant des Driver type 3
fournisseurs de SGBD (Sql*net, NET8)

Interface serveur middleware


requêtes réseau doivent être ensuite traduites par
un serveur dédié aux requêtes spécifiques à un Interface client SGBD
SGBD (par exemple WebLogic de BEA)
middleware
drivers 100% Java
peuvent être utilisés depuis une applet (les drivers ne sont plus Interface serveur
du code natif et peuvent être chargés comme n’importe quel
SGBD
composant Java)

si l ’application est une applet, le modèle classique de


sécurité peut poser des problème de connexion réseau
• une applet « untrusted » ne peut ouvrir une connexion qu’avec la
machine sur laquelle elle est hébergée
• il suffit d ’installer le serveur Web et le serveur middleware sur la
même plateforme. Possibilité d ’accéder alors à un SGBD situé
n ’importe où sur le réseau.

© Philippe GENOUD UJF Février 2004 37

JDBC Drivers
Drivers JDBC
JDBC

l Type 4 : Thin (protocole natif)

le driver interagit directement avec le


gestionnaire du SGBD Application Java
utilise directement protocole réseau du SGBD
(spécifique à un fournisseur de SGBD) JDBC (java.sql) DriverManager
Driver type 4

Driver 100% Java (connexion via sockets Java) Interface serveur


Solution la plus la plus élégante et la plus souple SGBD

si l ’application est une applet, le modèle


classique de sécurité des applets impose que le
SGBD soit hébergé sur le serveur Web

Durant le projet le driver utilisé pour accéder à Oracle


sera de ce type

© Philippe GENOUD UJF Février 2004 38

19
JDBC Drivers
Drivers JDBC
JDBC

l Liste des drivers disponibles à :


http://java.sun.com/products/jdbc/jdbc.drivers.html

l sélection d’un driver :


l choix entre vitesse, fiabilité et portabilité.

l Programme « standalone », avec une interface graphique qui


s’exécute toujours sur un système Windows NT peut tirer bénéfice
de performances d’un driver type 2 (driver code-natif).
l Une applet peut nécessiter un driver de type 3 (pour passer un
firewall).
l Une servlet déployée sur de multiples plateformes peut nécessiter la
souplesse offerte par des drivers de type 4.
l ...

© Philippe GENOUD UJF Février 2004 39

20

Vous aimerez peut-être aussi