Você está na página 1de 8

Bases de donnes Multimdia Oracle Objet-relationnel et JBDC

Oracle Objet-relationnel et JBDC

JDBC pour les objets


JBDC (Java DataBase Connectivity)

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)

Ces paquetages sont inclus dans le SDK java2.

Oracle propose une API qui redfinit et tend celle de Sun.


BD Multimdia 2

Oracle Objet-relationnel et JBDC Rappel des bases

Oracle Objet-relationnel et JBDC Rappel des bases


java.sql.Driver java.sql.Connection java.sql.Statement java.sql.PreparedStatement java.sql.CallableStatement java.sql.ResultSet java.sql.DriverManager java.sql.SQLException java.sql.DataBaseMetaData java.sql.ResultSetMetaData Java.sql.SavePoint Pilotes JDBC pour la connexion aux sources de donnes SQL Construction d'ordres SQL

Les paquetages JDBC Oracle

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.

Pour JDK 1.5, ojdbc15.jar Pour JDK 1.4, ojdbc16.jar

Contenu du paquetage java.sql de JDBC (3.0)


BD Multimdia 3

BD Multimdia

Oracle Objet-relationnel et JBDC Rappel des bases

Oracle Objet-relationnel et JBDC Rappel des bases

Structure d'un programme


import java.sql.*; import oracle.jdbc.driver.*; class JDBCTest { public static void main(String args[]) throws SQLException {try { //Chargement d'un pilote JBDC // Cration d'une connexion // Ordres SQL } catch (SQLException e) {System.out.println("Erreur" + e;} }}
BD Multimdia 5

Connexion une base

Utilisation de la classe DriverManager


Chargement du pilote Mi en place Mise l de d la l connexion i

Instructions
DriverManager.registerDriver(new oracle.jdbc.driver.OrcaleDriver()); Connection conn=DriverManager.getConnection(...);

Connexion sur Butor


(si linstance de la base est ens092) jdbc:oracle:thin:@butor:1521:ens092


BD Multimdia 6

Oracle Objet-relationnel et JBDC Rappel des bases

Oracle Objet-relationnel et JBDC Rappel des bases

Mthodes de l'interface Connection


Cration d'un objet pour recevoir un ordre SQL non paramtr Pr-compilation d'un ordre SQL avec paramtres Appel d'une procdure catalogue Fixe la validation automatique Valide la transaction Invalide la transaction Ferme la connexion
BD Multimdia 7

createStatement prepareStatement(String) prepareCall(String) void setAutoCommit(boolean) void commit() void rollBack() void close()

Interfaces pour l'encapsulation d'ordres SQL en Java

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

Oracle Objet-relationnel et JBDC Rappel des bases

Oracle Objet-relationnel et JBDC Rappel des bases


ResulSet executeQuery(String)
int executeUpdate(String)

Quand un tat paramtr est cr, les paramtres sont insrs par les mthodes gnriques

Mthodes de l'interface Statement


Excute une requte et renvoie un ensemble de lignes Excute une instruction SQL (insert, update ou delete) et renvoie le nombre de lignes traites. Excute une instruction SQL. Renvoie l'objet de la connexion. Fixe le nombre max d'enregistrements extraire Nombre de lignes traites par l'ordre SQL (ou 1) Ferme l'tat
BD Multimdia 10

setXXX (num_param, valeur)

setInt, setString, ...

Il existe les mthodes inverses, inverses pour rcuprer les valeurs

getXXX

boolean execute(String) Connection getConnexion() void setMaxRows(int) int getUpdateCount() void close()

getInt, getString, ...

Et des mthodes

updateXXX depuis java vers Oracle. Mise jour de la base via un curseur java. (version 2 de JBDC)

BD Multimdia

Oracle Objet-relationnel et JBDC Rappel des bases

Oracle Objet-relationnel et JBDC Rappel des bases

Exemples

Statement st=conn.createStatement(); st.execute("INSERT INTO etudiant VALUES('123','Dupont,'Paul')"); ResultSet res= st.executeQuery("SELECT * FROM etudiant");

Un curseur de type ResultSet est par dfaut ni navigable, ni modifiable.

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)

Il est possible de le rendre navigable

Extraction des donnes du rsultat (pour ResultSet)


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

Cration dun curseur navigable et modifiable

ResultSet.TYPE_SCROLL_INSENSITIVE (navigable, non sensible aux modifications) ResultSet.TYPE_SCROLL_SENSITIVE (navigable, sensible aux modifications)

11

BD Multimdia

12

Oracle Objet-relationnel et JBDC Rappel des bases

Oracle Objet-relationnel et JBDC Rappel des bases

Il existe un ensemble de mthodes pour parcourir un curseur navigable.


Un curseur modifiable permet de mettre jour la base de donnes

setFetchDirection, getFetchDirection setFetchDirection beforeFirst, afterLast, previous, next, last, isBeforeFirst, isAfterLast, isFirst, isLast, absolute(int), relative(int)

Modification de colonnes, suppressions et insertions d'enregistrements. Valeurs du 2me paramtre de createStatement

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

Oracle Objet-relationnel et JBDC Rappel des bases

Oracle Objet-relationnel et JBDC Rappel des bases

Mthodes applicables aux curseurs modifiables


Renseigne sur la navigabilit des curseurs d'un tat Renseigne sur le caractre modifiable des curseurs d'un tat Renseigne sur la navigabilit d d'un un curseur donn Renseigne sur le caractre modifiable d'un curseur donn Supprime l'enregistrement en cours Modifie la table avec l'enregistrement courant. Dplace le curseur vers un nouvel enregistrement. Insre dans la table l'enregistrement courant Retour l'enregistrement courant (aprs insertion par exemple)
BD Multimdia 15

int getResultSetType() int getResultSetConcurrency() int getType() int getConcurrency() void deleteRow() void updateRow() void moveToInsertRow() void insertRow() void moveToCurrentRow()

Les instructions paramtres : interface PreparedStatement


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

Les mthodes de l'interface :


Oracle Objet-relationnel et JBDC Rappel des bases

Oracle Objet-relationnel et JBDC Rappel des bases

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

Extraction des donnes du rsultat (pour ResultSet)


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)

CallableStatement prepareCall(String) Paramtre de la mthode


{? = call nomFonction([?,?,...])} {call nomProcedure ([?,?,...])}


BD Multimdia 18

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

Oracle Objet-relationnel et JBDC Rappel des bases


Oracle Objet-relationnel et JBDC Rappel des bases


Exemple Appel dune fonction PL/SQL qui prend en paramtre (en lecture) une chane de caractres et retourne un entier.

create function testFunc( a IN VARCHAR2) return integer is

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 Objet-relationnel et JBDC Extensions de l'API d'Oracle

Oracle Objet-relationnel et JBDC Extensions de l'API d'Oracle

Extension de l'API d'Oracle

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).

