Академический Документы
Профессиональный Документы
Культура Документы
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
rseau JDBC
S.G.B.D.
Client lger
1.3
EJB JDBC
EJB
EJB
Clients lgers
Traitements
Stockage
1.4
Architecture Logicielle
Application
Driver Manager
Pilote MySQL
Pilote Oracle
Pilote SyBase
Interface Pilote
1.5
Type I
S.G.B.D.
Type II
S.G.B.D.
API
Type III
Client B.D.
S.G.B.D.
Type IV
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 }
2.2
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
2.4
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
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
2.8
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();
3.2
Un exemple :
Statement st = conn.createStatement(); int nb = st.executeUpdate( "UPDATE personne " + "SET Age = " + age + " " + "WHERE Nom = " + nom + " " );
3.3
SQL Prformat e e
3.4
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
4
4.1
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
4.2
Exemple :
DataBaseMetaData dbmd = connexion.getMetaData();
Informations disponibles : - tables existantes dans la base, - nom dutilisateur, - version du pilote, - prise en charge des jointure externes ?, - etc.
Contenu : - Core JDBC 2.1 : extension de java.sql, - JDBC 2.0 optional package : nouveau package javax.sql,
5.1
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
Ce ResultSet est modiable mais il ne re`te pas les modications faites par dautres transactions. e
5.3
rs.first(); rs.beforeFirst();
5.4
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
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
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