Vous êtes sur la page 1sur 24

JDBC

Java DataBase Connectivity

Philippe GENOUD

UJF

06/01/2010

JDBC
JDBC Java Data Base Connectivity

Introduction

API java standard qui permet un accs homogne des bases de donnes depuis un programme Java au travers du langage SQL.
Programme Java API JDBC
Machine Virtuelle Java

Serveur Oracle

Serveur PostgreSQL MySQL

L'API JDBC est indpendante des SGBD.


Un changement de SGBD ne doit pas impacter le code applicatif.

Philippe GENOUD

UJF

06/01/2010

JDBC

interfaces de l'API JDBC

L'API JDBC dfinit un ensemble d'interfaces (package java.sql) qui dfinissent un protocole de communication entre le programme java client et le serveur de base de donnes pour ouverture/fermeture de connexions une base de donnes excution de requtes SQL exploitation des rsultats
correspondance types SQL-types JAVA

accs au mta-modle
description des objets du SGBD
Requtes SQL Driver Connection Statement ResultSet principales interfaces de java.sql

ResultSetMetaData

DatabaseMetaData

PreparedStatement Connexion et authentification auprs du SGBD CallableStatement Rsultats des requtes


UJF 06/01/2010

Philippe GENOUD

JDBC

Pilotes JDBC

Le code applicatif est bas sur les interfaces du JDBC


Pour accder un SGBD il est ncessaire de diposer de classes implmentant ces interfaces. Elles dpendent du SGBD adress. L'ensemble de ces classes pour un SGBD donn est appel pilote (driver) JDBC

Programme Java API JDBC Programme Java


Serveur API Oracle

Il existe des pilotes pour tous les SGBD importants du march (Oracle, MySQL, PostgreSQL, DB2, ) JDBC spcifie uniquement lAPI que ces pilotes doivent respecter. Ils sont raliss par une tierce partie (fournisseur du SGBD, diteur de logiciel) limplmentation des drivers est totalement libre

JDBC PostgreSQL

Serveur

Serveur Oracle

Serveur PostgreSQL MySQL

Philippe GENOUD

UJF

06/01/2010

JDBC
Requtes SQL interfaces Driver Connection Statement ResultSet ResultSetMetaData DatabaseMetaData PreparedStatement Connexion et authentification auprs du SGBD Rsultats des requtes

Pilotes JDBC Pilotes JDBC


Driver Oracle 8i

CallableStatement

Les interfaces dfinissent une abstraction du pilote (driver) de la base de donnes. Chaque fournisseur propose sa propre implmentation de ces interfaces. Les classes dimplmentation du driver jdbc sont dans une archive (fichier jar ou zip) quil faut intgrer (sans la dcompresser) au niveau du classpath de lapplication au moment de lexcution Au niveau du programme dapplication on ne travaille quavec les abstractions (interfaces) sans ce soucier des classes effectives dimplmentation
Philippe GENOUD UJF

Driver MySql

06/01/2010

JDBC
il existe 4 types de pilotes JDBC type 1 : pont JDBC ODBC

Drivers JDBC Drivers JDBC

type 2 : pilote qui fait appel des fonctions natives (code non Java, le plus souvent en C ou C++) de l'API du SGBD type 3 : pilote qui permet l'utilisation d'un serveur middleware type 4 : pilote entiement en Java qui utilise directement le protocole rseau du SGBD

Philippe GENOUD

UJF

06/01/2010

JDBC

Drivers JDBC Drivers JDBC

Liste des drivers disponibles : http://java.sun.com/products/jdbc/jdbc.drivers.html slection dun driver : choix entre vitesse, fiabilit et portabilit. Programme standalone , avec une interface graphique qui sexcute toujours sur un systme Windows peut tirer bnfice de performances dun driver type 2 (driver code-natif). Une applet peut ncessiter un driver de type 3 (pour passer un firewall). Une servlet dploye sur de multiples plateformes peut ncessiter la souplesse offerte par des drivers de type 4. ...

Philippe GENOUD

UJF

06/01/2010

JDBC

Drivers JDBC Drivers JDBC

4 catgories de drivers JDBC type 1 : Pont JDBC-ODBC (Open Data Base Connectivity)
ODBC interface daccs (C) aux SGBD dfinie par Microsoft standard de fait, trs grand nombre de SGBD accessibles impose chargement dans la mmoire vive de la plateforme dexcution de librairies dynamiques Application Java JDBC (java.sql) DriverManager Driver type 1 (JDBC/ODBC Bridge) Driver manager ODBC Driver ODBC Interface client SGBD

code binaire ODBC sur le client


alourdit processus d installation et de maintenance problme de scurit pour les applets applets untrusted nont pas l autorisation de charger en mmoire du code natif

Interface serveur SGBD

Philippe GENOUD

UJF

06/01/2010

JDBC
Type 2 : API native

Drivers JDBC Drivers JDBC

Application Java interface daccs entre le driver manager JDBC et l interface cliente du SGBD impose chargement dans la mmoire vive de la plateforme dexcution de librairies dynamiques
(code binaire de l interface client spcifique au SGBD par exemple librairies OCI, Oracle Call Interface, conues initialement pour programmeurs C/C++ )

JDBC (java.sql) DriverManager Driver type 2 Interface client SGBD

Driver ddi un SGBD particulier


moins ouvert que pont JDBC/ODBC potentiellement plus performant (moins de couches logicielles)

Interface serveur SGBD

mmes problmes quavec pont JDBC-ODBC


code natif sur plateforme d excution

Philippe GENOUD

UJF

06/01/2010

JDBC
Type 3 : JDBC-Net
traduit appels JDBC suivant un protocole rseau vocation universelle indpendant des fournisseurs de SGBD (Sql*net, NET8)

Drivers JDBC Drivers JDBC


Application Java JDBC (java.sql) DriverManager Driver type 3

requtes rseau doivent tre ensuite traduites par un serveur ddi aux requtes spcifiques un SGBD (par exemple WebLogic de BEA) drivers 100% Java
peuvent tre utiliss depuis une applet (les drivers ne sont plus du code natif et peuvent tre chargs comme nimporte quel composant Java)

Interface serveur middleware Interface client SGBD middleware Interface serveur SGBD

si l application est une applet, le modle classique de scurit peut poser des problme de connexion rseau
une applet untrusted ne peut ouvrir une connexion quavec la machine sur laquelle elle est hberge il suffit d installer le serveur Web et le serveur middleware sur la mme plateforme. Possibilit d accder alors un SGBD situ n importe o sur le rseau.

Philippe GENOUD

UJF

06/01/2010

10

JDBC
Type 4 : Thin (protocole natif)

Drivers JDBC Drivers JDBC

