Vous êtes sur la page 1sur 17

JDBC

Java DataBase Connectivity


P. Graffion / JDBC v1.2 1

Dfinition
Package Java pour l'accs aux SGDBR : java.sql API unique daccs tout SGBD conforme au standard SQL-3EntryLevel Permet d'envoyer des requtes SQL (sur le rseau)

Objets d'accs aux donnes


C++/JAVA

API JDBC API

Couches Interface JDBC Driver

SGBDR

Middleware JDBC
P. Graffion / JDBC v1.2 2

Architecture
Java Applets & Applications JDBC API
JDBC Driver Manager

JDBC Driver API


JDBC-ODBC API Natives (C/C++) JDBC Net API Natives en JAVA

ODBC ODBC Driver JavaSoft

BD Propritaire SGBDR
P. Graffion / JDBC v1.2 3

Driver JDBC de type 1


Java appl JDBC API JDBC Driver Manager JDBC Driver API JDBC-ODBC

Pont JDBC-ODBC :
appels JDBC traduits en appels ODBC

fourni par Sun :


sun.jdbc.odbc.JdbcOdbcDriver

ODBC ODBC Driver

requiert linstallation dun driver ODBC sur le client code ODBC natif (C) => ne peut pas tre utilis par une applet "untrusted"

SGBDR
P. Graffion / JDBC v1.2 4

Driver JDBC de type 2


Java appl JDBC API JDBC Driver Manager JDBC Driver API

API Natives (C/C++)

Pont natif (C/C++) => ne peut pas tre utilis par une applet "untrusted" moins ouvert que le pont JDBC-ODBC plus performant

SGBDR
P. Graffion / JDBC v1.2 5

Driver JDBC de type 3


Java appl JDBC API JDBC Driver Manager JDBC Driver API JDBC Net
Protocole rseau gnrique

Driver JDBC-Net appels JDBC convertis suivant un protocole rseau gnrique Driver 100% Java => peut tre utilis par une applet "untrusted"

Serveur rseau
protocole DB spcifique

SGBDR
P. Graffion / JDBC v1.2 6

Driver JDBC de type 4


Java appl JDBC API JDBC Driver Manager JDBC Driver API

API Natives en JAVA

Driver 100% Java ne requiert aucune configuration sur le client interaction directe avec le SGBD via sockets OK pour applet "untrusted" si le SGBD est sur le serveur web

protocole DB spcifique

SGBDR
P. Graffion / JDBC v1.2 7

Architectures 2-tier et 3-tier


Architecture 2-tier
- JDBC est tlcharg - Le Driver reste sur le serveur
IHM IHM JDBC - ODBC JDBC
DB protocol

JDBC-ODBC - Traduit les appels JDBC en ODBC - Appel un driver local qui n'est pas crit en Java

Driver ODBC API BD

Architecture 3-tier
- JDBC est sur le serveur applicatif - Le Driver reste sur le serveur
IHM Serveur JDBC - ODBC Applicatif Serveur Applicatif
HTTP, RMI, CORBA P. Graffion / JDBC v1.2

SGBDR

Driver ODBC

IHM

JDBC
DB protocol

API DB

API JAVA

java.sql.DriverManager java.sql.Connection java.sql.Statement java.sql.PreparedStatement java.sql.CallableStatement java.sql.ResultSet

Classes de connexion

Interfaces de requte sql

Classe de traitement des rsultats

java.sql.DatabaseMetaData
P. Graffion / JDBC v1.2

Classe de rcupration d info sur la structure de la BD


9

Mise en oeuvre

1. Enregistrer le driver JDBC 2. Ouvrir une connexion sur la base 3. Crer la requte (un Statement) 4. Excuter la requte 5. Traiter le rsultat retourn (un ResultSet) 6. Fermer les objets

P. Graffion / JDBC v1.2

10

Enregistrement du driver

Fait en instanciant une classe implmentant ce driver 2 possibilits :

DriverManager.registerDriver(new com.mysql.jdbc.Driver());

ou
Class.forName("com.mysql.jdbc.Driver");

P. Graffion / JDBC v1.2

11

URL JDBC

Identifie une BD en spcifiant :


