Vous êtes sur la page 1sur 10

Une introduction ` JDBC a

Table des mati`res e 1


1.1

Prsentation de JDBC e
Les objectifs de JDBC

JDBC = Java Data Base Connectivity JDBC est bas sur e - ANSI SQL-2 - ODBC (Microsoft), - API Propritaires, e - SQLX/OPEN CLI (Call Level Interface). Objectifs : - Simple, - Complet (en cours...), - Portable, - Modules rutilisables et/ou gnriques, e e e - Intgration aux ateliers de dveloppement. e e

1.2

JDBC dans un client lger e

Utilisation de JDBC dans un client lger : e

rseau JDBC

S.G.B.D.

W.E.B. Applet rseau Serveur

Client lger

1.3

JDBC dans une architecture J2EE

Architecture dexcution rpartie dans la plateforme J2EE : e e

Serveur WEB client 1 Moteur Servlet JSP client 2

EJB JDBC

S.G.B.D. Relationel S.G.B.D. Objets

EJB

EJB

Clients lgers

Traitements

Stockage

1.4

Architecture Logicielle

Application

Driver Manager

Pilote SUN ODBC

Pilote MySQL

Pilote Oracle

Pilote SyBase

Interface Pilote

1.5

Les pilotes JDBC

Il existe quatre types de pilote :


Pilote Java rseau Pont Natif (O.D.B.C.) rseau

Type I

S.G.B.D.

Type II

Pilote Natif (non portable) rseau ou local

S.G.B.D.

API

Type III

Pilote Java rseau

Client B.D.

S.G.B.D.

Type IV

Pilote Java propritaire rseau

S.G.B.D.

2
2.1

Utilisation de JDBC
Squelette de notre exemple
import import import import import java.sql.DriverManager; java.sql.Connection; java.sql.Statement; java.sql.ResultSet; java.sql.SQLException; // // // // // gestion des pilotes une connexion ` la BD a une instruction un rsultat (lignes/colonnes) e une erreur