Le paquetage oracle.jdbc comporte les classes/interfaces suivantes

OracleDriver, OracleConnection, OracleStatement, OraclePrepareStatement, OracleCallableStatement, OracleResultSet, OracleResultSetMetaData, OracleDatabaseMetaData, OracleTypes


BD Multimdia 21

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

Oracle Objet-relationnel et JBDC Mappings d'objets

Oracle Objet-relationnel et JBDC Mappings d'objets


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)

Interface Oracle STRUCT Les principales mthodes sont

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()

oracle.sql.ORAData (java.sql.SQLData) Typage fort

java.sql.Connection getJavaSQLConnection()

BD Multimdia

23

24

Oracle Objet-relationnel et JBDC Mappings d'objets

Oracle Objet-relationnel et JBDC Mappings d'objets

CREATE TYPE etudiant_type AS OBJECT


(IdE VARCHAR2(15), nom VARCHAR2(20), adresse VARCHAR2(20)); ( )); /

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 solution oracle.sql.STRUCT stEtu=rset.getSTRUCT(1);


BD Multimdia 26

Oracle Objet-relationnel et JBDC Mappings d'objets

Oracle Objet-relationnel et JBDC Mappings d'objets

Type compos : avec une adresse de type adresse_type au lieu de VARCHAR2.


