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 [Link]; [Link]; [Link]; [Link]; [Link]; // // // // // 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 [Link] 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 { [Link]("[Link]"); }
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 = [Link](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://[Link]/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 = [Link](); String query = "SELECT nom,prenom,age FROM personne ORDER BY age"; ResultSet rs = [Link](query); while ([Link]()) { [Link]("%-20s | %-20s | %3d\n", // [Link](1), [Link]("prenom"), [Link](3)); } } finally { // close result, statement and connection if (conn != null) [Link](); } }
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 { [Link](); [Link](); ... } catch (ClassNotFoundException e) { [Link]("Pilote JDBC introuvable !"); } catch (SQLException e) { [Link]("SQLException: " + [Link]()); [Link]("SQLState: " + [Link]()); [Link]("VendorError: " + [Link]()); [Link](); } }
2.6
Linterface [Link]
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 [Link] [Link] 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 [Link] [Link] [Link]
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 = [Link](); int nb = [Link]( "INSERT INTO personne(Nom,Age) " + "VALUES (" + nom + ", " + age + ")" ); [Link](nb + " ligne(s) insre(s)"); e e [Link]();
Ce principe est aussi utilisable pour les instructions UPDATE et DELETE.
3.2
Dicults ` manipuler des donnes e a e
Un exemple :
Statement st = [Link](); int nb = [Link]( "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 = [Link]( "UPDATE personne SET Age = ? " + "WHERE Nom = ? " ); for( ... ) { [Link](1, age[i]); [Link](2, nom[i]); [Link](); }
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 = [Link]( "{call ma_procedure[(?,?)]}" ); // ou {? = call nom_de_fonction[(?, ..., ?)]} // fixer le type de param`tre de sortie e [Link](2, [Link]); [Link](1, valeur); // fixer la valeur du param`tre e [Link](); [Link]("rsultat = " + [Link](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 [Link] enrichit la classe [Link] : - SQLState : description de lerreur au format XOPEN, - getNextException() La classe [Link] enrichit la classe [Link] : - getWarnings() : Warning suivant (il ralise des appels rpts). e e ee
3.6
Gestion des transactions
Le mode par dfaut est Auto Commit : e - [Link](false) ; - [Link]() ; - [Link]() ;
4
4.1
Obtenir des informations sur la BD
Mta Informations sur les Result Set e
Exemple :
ResultSetMetaData m = [Link]();
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 = [Link]();
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 [Link], - JDBC 2.0 optional package : nouveau package [Link],
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 = [Link]( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = [Link]("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
[Link](); [Link]();
[Link](); [Link](); [Link](); [Link]( n ); [Link]( n );
5.4
Modication dun Result Set
Modication :
[Link](100); [Link]("Nom", "Fred"); [Link]("Age", 30); [Link]();
Destruction :
[Link]();
Insertion de lignes :
[Link](); [Link]("Nom", "Fred"); [Link]("Age", 30); [Link](); [Link]();
5.5
batch updates
Regroupement de plusieurs mise ` jour : a
[Link](false); Statement st = [Link](); [Link]("INSERT ..."); [Link]("INSERT ..."); int[] nb = [Link]();
On peut combiner des Prepared Statement et des Batch updates .
JDBC 3.0
Amliorations : e nouveau package [Link].*, 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 [Link] 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
[Link] rs = new [Link](); [Link]("jdbc:mysql://localhost/dbessai"); [Link]("SELECT * FROM personne"); [Link]("massat"); [Link]("..."); [Link](ResultSet.CONCUR_UPDATABLE); [Link](); while ([Link]()) [Link]("Nom : " + [Link]("nom")); [Link]();
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