public class ExempleJdbc { // chargement du pilote // ouverture de connexion // excution dune requ^te e e // programme principal }

Le paquetage java.sql regroupe les interfaces et les classes de lAPI JDBC.

2.2

Dclaration du pilote JDBC e

Mthode de chargement explicite dun pilote : e


void loadDriver() throws ClassNotFoundException { Class.forName("com.mysql.jdbc.Driver"); }

Lappel ` forName dclenche un chargement dynamique du pilote. a e Un programme peut utiliser plusieurs pilotes, un pour chaque base de donnes. e Le pilote doit tre accessible ` partir de la variable denvironnement CLASSPATH. e a Le chargement explicite est inutile ` partir de JDBC 4. a

2.3

Connexion ` la base de donnes a e

Mthode douverture dune nouvelle connexion : e


Connection newConnection() throws SQLException { final String url = "jdbc:mysql://localhost/dbessai"; Connection conn = DriverManager.getConnection(url, "bduser", "SECRET"); return conn; }

LURL est de la forme jdbc:sous-protocole:sous-nom

Quelques exemples (` chercher dans la documentation du pilote) : a jdbc:oracle://srv.dil.univ-mrs.fr:1234/dbtest jdbc:odbc:msql;USER=fred;PWD=secret

2.4

Les requtes en JDBC e

Un exemple dutilisation :
public void listPersons() throws SQLException { Connection conn = null; try { // create new connection and statement conn = newConnection(); Statement st = conn.createStatement(); String query = "SELECT nom,prenom,age FROM personne ORDER BY age"; ResultSet rs = st.executeQuery(query); while (rs.next()) { System.out.printf("%-20s | %-20s | %3d\n", // rs.getString(1), rs.getString("prenom"), rs.getInt(3)); } } finally { // close result, statement and connection if (conn != null) conn.close(); } }

Conseils : Evitez dutiliser SELECT * FROM ... (coteux en transfert), u Attention ` ne pas disperser les noms SQL dans votre code Java. Donnez des noms locaux ` vos colonnes : a a
SELECT nom AS nomFamille, prenom AS ...

Faites le maximum de travail en SQL et le minimum en Java. Minimisez le nombre de connexions ouvertes. Utilisez un pool de connexions si possible. Une connexion peut tre utilise par plusieurs instructions et une instruction permet dexcuter plusieurs e e e requtes. e Vous pouvez fermer (close) un rsultat de requte (ResultSet). e e Vous pouvez fermer (close) une instruction (Statement) ce qui provoque la fermeture des rsultats lis e e ` cette instruction. a

2.5

Programme principal

Mise en oeuvre et gestion des erreurs :

public static void main(String[] Args) { ExempleJdbc test = new ExempleJdbc(); try { test.loadDriver(); test.listPersons(); ... } catch (ClassNotFoundException e) { System.err.println("Pilote JDBC introuvable !"); } catch (SQLException e) { System.out.println("SQLException: " + e.getMessage()); System.out.println("SQLState: " + e.getSQLState()); System.out.println("VendorError: " + e.getErrorCode()); e.printStackTrace(); } }

2.6

Linterface java.sql.ResultSet

Acc`s aux valeurs : e Type getType( int numeroDeColonne ) ; Type getType( String nomDeColonne ) ; boolean next(); Le Type peut tre e Byte Short Int Long Float BigDecimal Boolean String Bytes Date Time TimeStamp AsciiStream UnicodeStream BinaryStream Object

2.7

Correspondance des types Java / SQL


SQL CHAR VARCHAR LONGVARCHAR NUMERIC DECIMAL BIT TINYINT SMALLINT INTEGER BIGINT REAL FLOAT DOUBLE BINARY VARBINARY LONGVARBINARY Java String String String java.math.BigDecimal java.math.BigDecimal boolean byte short int long float double double byte[] byte[] byte[]

2.8

Correspondance des dates et heures

Correspondance des dates 5

SQL DATE TIME TIMESTAMP

Java java.sql.Date java.sql.Time java.sql.TimeStamp

Explication codage de la date codage de lheure codage de la date et de lheure

3
3.1

Modication de la base
Insertion de lignes

Un exemple :
Statement st = conn.createStatement(); int nb = st.executeUpdate( "INSERT INTO personne(Nom,Age) " + "VALUES (" + nom + ", " + age + ")" ); System.out.println(nb + " ligne(s) insre(s)"); e e st.close();

Ce principe est aussi utilisable pour les instructions UPDATE et DELETE.

3.2

Dicults ` manipuler des donnes e a e

Un exemple :
Statement st = conn.createStatement(); int nb = st.executeUpdate( "UPDATE personne " + "SET Age = " + age + " " + "WHERE Nom = " + nom + " " );

Inconvnients : solution coteuse (boucle) et dicile ` mettre en oeuvre. e u a

3.3

SQL Prformat e e

Code SQL avec partie variable :


PreparedStatement st = conn.prepareStatement( "UPDATE personne SET Age = ? " + "WHERE Nom = ? " ); for( ... ) { st.setInt(1, age[i]); st.setString(2, nom[i]); st.execute(); }

Avantages : compilation unique et param`tres binaires plus faciles ` passer. e a 6

3.4

Appel de procdures stockes en base e e

Un exemple :
CallableStatement st = conn.prepareCall( "{call ma_procedure[(?,?)]}" ); // ou {? = call nom_de_fonction[(?, ..., ?)]} // fixer le type de param`tre de sortie e st.registerOutParameter(2, java.sql.Types.FLOAT); st.setInt(1, valeur); // fixer la valeur du param`tre e st.execute(); System.out.println("rsultat = " + st.getFloat(2)); e

Avantages : - ecacit (moins de transfert de donnes), e e - compilation des procdures e Inconvnient : pas de norme ! e

3.5

Erreurs et warnings

La classe java.sql.SQLException enrichit la classe java.lang.Exception : - SQLState : description de lerreur au format XOPEN, - getNextException() La classe java.sql.SQLWarning enrichit la classe java.sql.SQLException : - getWarnings() : Warning suivant (il ralise des appels rpts). e e ee

3.6

Gestion des transactions

Le mode par dfaut est  Auto Commit  : e - connexion.setAutoCommit(false) ; - connexion.commit() ; - connexion.rollback() ;

4
4.1

Obtenir des informations sur la BD


Mta Informations sur les Result Set e

Exemple :
ResultSetMetaData m = rs.getMetaData();

Informations disponibles : - nombre de colonnes, - Libell dune colonne, e - table dorigine, - type associ ` une colonne, ea - la colonne est-elle nullable ? 7

- etc. Avantages : - code indpendant de la requte, e e - code rutilisable ! e

4.2

Mta Informations sur la B.D. e

Exemple :
DataBaseMetaData dbmd = connexion.getMetaData();

Informations disponibles : - tables existantes dans la base, - nom dutilisateur, - version du pilote, - prise en charge des jointure externes ?, - etc.

JDBC version 2.1

Contenu : - Core JDBC 2.1 : extension de java.sql, - JDBC 2.0 optional package : nouveau package javax.sql,

5.1

Nouvelle version des  Result Set 

Il existe quatre types de Result Set : Scroll-insensitive : Vision ge du rsultat de la requte au moment de son valuation. e e e e Scroll-sensitive : Le Result Set montre ltat courant des donnes (modies/dtruites). e e e e Read-only : Pas de modication possible (JDBC 1.0) donc un haut niveau de concurrence. updatable : Possibilit de modication donc pose de verrou et faible niveau de concurrence. e

5.2

Mise en oeuvre de ces  Result Set 


Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery("SELECT * FROM Personne");

Ce ResultSet est modiable mais il ne re`te pas les modications faites par dautres transactions. e

5.3

Dplacement dans un  Result Set  e

rs.first(); rs.beforeFirst();

rs.next(); rs.previous(); rs.afterLast(); rs.absolute( n ); rs.relative( n );

5.4

Modication dun  Result Set 

Modication :
rs.absolute(100); rs.updateString("Nom", "Fred"); rs.updateInt("Age", 30); rs.updateRow();

Destruction :
rs.deleteRow();

Insertion de lignes :
rs.moveToInsertRow(); rs.updateString("Nom", "Fred"); rs.updateInt("Age", 30); rs.insertRow(); rs.first();

5.5

batch updates

Regroupement de plusieurs mise ` jour : a


connexion.setAutoCommit(false); Statement st = connexion.createStatement(); st.addBatch("INSERT ..."); st.addBatch("INSERT ..."); int[] nb = st.executeBatch();

On peut combiner des  Prepared Statement  et des  Batch updates .

JDBC 3.0

Amliorations : e nouveau package javax.sql.*, Save point : pose de point de sauvegarde. Connection Pool : Gestion des ensembles de connexions partages. e 9

Support des squences (auto gnration de valeurs). e e e Augmentation et mise ` jour des types (CLOB, BLOB, rfrences SQL3). a ee Prise en compte de SQL-3.

6.1

Les DataSource

Linterface javax.sql.DataSource permet : - dobtenir une connexion JDBC, - de grer un pool de connexion, e - de faire dispara les constantes (places dans un annuaire JNDI ou un chier de conguration). tre e

6.2

Les RowSet

Lacc`s aux donnes est encapsul dans un seul Bean : e e e


javax.sql.rowset.CachedRowSet rs = new com.sun.rowset.CachedRowSetImpl(); rs.setUrl("jdbc:mysql://localhost/dbessai"); rs.setCommand("SELECT * FROM personne"); rs.setUsername("massat"); rs.setPassword("..."); rs.setConcurrency(ResultSet.CONCUR_UPDATABLE); rs.execute(); while (rs.next()) System.out.println("Nom : " + rs.getString("nom")); rs.close();

Il existe trois types de RowSet : - JDBCRowSet (bas sur JDBC), e - CachedRowSet (dconnect de la base), e e - WebRowSet (change bas sur des ux XML), e e

10