OracleResultSet rset= (OracleResultSet) st.executeQuery("select value(e) from etudiant e where e.IdE='123'; while (rset.next()) {oracle.sql.STRUCT stEtu= rset.getSTRUCT(1); oracle.sql.Datum[] tabAttEtu=stEtu.getOracleAttributes(); oracle.sql.STRUCT stAdr = (STRUCT) tabAttEtu[2]; oracle.sql.Datum[] tabAttAdr=stAdr.getOracle.Attributes(); int noRue=(int) tabAttrAdr[0]; String rue=tabAttrAdr[1].toString; String ville=tabAttrAdr[2].toString; ...

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

Oracle Objet-relationnel et JBDC Mappings d'objets

Oracle Objet-relationnel et JBDC Mappings d'objets

Exemple : Mise jour d'un tudiant

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

L'utilisation des primitives de bas niveau ne

getObject : utilisation de la mthode readSQL setObject : utilisation de la mthode writeSQL.


BD Multimdia 30

BD Multimdia

29

Oracle Objet-relationnel et JBDC Mappings d'objets

Oracle Objet-relationnel et JBDC Mappings d'objets

Mthodes de l'interface java.sql.SQLData


Etapes de mise en place du mapping

String getSQLTypeName() void readSQL(SQLInput stream, stream String type_name)

Cration du type de mapping associ la connexion

Utilisation de java.util.Map

Implmente l'objet java partir de la base

Implmentation de la mthode readSQL de l'interface SQLData

Extraction par getObject

void writeSQL(SQLOutput stream)

Implmente l'objet de la base partir de l'objet java


BD Multimdia

Implmentation de la mthode writeSQL de l'interface SQLData

Mise jour par setObject

31

BD Multimdia

32

Oracle Objet-relationnel et JBDC Mappings d'objets


Dfinition de la classe java Etudiant qui implmente l'interface SQLData import j java.sql.*; public class etudiant implements SQLData

Oracle Objet-relationnel et JBDC Mappings d'objets


// 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

Oracle Objet-relationnel et JBDC Mappings d'objets


Oracle Objet-relationnel et JBDC Mappings d'objets

// mthode writeSQL public void writeSQL(SQLOutput stream) Q p { throws SQLException


stream.writeString(idE); stream.writeString(nom); stream.writeString(adresse); } }
BD Multimdia 35

Chargement d'un objet java

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

Oracle Objet-relationnel et JBDC Mappings d'objets

Oracle Objet-relationnel et JBDC Mappings d'objets


try { Connection conn= DriverManager.getConnection(...); java.util.Map j p maMap p =conn.getTypeMap(); g yp p(); PreparedStatement st=conn.prepareStatement("insert into etudiant values(?)"); Etudiant e=new etudiant(); e.idE="124"; e.nom="durand", e.adresse="dijon"; st.setObject(1,e); ps.executeUpdate(); } catch ...
37 BD Multimdia 38

Stockage d'un objet java (writeSQL)

}} catch ...
BD Multimdia

Oracle Objet-relationnel et JBDC Gestion des rfrences

Oracle Objet-relationnel et JBDC Gestion des rfrences

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 :

CREATE TYPE conseil_type as object


(idC integer, nomC varchar2(20));

CREATE p personne_type yp as object j


(idP integer, nomP varchar2(20), membreC REF conseil_type);

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.

Implmentation de l'interface SQLData

Avec dfinition des mthodes readSQL et writeSQL


BD Multimdia 40

BD Multimdia

39

Oracle Objet-relationnel et JBDC Gestion des rfrences

Oracle Objet-relationnel et JBDC Gestion des rfrences

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);

Mise jour d'une rfrence

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

Oracle Objet-relationnel et JBDC Gestion des collections

Oracle Objet-relationnel et JBDC Gestion des collections

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

setArray ou setARRAY getArray ou getARRAY.

CREATE TYPE document_type as table of varchar2(20);/ CREATE TABLE expose as objet


(nomE varchar2(20), docs document_type) nested table docs store as tabdocs;

Les mthodes de l'interface java.sql.Array sont :


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

Extraction de la collection simple

Utilisation de getArray
BD Multimdia 44

Oracle Objet-relationnel et JBDC Gestion des collections

Oracle Objet-relationnel et JBDC Gestion des collections


Affichage des lments d'une collection (extraction)


ResultSet rset = st.executeQuery("select ex.nomE, ex.docs from expose ex"); while ( (rset.next()) ()) {sop(rset.getString(1)); Array ar =(Array) rset.getArray(2); ResultSet docsSet=ar.getResultSet(); while (docsSet.next()) System.out.println( docsSet.getString(1)); ...}

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

Oracle Objet-relationnel et JBDC Gestion des collections

Oracle Objet-relationnel et JBDC JPublisher

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

JPublisher est un outil de l'offre Oracle crit en java

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

Você também pode gostar