le driver interagit directement avec le gestionnaire du SGBD


utilise directement protocole rseau du SGBD (spcifique un fournisseur de SGBD)

Application Java JDBC (java.sql) DriverManager Driver type 4

Driver 100% Java (connexion via sockets Java) Solution la plus la plus lgante et la plus souple

Interface serveur SGBD

si l application est une applet, le modle classique de scurit des applets impose que le SGBD soit hberg sur le serveur Web Durant le projet le driver utilis pour accder Oracle sera de ce type
Philippe GENOUD UJF 06/01/2010

11

JDBC

versions de JDBC

Diffrentes versions JDBC 1.0 Core API (JDK 1.1) : package java.sql supporte le standard SQL-2 entry level JDBC 2.0 (Java 2 JDK 1.2) : packages java.sql javax.sql support de certaines fonctionnalit de SQL-3 JDBC 3.0 (JDK 1.4) : packages java.sql javax.sql javax.sql.rowset support d'autres fonctionnalits de SQL-3 nouveau support pour la gestion des ResultSet JDBC 4.0 (JDK 1.6) facilit d'criture au travers d'annotations

Philippe GENOUD

UJF

06/01/2010

12

JDBC

Classes et interfaces de JDBC Classes et interfaces de JDBC


Requtes SQL

principales interfaces de java.sql

Driver

Connection

Statement

ResultSet

ResultSetMetaData

DatabaseMetaData

PreparedStatement Connexion et authentification auprs du SGBD CallableStatement Rsultats des requtes

principales classes de java.sql


Java.util.Date Date Time DriverManager

Java.lang.Object

DriverPropertyInfo

Types

Throwable Exception SQLException

TimeStamp Charge et configure le driver client du SGBD

BatchUpdateException

SQLWarning DataTruncation

Philippe GENOUD

UJF

06/01/2010

13

JDBC
Machine Virtuelle Java

Driver Manager

DriverManager : classe java laquelle sadresse le code de lapplication cliente.


Application Java
API JDBC java.sql

DriverManager Driver JDBC fournisseur 1 Driver JDBC fournisseur 2

Le driver manager permet de charger et configurer les pilotes JDBC ncessaires l'application

SGBD fournisseur 1

SGBD fournisseur 2

Philippe GENOUD

UJF

06/01/2010

14

JDBC

Classes et interfaces de JDBC Classes et interfaces de JDBC

Objets instancis partir des types Java dfinis dans java.sql


DriverManager DriverManager permet de crer des objets Connection

Connection Un objet Connection permet de crer des objets encapsulant des requtes SQL Statement Les objets encapsulant les requtes SQL permettent de crer des objets ResultSet encapsulant le rsultat dune requte ResultSet

Connection

Connection

PreparedStatement

CallableStatement

ResultSet

ResultSet

Philippe GENOUD

UJF

06/01/2010

15

JDBC

1) Chargement du driver

Avant de pouvoir tre utilis, le driver doit tre enregistr auprs du DriverManager de jdbc.
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());

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.

Il est donc prfrable dexploiter les possibilits de chargement dynamique de classes de JAVA Utiliser la mthode forName de la classe Class avec en paramtre le nom complet de la classe du driver. Chargement d'un pilote OBDC
try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Class.forName("oracle.jdbc.OracleDriver"); .newInstance(); } Chargement d'un pilote Oracle catch (ClassNotFoundException e) { ... }

Permet de paramtrer le driver sans modifier lapplication (par exemple nom du driver stock dans un fichier de configuration (properties file))
Philippe GENOUD UJF 06/01/2010

16

JDBC

2) Connexion la base

Ouverture de la connexion : Connection conn = DriverManager.getConnection(url, user, password); Identification de la BD via un URL (Uniform Ressource Locator) de la forme gnrale

jdbc:driver: base

l'utilisation de JDBC

le driver ou le type identification du SGBDR de la base

La forme exacte dpend de la BD, chaque BD ncessitant des informations spcifiques pour tablir la connexion. Par exemple pour le driver Oracle JDBC-Thin :

jdbc:oracle:thin:@ serveur:port :base


nom IP du serveur numro de port nom de la base socket utiliser

Exemple : Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@hopper.e.ujf-grenoble.fr:1521:ufrima", user, password);


Philippe GENOUD UJF 06/01/2010

17

JDBC

Exemples de connexions Exemples de connexions