un protocole : jdbc un sous-protocole : nom dun driver (ex.: odbc) (un URL distant ://host:port si connection rseau) identificateur de BD (nom logique dfini par l administrateur de BD)

Exemple : jdbc:odbc://www.xyz.com/employeDB

P. Graffion / JDBC v1.2

12

Connexion la base

String dbUrl = "jdbc:mysql://localhost:3306/yaps"; String user = "root", password = ""; Connection conn ; conn = DriverManager.getConnection(dbUrl, user, password);

P. Graffion / JDBC v1.2

13

Exemple de schma SQL


CREATE TABLE employe ( id INT UNSIGNED PRIMARY KEY, nom VARCHAR(50), prenom VARCHAR(40), age INT UNSIGNED ); INSERT INTO employe VALUES (1, 'Gates', 'Bill', 50); INSERT INTO employe VALUES (2, 'Jobs', 'Steve', 50);

P. Graffion / JDBC v1.2

14

Invocation d'une requte SQL de slection

String anSQLquery = "SELECT prenom, nom, age FROM employe"; // Cration

d'un statement de la requte

Statement st = conn.createStatement(); // Excution ResultSet r = st.executeQuery(anSQLquery);

P. Graffion / JDBC v1.2

15

Parcours du rsultat - ResultSet 1/2


executeQuery( ) retourne une instance de ResultSet permet de parcourir lensemble des lignes de la table :
Une seule possibilit avec JDBC 1.x : next() plus riche en JDBC 2.0 : previous(), first(), last(), absolute(int row)

les colonnes peuvent tre rfrences par leur nom ou leur numro (origine 1) obtention de la valeur dune colonne par get<JavaType>(index|nom)

P. Graffion / JDBC v1.2

16

Parcours du rsultat - ResultSet 2/2

String query = "SELECT nom, age ..."; ResutSet r = st.executeQuery(query); while(r.next()) { String nom = r.getString("nom"); int age = r.getInt(2); // ... }

P. Graffion / JDBC v1.2

17

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 driver Class.forName("com.mysql.jdbc.Driver"); // Etablissement de la connexion Connection conn; conn = DriverManager.getConnection(dbUrl, user, password); // Cration d'un statement Statement st = conn.createStatement(); String anSQLquery = "SELECT prenom, nom, age FROM employe "; // Excution de la requte ResultSet r = st.executeQuery(anSQLquery); // Parcours du rsultat while(r.next()) { String nom = r.getString("nom"); int age = r.getInt("age"); System.out.println(nom + ", " + age + " ans"); } r.close(); st.close(); conn.close(); } }

P. Graffion / JDBC v1.2

18

Correspondance de types SQL - Java


Type Java boolean String double float int long byte java.math.BigDecimal byte[] java.sql.Date java.sql.Time mthode getBoolean getString getDouble getFloat getInteger getLong getByte getBigDecimal getBytes getDate getTime Type SQL BIT CHAR FLOAT REAL INTEGER BIG INT TINYINT NUMERIC BINARY DATE TIME

P. Graffion / JDBC v1.2

19

Invocation d'une requte SQL de mise jour

Dans le cas d une modification de donne (INSERT, UPDATE, DELETE), on utilise la mthode executeUpdate() qui renvoie un entier spcifiant le nombre denregistrements modifis
String reqSql = "DELETE FROM ..."; int n = st.executeUpdate(reqSql)

P. Graffion / JDBC v1.2

20

Avec JDBC, on peut aussi ...


Entre autres: Excuter des requtes SQL pr-compiles java.sql.PreparedStatement Excuter des procdures stockes java.sql.CallableStatement Utiliser des transactions Accder aux mta-donnes (schma) de la base java.sql.DatabaseMetaData Manipuler des BLOBs

P. Graffion / JDBC v1.2

21

Invocation d'une requte SQL prcompile


// requte SQL dynamique paramtre par des ? String anSQLquery = "SELECT * FROM employe WHERE age > ? "; // Cration

d'un PreparedStatement

PreparedStatement pst = conn.prepareStatement(anSQLquery ); // => requte SQL compile par le SGBD // Passage

des paramtres par setXXX de la requte

pst.setInt(1, 55); // => age > 55 // Excution ResultSet r = pst.executeQuery();

P. Graffion / JDBC v1.2

22

Invocation d'une procdure stocke


// procdure stocke paramtre par des ? String aCall = "{ ? = call getNumberOfAgeGreaterThan( ? ) } "; // Cration

d'un CallableStatement

CallableStatement cst = conn.prepareCall(aCall); cst.setInt(2, 55); // => age > 55 // Passage

des paramtres doutput

cst.registerOutParameter(1, java.sql.TYPES.INTEGER, 0);

de la procdure int nb = cst.getInt(1); // Rcupration du rsultat


P. Graffion / JDBC v1.2 23

cst.executeQuery(); // Excution

Transactions
3 services dclars dans l interface Connection : setAutoCommit(boolean b) commit() valide une transaction rollback() annulle une transaction Les nouvelles connexions sont initialement en mode autocommit => commit implicite aprs chaque requte SQL Pour dfinir une transaction compose de plusieurs requtes SQL, il faut dsactiver l auto-commit : conn.setAutoCommit(false) Un appel commit() ou rollback() va alors crer implicitement une nouvelle transaction
P. Graffion / JDBC v1.2 24

Transactions Exemple
// Dsactiver l'auto-commit conn.setAutoCommit(false); try { // les requtes SQL suivantes constituent // une seule transaction st.executeUpdate("INSERT ..."); st.executeUpdate("DELETE ..."); st.executeUpdate("UPDATE ..."); // valider la transaction conn.commit(); st.close(); } catch(java.sql.SQLException e) { conn.rollback(); }

P. Graffion / JDBC v1.2

25

Accs au mta-modle
Connection.getMetaData() retourne un DatabaseMetaData permettant de connatre :
la structure de la base : getCatalogs(), getTables(), les types SQL supports : getTypeInfo() une description des procdures stockes : getProcedures() ...

ResultSet.getMetaData() retourne un ResultSetMetaData permettant de connatre :


le nombre de colonnes dun ResultSet : getColumnCount le label dune colonne : getColumnLabel(n) le type SQL d une colonne : getColumnType(n) ...

P. Graffion / JDBC v1.2

26

Accs au mta-modle - Exemple


List getColumnNames(ResultSet rs) { List list = new ArrayList(); ResultSetMetaData rsmd = rs.getMetaData(); int numcols = rsmd.getColumnCount(); for (int i = 1 ; i <= numcols; i++) { String s = rsmd.getColumnLabel(i); list.append(s); } return list; }
P. Graffion / JDBC v1.2 27

CLOB et BLOB

2 types dobjets larges :


CLOB : Character large object BLOB: Binary large

Une colonne de type BLOB est en fait un pointeur vers un fichier


create table userImages ( user varchar(50), image BLOB )

P. Graffion / JDBC v1.2

28

Insrer un 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();

P. Graffion / JDBC v1.2

29

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(); // ... }

P. Graffion / JDBC v1.2

30

Versions JDBC
JDBC 1.0 2.0 3.0 4.0 JDK 1.1 1.2 1.4 1.6 nouveaux packages java.sql javax.sql javax.sql.rowset

cf http://java.sun.com/j2se/1.5.0/docs/api/java/sql/packagesummary.html#package_description
P. Graffion / JDBC v1.2 31

JDBC 3.0

Amliorations des ResultSet Connection pooling Transactions distribues interface RowSet

P. Graffion / JDBC v1.2

32

JDBC 4.0

chargement automatique des drivers JDBC Nouvelles exceptions : SQLSyntaxErrorException, SQLIntegrityConstantViolationException Support XML Utilisation des annotations Java 5
interface LoanAppDetailsQuery extends BaseQuery { @Select("SELECT * FROM LoanDetails where LoanStatus = 'A'") DataSet<LoanApplication> getAllActiveLoans(); }
P. Graffion / JDBC v1.2 33

Points cls

JDBC permet d accder un SGBDR Une application base sur JDBC est indpendante du SGBDR utilis JDBC permet un accs SQL mais nautomatise pas la gestion de la persistance des objets java

P. Graffion / JDBC v1.2

34