JDBC
JDBC
JDBC
Rappel des bases de jdbc Extension de l'API l API d d'Oracle Oracle Mappings des objets Gestion des rfrences Gestion des collections Les outils : JPublisher
BD Multimdia
A t dvelopp par Sun pour un accs standardis toute source de donnes compatible SQL, un programme java. La version 3.0 3 0 de l'API JDBC comporte des classes et des interfaces dans les paquetages
java.sql (gestion des connexions, transmission des requtes et traitement des rsultats) javax.sql (ct serveur)
Pour JDK 1.2 1 2 et JDK 1.3, 1 3 il faut inclure le paquetage classes12.jar Pour JDK 1.4, ojdbc14.jar
Gestion des rsultats des requtes Gestion des pilotes de connexion Gestion des erreurs SQL Gestion des mta-informations (description de la base de donne, des tables, etc.) Gestion des transactions.
BD Multimdia
Instructions
DriverManager.registerDriver(new oracle.jdbc.driver.OrcaleDriver()); Connection conn=DriverManager.getConnection(...);
createStatement prepareStatement(String) prepareCall(String) void setAutoCommit(boolean) void commit() void rollBack() void close()
Statement : pour les ordres SQL statiques. Cet tat est construit par la mthode createStatement applique la connexion. PreparedStatement pour les ordres paramtrs SQL, construits par prepareStatement sur la connexion. CallableStatement pour les procdures ou fonctions catalogues PL/SQL, C, java, etc., construit par la mthode prepareCall sur la connexion.
BD Multimdia 8
Quand un tat paramtr est cr, les paramtres sont insrs par les mthodes gnriques
getXXX
boolean execute(String) Connection getConnexion() void setMaxRows(int) int getUpdateCount() void close()
Et des mthodes
updateXXX depuis java vers Oracle. Mise jour de la base via un curseur java. (version 2 de JBDC)
BD Multimdia
Exemples
Statement st=conn.createStatement(); st.execute("INSERT INTO etudiant VALUES('123','Dupont,'Paul')"); ResultSet res= st.executeQuery("SELECT * FROM etudiant");
Uniquement du dbut la fin par next() Dplacement avant, avant arrire, arrire depuis le dbut, dbut la fin ou la position courante La base peut tre modifie par le curseur. Statement createStatement (int typeCur, int modifCur)
Et modifiable
Parcours : boolean next() Fermeture du curseur : void close Rcupration des valeurs : getXXX(int) Modification de l'enregistrement : updateXXX(...) Mtadonnes : ResultSetMetaData getMetaData()
BD Multimdia
ResultSet.TYPE_SCROLL_INSENSITIVE (navigable, non sensible aux modifications) ResultSet.TYPE_SCROLL_SENSITIVE (navigable, sensible aux modifications)
11
BD Multimdia
12
setFetchDirection, getFetchDirection setFetchDirection beforeFirst, afterLast, previous, next, last, isBeforeFirst, isAfterLast, isFirst, isLast, absolute(int), relative(int)
ResultSet.CONCUR_READ_ONLY, ResultSet.CONCUR_UPDATABLE
Pour utiliser un curseur de type modifiable, il ne faut avoir ni de jointure, ni de regroupement dans la requte SELECT.
BD Multimdia 14
BD Multimdia
13
int getResultSetType() int getResultSetConcurrency() int getType() int getConcurrency() void deleteRow() void updateRow() void moveToInsertRow() void insertRow() void moveToCurrentRow()
Les paramtres sont indiqus par le symbole ? Les valeurs sont affectes par les mthodes setXXX ResultSet executeQuery(), int executeUpdate () pour INSERT, UPDATE ou DELETE -> nombre de lignes traites boolean execute() void close()
BD Multimdia 16
Exemple
Appel de sous-programmes
PreparedStatement pst=conn.prepareStatement("SELECT * FROM etudiant where idE=? "); pst setInt(1 100); pst.setInt(1,100); ResultSet res= st.executeQuery();
L'interface CallableStatement permet d'appeler des sous-programmes p g (fonctions ( ou procdures p PL/SQL, java, C, etc.) Cration des tats par prepareCall
Parcours : boolean next() Fermeture du curseur : void close Rcupration des valeurs : getXXX(int)
BD Multimdia
17
Les paramtres d'entre sont affects par les mthodes setXXX Les paramtres de sortie sont extraits par les mthodes getXXX. Lorsque l l'tat tat est cr, il faut : rpertorier le type des paramtres de sortie
mthode RegisterOutParameter(int,int)
passer les paramtres d'entre, appeler le sous-programme, analyser les rsultats. Les mthodes sont similaires PreparedStatement except la mthode ci-dessus.
CallableStatement stmt= conn.prepareCall("{? = call testFunc(?)}"); stmt.registerOutParameter(1, Types.INTEGER); stmt.setString(2, "test "); int i=stmt.getInt(1);
19 BD Multimdia 20
BD Multimdia
Oracle fournit deux implmentations de l'API JDBC de Sun qui incluent les paquetages :
Le paquetage oracle.sql
oracle.sql et oracle.jdbc
Il faut aussi inclure le paquetage nls nls_charset12.jar charset12 jar (JDK 1.4)
Il permet d'accder directement des donnes au format SQL Q (types ( yp reconnus dans la base).
oracle.sql.STRUCT (pour les objets structurs) oracle.sql.REF (pour les rfrences) oracle.sql.ARRAY (pour les tableaux) oracle.sql.CHAR, oracle.sql.DATE, oracle.sql.NUMBER, oracle.sql.ROWID
BD Multimdia 22
Mcanismes pour faire correspondre des objets d'Oracle (persistants) avec des objets java (non persistants). Les objets stocks dans la base peuvent tre manipuls l l'aide aide des interfaces oracle oracle.sql.STRUCT sql STRUCT (java (java.sql.Struct) sql Struct)
oracle.sql.Datum[] getOracleAttributes()
Typage faible
P Pour rcuprer l les attributs tt ib t d du t type SQL Pour rcuprer le nom du type Pour rcuprer le descripteur du type Retourne la connexion courante
BD Multimdia
String getSQLTypeName()
ou bien, il est possible de construire des types personnaliss avec les interfaces
oracle.sql.StructDescriptor getDescriptor()
java.sql.Connection getJavaSQLConnection()
BD Multimdia
23
24
API Oracle
OracleResultSet rset= (OracleResultSet) st.executeQuery("select value(e) from etudiant e where e.IdE='123'; while (rset.next()) {oracle.sql.Datum d= rset.getOracleObjet(1)); oracle.sql.STRUCT stEtu=(oracle.sql.STRUCT) d; oracle.sql.Datum[] tabAtt=stEtu.getOracleAttributes(); }
CREATE TABLE etudiant of etudiant_type; INSERT INTO etudiant VALUES ('123', 'DUPONT', 'Dijon');
BD Multimdia 25
Autre exemple
(avec adresse en VARCHAR2) OracleResultSet rset= (OracleResultSet) st.executeQuery("select e.IdE, e.nom, e.adresse from etudiant e where e e.IdE= IdE='123'; 123 ; while (rset.next()) { int id=rset.getInt(1); String n=rset.getString(2); String ad=reset.getString(3);
...
}
BD Multimdia 27
}
BD Multimdia 28
PreparedStatement ps = conn.prepareStatement("UPDATE p p ( etudiant set adresse=? where idE=?"); ps.setString(1,'Dijon'); ps.setString(2,'123'); ps.execute();
permet pas une gestion automatise aise des objets java. Il est possible de faire des correspondances (typage fort) avec les interfaces java.sql.SQLData ou oracle.sql.ORAData. java.sql.SQLData est plus portable. Le chargement et la mise jour d'un objet java se fait par les mthodes
BD Multimdia
29
Utilisation de java.util.Map
31
BD Multimdia
32
// mthode readSQL public void readSQL(SQLInput stream , g typeName) yp ) throws SQLException Q p { String
sql_type = typeName; idE = stream.readString(); nom = stream.readString(); adresse = stream.readString(); }
String sql_type; public String idE , nom, adresse; public etudiant() {} public String getSQLTypeName() throws SQLException {return "etudiant_type"; }
BD Multimdia 33
BD Multimdia
34
La dfinition de la correspondance est faite l'aide de l'interface Map, p, associe la connexion. La mthode getMapType renvoie l'objet de correspondance associ la connexion. La mthode put permet d'associer une classe java un type SQL.
BD Multimdia 36
try { Connection conn= DriverManager.getConnection(...); java.util.Map maMap =conn.getTypeMap(); maMap.put("etudiant_type",Class.forName("Etudiant"); Statement st=conn.createStatement(); ResultSet l rset=st.executeQuery("select (" l value(e) l ( ) from f etudiant d e"); ") while (rset.next()) {
Etudiant etu = rset.getObject(1,maMap); System.out.println(etu.idE+" "+etu.nom+" " etu.adresse); } rset.close(); st.close();
}} catch ...
BD Multimdia
Les rfrences peuvent manipules par les API java.sql.Ref ou oracle.sql.REF qui offre plus de fonctionnalits. Les mthodes d'accs getRef(int) ou getREF(int) pour oracle permettent d'extraire une rfrence dans un objet ResultSet ou O l R OracleResultSet. ltS t On peut aussi utiliser les mthodes setRef(int) ou setREF(int) pour passer en paramtre une rfrence un objet paramtr. Les mthodes de l'interface oracle.sql.REF :
String getBaseTypeName() -> nom du type SQL de la cible de la rfrence Object getValue() -> extrait l'objet cible de la rfrence void setValue(Objet) -> affecte l'objet cible de la rfrence
On suppose que la classe "Conseil" java correspondant au type conseil_type est dfinie.
BD Multimdia
39
Code java pour afficher les objets rfrencs par membreC dans la table personne.
java.util.Map map=conn.getTypeMap(); map put("conseil map.put( conseil_type type",Class.forNAme( Class forNAme("conseil")); conseil )); OracleResultSet rset = (..) st.executeQuery("select p.membreC from personne p;"); while (rset.next())
oracle.sql.REF refC = rset.getREF(1); Conseil cs=refC.getValue(); System.out.println(cs.getBaseTypeName() +cs.nomC);
Le principe est identique mais il faut utiliser la mthode setREF (ou setRef),
...
BD Multimdia
OracleResultSet rset = (..) st.executeQuery("select ref(c) from conseil c where c.idC=1"); oracle.sql.REF refC=rset.getREF(1); PreparedStatement ps = (..) conn.prepareStatement("update personne p set p.membreC =? where idP=23"); ps.setREF(1,refC); ps.excuteUpdate(); ...
41 BD Multimdia 42
Les interfaces java.sql.Array et oracle.sql.ARRAY permettent de manipuler des collections sous formes de tableaux ou de curseurs (ResultSet). Ces collections sont extraites ou passes en paramtres par
Object getArray(int) -> renvoie la collection Objetc getArray(Map) -> mme mthode mais avec un mapping String getBaseTypeName() renvoie le nom du type cible de la rfrence ResultSet getResultSet() renvoie un curseur java ResultSet getResultSet(Map) renvoie un curseur java avec un mapping
BD Multimdia 43
Utilisation de getArray
BD Multimdia 44
Mise jour d'une collection L'interface ArrayDescriptor permet de crer un objet d ARRAY. Descriptions p des mthodes de l'interface oracle.sql.ArrayDescriptor q y p
createDescriptor(String, Connection) -> constructeur int getBaseType() -> code du type associ au descripteur (atomique, STRUCT ou REF) int getArrayType() -> nature de la collection (varray ou nested_table) int getMaxLength -> nombre max de la collection pour varray (0 pour nested table) Connection getJavaSQLConnection() -> instance de connexion utilise lors de la cration du descripteur.
BD Multimdia
BD Multimdia
45
46
Mise jour de l'attributs docs (nested table) de la table expose pour l'expose de nom 'expose1'
String nvDoc[]={"journal" nvDoc[] { journal , "revue" revue , "magazine"}; magazine }; oracle.sql.ArrayDescriptor desar=ArrayDescriptor("document_type", conn); oracle.sql.ARRAY ar =new ARRAY(desar, conn, nvDoc); PreparedStatement ps=conn.prepareStatement("Update expose set docs = ? where nomE='expose1' "); ((OraclePreparedStatement) ps).setARRAY(1, ar); ((OraclePreparedStatement) ps).executeUpdate();
BD Multimdia
Qui permet de gnrer des classes (.java) pour prparer la programmation de mappings entre les objets de la base et les objets de l'application. Ces classes sont dduites partir des types SQL (objets (objets, rfrences, collections nested table ou varray) du schma Oracle. Principe :
Crer des types sous Oracle, Gnrer des classes avec JPublisher et les utiliser dans des paquetages applicatifs si ncessaire Importer ces classes dans l'application gnrale et utiliser les mthodes de classes gnres Compiler toutes les classes et excuter l'application.
BD Multimdia
47
48