Trouver un driver JDBC : sur les sites des fournisseurs de BD Liste des drivers disponibles : http://java.sun.com/products/jdbc/jdbc.drivers.html
Quand getConnection est invoque le DriverManager Oracle 9i sur hopper.e.ujf-grenoble.fr : ojdbc14.jar interroge chaque driver enregistr, si un driver reconnat lurl try { il cre et retourne un objet Connection. Class.forName("oracle.jdbc.OracleDriver"); Connection connect = DriverManager.getConnection( "jdbc:oracle:thin:@hopper.e.ujf-grenoble.fr:1521:ufrima", user, password); ... // utilisation connexion pour accder la base } catch (ClassNotFoundException e) { ... try { } Class.forName("com.mysql.jdbc.Driver"); catch (SQLException sqle) { Connection connect = DriverManager.getConnection( ... "jdbc:mysql://localhost/test", } user, password); ... } catch (ClassNotFoundException e) { ... } catch (SQLException e) { une base MySQL 4.1 locale : ... mysql-connector-java-3.1.6-bin.jar } Philippe GENOUD UJF 06/01/2010

18

JDBC

Connexions Connexions

Une application peut maintenir des connexions multiples le nombre limite de connexions est fix par le SGBD lui mme (de quelques dizaines des milliers). Quand une Connection na plus dutilit prendre soin de la fermer explicitement. Libration de mmoire et surtout des ressources de la base de donnes dtenues par la connexion
try { Connection conn = DriverManager.getConnection("jdbc:odbc:companydb", user, passwd); ... // utilisation de la connexion pour dialoguer avec la BD ... // fermeture de la connexion conn.close(); L'instruction close n'est pas excute. } La connexion reste ouverte ! catch (SQLException e) { ... }

Erreur SQL lors du dialogue avec la BD

Comment garantir la fermeture des connexions ?

Philippe GENOUD

UJF

06/01/2010

19

JDBC

Fermeture d'une connexion Fermeture d'une connexion

Pour garantir fermeture de la connexion : Utilisation d'une clause finally


Pour que conn soit connue dans le bloc finally Connection conn;= null; Le compilateur impose d'initialiser conn

try { Connection conn = DriverManager.getConnection("jdbc:odbc:companydb", conn = DriverManager.getConnection("jdbc:odbc:companydb", user, passwd); ... // utilisation de la connexion pour dialoguer avec la BD ... // fermeture de la connexion conn.close(); } catch (SQLException e) { ... } finally { conn peut ne pas avoir t initialise try { if (conn != null) conn ne peut tre rsolu conn.close(); close peut provoquer une SQLException } catch (SQLException e){ e.printStackTrace(); } }

Philippe GENOUD

UJF

06/01/2010

20

JDBC

3) Prparer/excuter une requte

Une fois une Connection cre on peut lutiliser pour crer et excuter des requtes (statements) SQL.
Statement

3 types (interfaces) d'objets statement :


Statement : requtes simples (SQL statique)

PreparedStatement

CallableStatement

PreparedStatement : requtes prcompiles (SQL dynamique si

support par SGBD) qui peuvent amliorer les performances


CallableStatement : encapsule procdures SQL stockes dans le

SGBD 3 formes (mthodes) d'excutions :


executeQuery : pour les requtes qui retournent un rsultat (SELECT )
rsultat accessible au travers d un objet ResultSet

executeUpdate : pour les requtes qui ne retournent pas de rsultat

(INSERT, UPDATE, DELETE, CREATE TABLE et DROP TABLE ) execute : quand on ne sait pas si la requte retourne ou non un rsultat, procdures stockes
Philippe GENOUD UJF 06/01/2010

21

JDBC
Cration d'un statement :

Prparer / excuter une requte simple

Statement stmt = conn.createStatement();

Excution de la requte :
String myQuery = "SELECT prenom, nom, email " + "FROM employe " + "WHERE (nom='Dupont') AND (email IS NOT NULL) " + "ORDER BY nom"; ResultSet rs = stmt.executeQuery(myQuery);

executeQuery(String q) renvoie un objet de type ResultSet permet de dcrire la table des rsultats

Philippe GENOUD

UJF

06/01/2010

22

JDBC

Lecture des rsultats

executeQuery() renvoie un objet de classe ResultSet permet de dcrire la table des rsultats
java.sql.Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT nom, code_client FROM Clients");

Nom DUPONT DUROND ... ... ZORG

Prnom Jean Louise

Code_client Adresse 12345 135 rue du Lac 12545 13 avenue de la Mer

Albert

45677

8 Blvd De la Montagne

Nom DUPONT DUROND ... ... ZORG

Code_client 12345 12545

45677

Les ranges du ResultSet se parcourent itrativement ligne (row) par ligne boolean next() permet davancer la ligne suivante, false si pas de ligne suivante Plac avant la premire ligne la cration du ResultSet
while (rs.next()) { ... Exploiter les donnes }
Philippe GENOUD UJF 06/01/2010

23

JDBC

Lecture des rsultats

Les colonnes sont rfrences par leur numro ou par leur nom L'accs aux valeurs des colonnes se fait par des mthodes getXXX(String nomCol) ou getXXX(int numCol) o XXX dpend du type de la colonne dans la table SQL
Pour les trs 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 { numros de colonnes int i = rs.getInt("a"); // rs.getInt(1); dbutent 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

06/01/2010

24

JDBC

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

Pour chaque mthode getXXX le driver JDBC doit effectuer une conversion entre le type de donnes de la base de donnes et le type Java correspondant
Type SQL
CHAR VARCHAR NUMERIC DECIMAL BIT TINYINT SMALLINT INTEGER BIGINT REAL FLOAT DOUBLE DATE TIME TIME STAMP

Mthode
getString getString getBigDecimal getBigDecimal getBoolean getByte getShort getInt getLong getFloat getDouble getDouble getDate getTime getTimestamp

Type Java
String String java.Math.BigDecimal java.Math.BigDecimal boolean byte short int long float double double Boolean Integer Integer Integer Long Float Double Double

Peut tre appele sur nimporte quel type de valeur

getObject peut retourner nimporte quel type de donne packag dans un objet java (wrapper object )

java.sql.Date java.sql.Time

Si une conversion de donnes invalide est effectue (par ex DATE -> int), une SQLException est lance

getObject

java.sql.Timestamp
UJF 06/01/2010

Philippe GENOUD

25

JDBC
PERSONNES

Traitement des valeurs nulles Traitement des valeurs nulles

Que se passe-t-il si une mthode getXXX() de ResultSet est applique une valeur NULL SQL ?

Valeurs nulles acceptes

ResultSet rs = stmt.executeQuery("SELECT * FROM PERSONNES"); ... ... rs.getString("ADRESSE") ? ... rs.getDate("DATE_NAISS")

Conversion automatique vers une valeur "acceptable" selon le type retourn par getXXX() null si getXXX() retourne un type objet (ex : getString(),getDate(), ) 0 si getXXX() retourne un type numrique (ex : getInt(),getDouble(), ) false pour getBoolean()
Philippe GENOUD UJF 06/01/2010

26

JDBC
PERSONNES

Traitement des valeurs nulles Traitement des valeurs nulles

Comment distinguer valeurs NULL des autres ?

ResultSet rs = stmt.executeQuery("SELECT NOM,PRENOM,MARIE FROM PERSONNES ORDER BY NOM"); while (rs.next()) { System.out.print(rs.getString("NOM")); System.out.print(" " + rs.getString("PRENOM") + " "); System.out.println(rs.getBoolean("MARIE")?"Mari":"Non Mari"); } TITI Fifi Mari TOTO Riri Non Mari TUTU Mimi Non Mari ...

Mthode wasNull() de ResultSet Renvoie true si on vient de lire une valeur NULL, false sinon
while (rs.next()) { System.out.print(rs.getString("NOM")); System.out.print(" " + rs.getString("PRENOM") + " "); boolean mari = rs.getBoolean("MARIE"); if (rs.wasNull()) System.out.println("?"); else System.out.println(mari?"Mari":"Non Mari"); }

TITI Fifi Mari TOTO Riri ? TUTU Mimi Non Mari ...

Philippe GENOUD

UJF

06/01/2010

27

JDBC

Prparer/excuter une requte simple

Un objet Statement reprsente une simple (seule) requte SQL.


Un appel executeQuery() , executeUpdate() ou execute() ferme implicitement tout ResultSet actif associ avec lobjet Statement. Avant d excuter une autre requte avec un objet Statement il faut tre sr davoir exploit les rsultats de la requte prcdente.
Statement stmt = conn.createStatement(); ResultSet rs1 = stmt.executeQuery(myQuery1); ResultSet rs2 = stmt.executeQuery(myQuery2); //exploitation des rsultats de myQuery1 while (rs1.next() { ... } //exploitation des rsultats de myQuery2 while (rs2.next() { ... } Statement stmt = conn.createStatement(); ResultSet rs1 = stmt.executeQuery(myQuery1); //exploitation des rsultats de myQuery1 while (rs1.next() { ... } ResultSet rs2 = stmt.executeQuery(myQuery2); //exploitation des rsultats de myQuery2 while (rs2.next() { ... }

Si application ncessite deffectuer plus dune requte simultanment, ncessaire de crer et utiliser autant d'objets Statement.
Philippe GENOUD UJF 06/01/2010

28

JDBC

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 06/01/2010

29

JDBC

Prparer/excuter une requte prcompile


Ds que l objet est instanci, la procdure SQL est transmise au SGBD qui la compile

Cration d'un preparedStatement (requte SQL dynamique):


paramtres formels spcifis l aide de ? PreparedStatement ps = conn.prepareStatement( "SELECT * FROM ? WHERE NAME = ? " );

Passage des paramtres effectifs


l aide de mthodes au format setXXX(indice,valeur) o XXX reprsente le type du paramtre ps.setString(1, "Person" );

Invocation et exploitation des rsultats


phase identique celle utilise pour SQL statique for (int i=0; i < names.length; i++) { ps.setString(2, names[i]) ; ResultSet rs = ps.executeQuery(); // ... Exploitation des rsultats }
Philippe GENOUD UJF

06/01/2010

30

10

JDBC

Procdures stockes Procdures stockes

La plupart des SGBD incluent un langage de programmation interne (ex: PL/SQL d Oracle) permettant aux dveloppeurs dinclure du code procdural dans la BD, code pouvant tre ensuite invoqu depuis dautres applications. le code est crit une seule fois est peut tre utilis par diffrentes applications. permet de sparer le code des applications de la structure interne des tables. (cas idal : en cas de modification de la structure des tables seul les procdures stockes ont besoin dtre modifies) Utilisation des procdures stockes depuis JDBC via interface CallableStatement Syntaxe unifie indpendante de la manire dont celles-ci sont gres par le SGBD (chaque SGBD a sa propre syntaxe) Utilisation possible de la valeur de retour Gestion des paramtres IN, OUT, INOUT

Philippe GENOUD

UJF

06/01/2010

31

JDBC
Prparation de l appel

Procdures stockes Procdures stockes

Appel avec valeur de retour et paramtres

CallableStatement proc = conn.callableStatement( "{? = call maProcedure(?,?)}");


Appel sans valeur de retour et avec paramtres

CallableStatement proc = conn. callableStatement( "{call maProcedure(?,?)}");

Prparation des paramtres


proc.registerOUTParameter(2,Types.DECIMAL,3);
2me paramtre de type OUT Nombre de chiffres aprs dcimale

Passage des paramtres IN


proc.setByte(1,25);
1er paramtre (type IN) valeur

Appel
ResultSet rs = proc.executeQuery();

Exploitation du ResultSet (idem que pour Statement et PreparedStatement) Rcupration des paramtres OUT
java.Math.BigDecimal bigd = proc.getBigDecimal(2,3);
Philippe GENOUD UJF 06/01/2010

32

JDBC

Accs aux mta-donnes

Permet de dcouvrir dynamiquement (au moment de lexcution) des proprits concernant la base de donnes ou les rsultats de requtes Exemple : lors de lexcution dune requte non connue lavance.
Renvoie executeUpdate ?? true si requte de type Query executeQuery ?? false sinon (Update) String contenant une requte quelconque Accs au ResultSet produit par la requte if (stmt.execute(cmd)) { stmt.execute(cmd) cmd ResultSet rs = stmt.getResultSet(); ... Besoin daccs aux mta//Exploitation du ResultSet donnes du ResultSet ... rs.close(); } else System.out.println("nombre de lignes modifies " + stmt.getUpdateCount() ); }

Philippe GENOUD

UJF

06/01/2010

33

11

JDBC

Accs aux mta-donnes

Permet de dcouvrir dynamiquement (au moment de lexcution) des proprits concernant la base de donnes ou les rsultats de requtes La mthode getMetaData() de la classe Connection permet d'obtenir les mta-donnes concernant la base de donne. Elle renvoie un DataBaseSetMetaData. On peut connatre : les lments SQL supports par la base la structure des donnes de celle-ci (getCatalog, getTables ) La mthode getMetaData() de la classe ResultSet permet d'obtenir les mta-donnes d'un ResultSet. Elle renvoie un ResultSetMetaData. On peut connatre : Le nombre de colonnes : getColumnCount() Le nom d'une colonne : getColumnName(int col) Le type d'une colonne : getColumnType(int col)
Philippe GENOUD UJF 06/01/2010

34

JDBC

Gestion des transactions Gestion des transactions

Transaction : permet de ne valider un ensemble de traitements sur une BD que si ils se sont tous effectus correctement Exemple : transfert de fond = dbiter un compte + crditer un autre compte Linterface Connection offre des services de gestion des transactions setAutoCommit(boolean autoCommit)dfinit le mode de la connexion (auto-commit par dfaut) commit()dclenche validation de la transaction rollback()annule la transaction
try { con.setAutoCommit(false); // excuter 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(); // annule les oprations de la transaction }

Philippe GENOUD

UJF

06/01/2010

35

JDBC

Gestion des transactions Gestion des transactions

int getTransactionIsolation() (de l'interface Connection) pour savoir quel support le SGBD et le pilote JDBC offrent pour les transactions
Connection.TRANSACTION_NONE pas de support Connection.TRANSACTION_READ_UNCOMMITTED "dirty-reads" un row modifi par une transaction peut tre lue par une autre transaction avant que les modifications n'aient t valides par un commit "non-repeatable reads" une transaction lie un row, une seconde transaction modifie le row, la premire transaction relit le row et obtient des valeurs diffrentes "phantom-reads" une transaction lit tous les row satisfaisant une condition (clause WHERE), une seconde transaction insre un row qui satisfait cette condition, la premire transaction relit les row avec la mme condition et elle obtient les row supplmentaires insrs par la seconde. Connection.TRANSACTION_READ_COMMITTED pas de dirty-reads Niveau pour Oracle 9i sur hopper avec ojdbc14 Connection.TRANSACTION_REPEATABLE_READ, pas de dirty-reads et non-repeatable-reads Connection.TRANSACTION_SERIALIZABLE pas de dirty-reads,non-repeatable-reads et phantom-reads
Philippe GENOUD UJF 06/01/2010

36

12

JDBC

Gestion des transactions Gestion des transactions

API JDBC 3.0 a ajout possibilit de dfinir des points de sauvegarde dans une transaction
Statement stmt = conn.createStatement(); conn.setAutocommit(false); ... int rows = stmt.executeUpdate("INSERT INTO TAB1 ... "); // set savepoint Savepoint svpt1 = conn.setSavepoint("SAVEPOINT_1"); rows = stmt.executeUpdate("INSERT INTO TAB1 ... "); ... conn.rollback(svpt1); Annule toutes les oprations effectues depuis le point de sauvegarde ... conn.commit();

Pour retirer un point de sauvegarde conn.releaseSavePoint("SAVEPOINT_1") SAVEPOINT_1 ne peut plus tre utilis dans un rollback par la suite

Philippe GENOUD

UJF

06/01/2010

37

JDBC

A propos de SQLException A propos de SQLException

SQLException dfinit les mthodes suivantes : getSQLState() : --> un code dtat de la norme SQL ANSI-92 getErrorCode() : --> un code d erreur specifique ( vendor-spcific ) getNextException() : --> permet aux classes du JDBC de chaner une suite de SQLExceptions
// du code trs 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

06/01/2010

38

JDBC

SQLWarning SQLWarning

Les classes du JDBC ont la possibilit de gnrer sans les lancer des exceptions quand un problme est intervenu mais quil nest pas suffisamment grave pour interrompre le programme Exemple : fixer une mode de transaction qui nest pas support la base de donnes cible (un mode par dfaut sera utilis) SQLWarning encapsule mme information que SQLException Pour les rcuprer pas de bloc try catch mais laide de mthode 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

06/01/2010

39

13

JDBC

Api JDBC 2.0 Api JDBC 2.0

JDBC 1.0 package supplmentaire (add-on) pour JDK 1.0 intgr lAPI de base (core API) du JDK 1.1 JDBC 2.0 spcification par SUN en mai 1998
extensions pour meilleure gestion des rsultats (ResultSets scrollables , modifiables ) mises jour groupes (batch updates) support pour BLOBs (Binary Large Objects) et CLOBs (Character Large Objects)

intgr l API de Java 2 (JDK 1.2) compatibilit avec la version 1.0


code crit pour JDBC 1.0 compile et fonctionne avec version 2.0 de l API

Philippe GENOUD

UJF

06/01/2010

40

JDBC

ResultSet JDBC 2.0 ResultSet JDBC 2.0

Par dfaut lorsque lon cre un Statement les objets ResultSet sont en lecture seule (read only) et accs squentiel (forward only)
public Statement createStatement() throws SQLException
Statement stmt = conn.createStatement();

Avec JDBC 2.0 possibilit de crer des ResultSet Scrollable plus de limitation un parcours squentiel Updatable possibilit de modifier les donnes dans la BD
public Statement createStatement(int resultSetType, int resultSetConcurrency) ResultSet.TYPE_FORWARD_ONLY ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.TYPE_SCROLL_SENSITIVE
le ResultSet est sensible aux modifications des valeurs dans la base de donnes

ResultSet.CONCUR_READ_ONLY ResultSet.CONCUR_UPDATABLE
On peut modifier les donnes de la base via le ResultSet

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE , ResultSet.CONCUR_UPDATABLE);


Philippe GENOUD UJF 06/01/2010

41

JDBC
Mthodes de parcours
first() last() next() previous() beforeFirst() afterLast() absolute(int) relative(int)

ResultSet JDBC 2.0 ResultSet JDBC 2.0


Positionne sur la premire ligne (1er enregistrement) Positionne sur la dernire ligne (dernier enregistrement) Passe la ligne suivante Passe la ligne prcdante Positionne avant la premire ligne Positionne aprs la dernire ligne Positionne une ligne donne Dplacement dun nombre de lignes donn par rapport ligne courante

Mthodes de test de la position du curseur


boolean isFirst() boolean isBeforeFirst() boolean isLast() boolean isAfterLast() True si curseur positionn sur la premire ligne True si curseur positionn avant la premire ligne True si curseur positionn sur la dernire ligne True si curseur positionn aprs la dernire ligne
UJF 06/01/2010

Philippe GENOUD

42

14

JDBC

ResultSet JDBC 2.0 ResultSet JDBC 2.0

Modification du ResultSet Se placer sur le rang concern Mthodes updateXXX() Puis updateRow() le faire avant de dplacer le curseur sur une autre ligne

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.TYPE_CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery("SELECT NOM,ID_CLIENT FROM CLIENTS); rs.first(); rs.updateInt(2,151970); rs.updateRow();

Philippe GENOUD

UJF

06/01/2010

43

JDBC

ResultSet JDBC 2.0 ResultSet JDBC 2.0

Insertion dune ligne moveToInsertRow() Mthodes Mthodes updateXXX() 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();

Si aucune valeur nest spcifie pour une colonne nacceptant pas la valeur nul, une SQLException est lance. moveToCurrentRow() permet de se repositionner sur la ligne courante avant lappel moveToInsertRow() Suppression dune ligne Se placer sur la ligne deleteRow()
rs.last(); rs.deleteRow();
Philippe GENOUD UJF 06/01/2010

44

JDBC

ResultSet JDBC 2.0 ResultSet JDBC 2.0

Tous les ResultSet ne sont pas ncessairement modifiables En gnral la requte ne doit rfrencer quune seule table sans jointure Tous les drivers JDBC ne supportent pas ncessairement et entirement les ResultSet scrollable et updatable lobjet DataBaseMetaData fournit de linformation quant au support propos pour les ResultSet Il faut tre prudent si le logiciel que lon crit doit interagir avec une grande varit de drivers JDBC

Philippe GENOUD

UJF

06/01/2010

45

15

JDBC

JDBC 2.0 Batch updates JDBC 2.0 Batch updates

Fonctionnalits ajoutes l'interface Statement pour permettre de regrouper des traitements qui seront envoys en une seule fois au SGB amlioration des performances si nombre de traitements important Pas obligatoirement supportes par le pilote mthode supportsBatchUpdates() de DatabaseMetaData
void addBatch(String) Ajouter au "lot" une chane contenant une requte SQL. Requte de type INSERT, UPDATE, DELETE ou DDL (CREATE TABLE, DROP TABLE) Excute toutes les requtes du lot. Renvoie un tableau d'entiers qui pour chaque requte contient soit : le nombre de mises jour effectues (entier >= 0) SUCCESS_NO_INFO si la commande a t excute mais on ne connat pas le nomre de rang affects EXECUTE_FAILED si la commande a chou

int[] executeBatch()

En cas d'echec sur l'une des requtes une BatchUpdateException est lance. Selon les pilotes les requtes qui suivent dans le lot peuvent tre ou ne pas tre excutes. void clearBatch() Supprime toutes les requtes stockes

Philippe GENOUD

UJF

06/01/2010

46

JDBC
Batch update statique con.setAutoCommit(false);

JDBC 2.0 Batch updates JDBC 2.0 Batch updates


http://java.sun.com/developer/Books/JDBCTutorial/index.html)

Exemples (The JDBC Tutorial: Chapter 3 - Advanced Tutorial - Maydene Fisher

Statement stmt = con.createStatement(); stmt.addBatch("INSERT INTO COFFEES " + "VALUES('Amaretto', 49, 9.99, 0, 0)"); Batch update paramtr stmt.addBatch("INSERT INTO COFFEES " + con.setAutoCommit(false); "VALUES('Hazelnut', 49, 9.99, 0, 0)"); PreparedStatement pstmt = con.prepareStatement( stmt.addBatch("INSERT INTO COFFEES " + "INSERT INTO COFFEES VALUES( "VALUES('Amaretto_decaf', 49, ?, ?, ?, ?, ?)"); 10.99, 0, 0)"); pstmt.setString(1, "Amaretto"); stmt.addBatch("INSERT INTO COFFEES " + pstmt.setInt(2, 49); "VALUES('Hazelnut_decaf', 49, pstmt.setFloat(3, 9.99); 10.99, 0, 0)"); pstmt.setInt(4, 0); pstmt.setInt(5, 0); int [] updateCounts = stmt.executeBatch(); pstmt.addBatch(); con.commit(); con.setAutoCommit(true); pstmt.setString(1, "Hazelnut"); pstmt.setInt(2, 49); pstmt.setFloat(3, 9.99); pstmt.setInt(4, 0); pstmt.setInt(5, 0); pstmt.addBatch(); // ... and so on for each new type of coffee
Philippe GENOUD UJF

int [] updateCounts = pstmt.executeBatch(); 47 06/01/2010 con.commit();

JDBC

javax.sql javax.sql

javax.sql package dextension standard de JDBC Pour les applications JEE (Java Entreprise Edition) Inclus en standard dans JSE (Java Standard Edition) depuis version 1.4 DataSource : Obtention du nom de la base partir de serveurs de noms plutt que davoir le nom de la base de donnes cod en dur dans lapplication. Utilisation de JNDI (Java Naming and Directory Interface) pour connexion une base de donne PooledConnection : support pour gestion dun pool de connexion gestion dun cache des connexion ouvertes vite la cration de nouvelles connexions (ce qui est coteux) RowSet : permet de traiter les rsultats des requtes comme des composants JavaBeans Support pour les transactions distribues

Philippe GENOUD

UJF

06/01/2010

48

16

JDBC

javax.sql.DataSource javax.sql.DataSource

L'objet DataSource avec pooling de connexions maintient un ensemble de connexions la BD prtes l'emploi (pool ou cache de connexions).
DataSource

Connection En fait PooledConnection DataSource ds; ... Connection c = ds.getConnnection(); ...

Quand un code a besoin d'accder la base de donnes, il obtient une connexion en s'adressant la DataSource

Philippe GENOUD

UJF

06/01/2010

49

JDBC

javax.sql.DataSource javax.sql.DataSource

L'objet DataSource avec pooling de connexions maintient un ensemble de connexions la BD prtes l'emploi (pool ou cache de connexions).
DataSource

Connection En fait PooledConnection DataSource ds; ... Connection c = ds.getConnnection(); ... c = c.close();

Quand un code a besoin d'accder la base de donnes, il obtient une connexion en s'adressant la DataSource. Il conserve la connexion jusqu' sa fermeture explicite.
Philippe GENOUD UJF 06/01/2010

50

JDBC

javax.sql.DataSource javax.sql.DataSource

L'objet DataSource avec pooling de connexions maintient un ensemble de connexions la BD prtes l'emploi (pool ou cache de connexions).
DataSource

Connection En fait PooledConnection DataSource ds; ... Connection c = ds.getConnnection(); ... c = c.close();

Quand un code a besoin d'accder la base de donnes, il obtient une connexion en s'adressant la DataSource. Il conserve la connexion jusqu' sa fermeture explicite. Lorsqu'une connexion est "ferme", elle est en fait relche et remise dans le pool.
Philippe GENOUD UJF 06/01/2010

51

17

JDBC

Drivers JDBC Drivers JDBC

Philippe GENOUD

UJF

06/01/2010

52

JDBC

Drivers JDBC Drivers JDBC

4 catgories de drivers JDBC type 1 : Pont JDBC-ODBC (Open Data Base Connectivity)
ODBC interface daccs (C) aux SGBD dfinie par Microsoft standard de fait, trs grand nombre de SGBD accessibles impose chargement dans la mmoire vive de la plateforme dexcution de librairies dynamiques Application Java JDBC (java.sql) DriverManager Driver type 1 (JDBC/ODBC Bridge) Driver manager ODBC Driver ODBC Interface client SGBD

code binaire ODBC sur le client


alourdit processus d installation et de maintenance problme de scurit pour les applets applets untrusted nont pas l autorisation de charger en mmoire du code natif

Interface serveur SGBD

Philippe GENOUD

UJF

06/01/2010

53

JDBC
Type 2 : API native

Drivers JDBC Drivers JDBC

Application Java interface daccs entre le driver manager JDBC et l interface cliente du SGBD impose chargement dans la mmoire vive de la plateforme dexcution de librairies dynamiques
(code binaire de l interface client spcifique au SGBD par exemple librairies OCI, Oracle Call Interface, conues initialement pour programmeurs C/C++ )

JDBC (java.sql) DriverManager Driver type 2 Interface client SGBD

Driver ddi un SGBD particulier


moins ouvert que pont JDBC/ODBC potentiellement plus performant (moins de couches logicielles)

Interface serveur SGBD

mmes problmes quavec pont JDBC-ODBC


code natif sur plateforme d excution

Philippe GENOUD

UJF

06/01/2010

54

18

JDBC
Type 3 : JDBC-Net
traduit appels JDBC suivant un protocole rseau vocation universelle indpendant des fournisseurs de SGBD (Sql*net, NET8)

Drivers JDBC Drivers JDBC


Application Java JDBC (java.sql) DriverManager Driver type 3

requtes rseau doivent tre ensuite traduites par un serveur ddi aux requtes spcifiques un SGBD (par exemple WebLogic de BEA) drivers 100% Java
peuvent tre utiliss depuis une applet (les drivers ne sont plus du code natif et peuvent tre chargs comme nimporte quel composant Java)

Interface serveur middleware Interface client SGBD middleware Interface serveur SGBD

si l application est une applet, le modle classique de scurit peut poser des problme de connexion rseau
une applet untrusted ne peut ouvrir une connexion quavec la machine sur laquelle elle est hberge il suffit d installer le serveur Web et le serveur middleware sur la mme plateforme. Possibilit d accder alors un SGBD situ n importe o sur le rseau.

Philippe GENOUD

UJF

06/01/2010

55

JDBC
Type 4 : Thin (protocole natif)

Drivers JDBC Drivers JDBC

le driver interagit directement avec le gestionnaire du SGBD


utilise directement protocole rseau du SGBD (spcifique un fournisseur de SGBD)

Application Java JDBC (java.sql) DriverManager Driver type 4

Driver 100% Java (connexion via sockets Java) Solution la plus la plus lgante et la plus souple

Interface serveur SGBD

si l application est une applet, le modle classique de scurit des applets impose que le SGBD soit hberg sur le serveur Web Durant le projet le driver utilis pour accder Oracle sera de ce type
Philippe GENOUD UJF 06/01/2010

56

JDBC

Drivers JDBC Drivers JDBC

Liste des drivers disponibles : http://java.sun.com/products/jdbc/jdbc.drivers.html slection dun driver : choix entre vitesse, fiabilit et portabilit. Programme standalone , avec une interface graphique qui sexcute toujours sur un systme Windows peut tirer bnfice de performances dun driver type 2 (driver code-natif). Une applet peut ncessiter un driver de type 3 (pour passer un firewall). Une servlet dploye sur de multiples plateformes peut ncessiter la souplesse offerte par des drivers de type 4. ...

Philippe GENOUD

UJF

06/01/2010

57

19

JDBC
JDBC API de bas niveau Parfois difficile pendre en main Demande des connaissances "pointues" en BD Dpendances par rapport au SGBD cible Nombreuses API construites au dessus de JDBC Jakarta Commons DbUtils (simplifie utilisation de JDBC) http://jakarta.apache.org/commons/dbutils/ Fameworks de persistance ou de mapping O/R Ibatis, http://ibatis.apache.org/ Hibernate, http://www.hibernate.org JPA Java Persistence APIE, JEE5
modle de persistance EJB (Entreprise Java Beans) 3.0 issu d'Hibernate

Philippe GENOUD

UJF

06/01/2010

58

JDBC

Jakarta Commons DbUtils Jakarta Commons DbUtils

public List fonctionClassique(DataSource ds) { Extrait de Connection conn = null; Statement s = null; http://christophej.developpez.com/tutoriel/api/dbutils/ ResultSet rs = null; String requete = "Select nom, age, classe from Eleve where age='12'"; List lBeans = new ArrayList(); try { finally { //Etablissement de la connexion //fermeture des diffrents lments conn = ds.getConnection(); if (rs != null) { s = conn.createStatement(); try { //Excution de la requte rs.close(); rs = s.executeQuery(requete); } catch (SQLException e) { //Traitement du rsultat } while (rs.next()) { rs = null; EleveBean bean = new EleveBean(); } bean.setNom(rs.getString("nom")); if (s != null) { bean.setAge(rs.getInt("age")); try { bean.setClasse(rs.getString("classe")); s.close(); lBeans.add(bean); } catch (SQLException e) { } } } catch (SQLException e) { s = null; e.printStackTrace(); } } public List fonctionDbUtils(DataSource ds) { public List fonctionDbUtils(DataSource ds) { if (conn != null) { String requete = String requete = try { "Select nom, age, classe from Eleve where age='12'"; "Select nom, age, classe from Eleve where age='12'"; conn.close(); //prparation d'un gestionnaire de requte //prparation d'un gestionnaire de requte } catch (SQLException e) { QueryRunner qRunner = new QueryRunner(ds); QueryRunner qRunner = new QueryRunner(ds); } //Prparation de la liste pour la rponse //Prparation de la liste pour la rponse conn = null; List lBeans = new ArrayList(); List lBeans = new ArrayList(); } //Execution de la requte et remplissage de la List //Execution de la requte et remplissage de la List } try { try { return lBeans; Beans = (List) qRunner.query(requete, Beans = (List) qRunner.query(requete, } new BeanListHandler(EleveBean.class)); new BeanListHandler(EleveBean.class)); } catch (SQLException e) { } catch (SQLException e) { e.printStackTrace(); e.printStackTrace(); } } return lBeans; return lBeans; } } Philippe GENOUD UJF 59 06/01/2010

JDBC
<interface>

RowSet RowSet
Ajoute l'API JDBC un support pour modles de composants JavaBeans A rowset, which can be used as a JavaBeans component in a visual Bean development environment, can be created and configured at design time and executed at run time.

<interface>

RowSet

<interface>

CachedRowSet

RowSet dconnect stockant ses donnes en mmoire pas particulirement adapt de grandes quantits de donnes

et tre

Deux catgories de RowSet Connects : gardent une connexion ouverte vers le SGBD durant tout leur cycle de vie Dconnects : capables de rompre la connexion la source, faire des modifications sur les donnes puis de se reconnecter afin de transmettre les modifications
<interface>

<interface>

<interface>

<interface>

JoinRowSet

WebRowSet
Philippe GENOUD UJF 06/01/2010

FilteredRowSet

jo

ur

ResultSet

JdbcRowSet

60

20

Mapping Objet/Relationnel Mapping Objet/Relationnel exemple :: Hibernate exemple Hibernate

Philippe GENOUD

UJF

06/01/2010

61

JDBC
Modle objet Event + id + date + title
0..* + events

Modle relationnel

Hibernate Hibernate
0..* + persons

Person + id + age + firstname + lastname

Philippe GENOUD

UJF

06/01/2010

62

JDBC
Classes respectant rgles de programmation simples (Java Beans) Person Person
Event Event -- long id long id -- int age int age -- String firstname String firstname -Srting lastname -Srting lastname -- Set events Set events + int getAge() + int getAge() + void setAge(int a) + void setAge(int a) ... ... -- long id long id -- Date date Date date -- String title String title -- Set persons Set persons + Date getDate() + Date getDate() + void setDate(Date d) + void setDate(Date d) ... ...

Application Application

Classes encapsulant les donnes Classes encapsulant les donnes (objets persistants) (objets persistants)

POJO (Plain Old Java Object)


Person.hbm.xml Event.hbm.xml

Hibernate Hibernate
hibernate.cfg.xml
<hibernate-configuration> <session-factory> <property name="connection.driver_class"> org.hsqldb.jdbcDriver </property> <property name="connection.url"> jdbc:hsqldb:hsql://localhost </property> ...

Proprits de Proprits de configuration configuration

Fichiers de Fichiers de mapping (xml) mapping (xml)

<hibernate-mapping> <class name="events.Person" <hibernate-mapping> table="PERSON"> <class name="events.Event" <id name="id" column="PERSON_ID"> table="EVENTS"> <generator class="native"/> <id name="id" column="EVENT_ID"> </id> <generator class="increment"/> <property name="age"/> </id> ... </class> </hibernate-mapping>

SGBD SGBD

Philippe GENOUD

UJF

06/01/2010

63

21

JDBC
Classe persistante
package events;

Respect des conventions standards JavaBeans


import java.util.*; public class Event { private Long id; private String title; private Date date; public Event() {} public Long getId() { return id; } private void setId(Long id) { this.id = id; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } }
Philippe GENOUD UJF 06/01/2010

Visibilit prive pour champs Constructeur sans paramtre


Pour permettre Hibernate de crer des objets en utilisant API de reflection

Accesseurs : getXXX Modifieurs : setXXX

public String getTitle() { return title; } public void setTitle(String title) { this.title = title; }

64

JDBC
Event.hbm.xml

Fichier de Mapping Fichier de Mapping


DTD dfinissant la structure d'un fichier de mapping

<?xml version="1.0"?> <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <hibernate-mapping> <class name="events.Event" table="EVENTS"> <class name="events.Event" table="EVENTS"> <id name="id" column="EVENT_ID"> <id name="id" column="EVENT_ID"> <generator class="increment"/> <generator class="increment"/> </id> </id> Indique la table correspondant la classe Mapping de la proprit id servant identifier l'objet vers une cl primaire de la table Permet de prciser le mode de gnration d'un nouvel identifiant

<property name="date" type="timestamp" column="EVENT_DATE"/> <property name="date" type="timestamp" column="EVENT_DATE"/> <property name="title"/> <property name="title"/> </class> </class> </hibernate-mapping> </hibernate-mapping> Mapping d'une proprit de l'objet

Philippe GENOUD

UJF

06/01/2010

65

JDBC
hibernate.cfg.xml

Configuration d'Hibernate Configuration d'Hibernate

<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?> DTD dfinissant la structure d'un <!DOCTYPE hibernate-configuration PUBLIC <!DOCTYPE hibernate-configuration PUBLIC fichier de configuration "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <hibernate-configuration> <session-factory> <session-factory> Classe du driver JDBC <!-- Database connection settings --> <!-- Database connection settings --> <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> <property name="connection.url">jdbc:hsqldb:hsql://localhost</property> <property name="connection.url">jdbc:hsqldb:hsql://localhost</property> <property name="connection.username">sa</property> <property name="connection.username">sa</property> url de connexion <property name="connection.password"></property> <property name="connection.password"></property> <!-- JDBC connection pool (use the built-in) --> <!-- JDBC connection pool (use the built-in) --> <property name="connection.pool_size">10</property> <property name="connection.pool_size">10</property> Nombre maximum de connexions dans le pool

<!-- SQL dialect --> <!-- SQL dialect --> <property name="dialect">org.hibernate.dialect.HSQLDialect</property> <property name="dialect">org.hibernate.dialect.HSQLDialect</property> <!-- Enable Hibernate's automatic session context management --> <!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property> <property name="current_session_context_class">thread</property> ... ... <!-- Drop and re-create the database schema on startup --> <!-- Drop and re-create the database schema on startup --> <property name="hbm2ddl.auto">create</property> <property name="hbm2ddl.auto">create</property> <mapping resource="events/Event.hbm.xml"/> <mapping resource="events/Event.hbm.xml"/>
Philippe GENOUD UJF 06/01/2010

Indique variante de SQL gnre par Hibernate

Fichier de mapping pour classes persistantes 66

22

JDBC

Enregister un objet dans la base Enregister un objet dans la base

private void createAndStoreEvent(String title, Date theDate) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Event theEvent = new Event(); theEvent.setTitle(title); theEvent.setDate(theDate); session.save(theEvent); session.getTransaction().commit(); } Objet org.hibernate.Session pour effectuer des transaction vers la BD via Hibernate Objet construit et initialis dans l'application Hibernate enregistre l'objet dans la base de donnes

Philippe GENOUD

UJF

06/01/2010

67

JDBC
Objet sess

Charger des objets depuis la base Charger des objets depuis la base

private List listEvents() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); List result = session.createQuery("from Event").list(); session.getTransaction().commit(); return result; } HQL (Hibernate Query Language). Hibernate gnre le SQL appropri, l'envoie la BD et "peuple" des objets Event avec les donnes

Philippe GENOUD

UJF

06/01/2010

68

JDBC

Mapping O/R Mapping O/R en utilisant annotations en utilisant annotations

Annotation (Java 5 +) Accroche une information un lment d'une classe Java la classe elle-mme une mthode un attribut Cette information est utilise par un mcanisme tiers et non par la classe o elle est dfinie Compilateur java (javac), serveur d'application (Glassfish (Serveur rfrence JEE5, JBoss), Annotation qui indique qu'il s'agit d'un Bean Entit @Entity
public class Person {
par dfaut sera mapp sur la table de mme nom et les proprits de champs seront mis automatiquement en correspondance selon leur nom

Annotation qui indique qu'il s'agit d'un cl primaire

@Id
private private private private Long id; int age; String firstname; String lastname;
<?xml version="1.0"?> <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC Fichier configuration <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "-//Hibernate/Hibernate Mapping DTD 3.0//EN" XML inutile "http://hibernate.sourceforge.net/hibernate-mapping"http://hibernate.sourceforge.net/hibernate-mapping3.0.dtd"> 3.0.dtd"> <hibernate-mapping> <hibernate-mapping> <class name="events.Person" table="PERSON"> <class name="events.Person" table="PERSON"> <id name="id" column="PERSON_ID"> <id name="id" column="PERSON_ID"> <generator class="native"/> <generator class="native"/> </id> </id> <property name="age"/> <property name="age"/> <property name="firstname"/> <property name="firstname"/> <property name="lastname"/> <property name="lastname"/>

public Long getId() { return id; } public void setId(Long id) { this.id = id; }
Philippe GENOUD UJF

06/01/2010

69

23

JDBC

bibliographie bibliographie

Java Entreprise in a Nutshell, David Flannagan, Jim Farley, William Cawford et Kris Magnusson, Ed. O Reilly , 1999 Database programming with JDBC and Java, George Reese, Ed. O Reilly, 1998 Tutoriaux en ligne JDBCshort course
http://developer.java.sun.com/developer/onlineTraining/Database/ JDBCShortCourse/index.html

Home: jdbcmanager.sourceforge.net

Home: qform.sourceforge.net

QueryForm is a GPL'd open source GUI database front-end that, in the words of developer Dave Glasser (email: dglasser@pobox.com), "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 06/01/2010

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.

Applications : JDBCTest permet de tester via une interface graphique les diffrentes fonctionnalits proposes par le JDBC et de voir le code Java correspondant. (http://developer.java.sun.com/developer/onlineTraining/Database/ JDBCShortCourse/jdbc/exercises/JDBCTestConnect/index.html)

et tre

jo

ur

70

24