Bases de données Multimédia Oracle Objet-relationnel et JBDC

Documents pareils
Java DataBaseConnectivity

Introduction à JDBC. Accès aux bases de données en Java

TP Programmation Java / JDBC / Oracle

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

Accès aux bases de données

Programmation d application Bases de données avec Java

OpenPaaS Le réseau social d'entreprise

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

JDBC le langage Java XVI-1 JMF

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

JDBC JDBC. Java DataBase Connectivity

Java et les bases de données

Java Database Connectivity (JDBC) - Langage SQL

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Développement d applications avec les bases de données

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

1. Langage de programmation Java

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Dialogue avec la base de données

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Java - MySQL. Code: java-mysql

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

[BASE DE DONNEES MULTIMEDIA]

Paradox 9. Guide de l utilisateur jpdox Web Utilities

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Application web de gestion de comptes en banques

Corrigé des exercices sur les références

1. Base de données SQLite

CREATION WEB DYNAMIQUE

A QUOI SERVENT LES BASES DE DONNÉES?

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Java Licence Professionnelle CISII,

Bases de Données relationnelles et leurs systèmes de Gestion

Construire une base de donnée pour bibliothèque

Java 1.5 : principales nouveautés

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Tutoriel d installation de Hibernate avec Eclipse

PDO : PHP Data Object 1/13

RMI le langage Java XII-1 JMF

Création d une application JEE

MySQL avec Mac OS X. Quelques manipulations avec le terminal sont nécessaires si une version de MySQL est déjà lancée:

Cours Bases de données 2ème année IUT

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Exploitation de bases de données relationnelles et orientées objet IFT287

Programmation Objet Java Correction

Programme Compte bancaire (code)

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Bases de données avancées

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Compte-rendu de projet de Système de gestion de base de données

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Le Langage SQL version Oracle

Chapitre 10. Les interfaces Comparable et Comparator 1

Applet pour visualiser les variables «automate» notifiées

Création d objet imbriqué sous PowerShell.

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Package Java.util Classe générique

La base de données XML exist. A. Belaïd

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Les bases de données

Mise en oeuvre d'une base de données mono-utilisateur avec SQLite

PHP 5. La base de données MySql. A. Belaïd 1

Création et Gestion des tables

Programmation par les Objets en Java

JAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.

SQL Historique

Bases de données relationnelles

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Programmation en Java IUT GEII (MC-II1) 1

Les BASES de DONNEES dans WampServer

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Plan. Accès aux données dans le framework.net. ADO.NET Entity Framework LINQ ADO.NET ADO.NET. 1. ADO.NET Mode connecté Mode non connecté

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Olivier Mondet

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Connectivité aux bases de données Java (JDBC)

TP Contraintes - Triggers

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

FileMaker 10. Guide ODBC et JDBC

CONCOURS DE L AGRÉGATION INTERNE «ÉCONOMIE ET GESTION» SESSION 2015 SECONDE ÉPREUVE

Programmation Par Objets

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Remote Method Invocation (RMI)

Une introduction à Java

Synchro et Threads Java TM

Flux de données Lecture/Ecriture Fichiers

Programmer en JAVA. par Tama

Implémentation des SGBD

Hala Skaf-Molli. Nancy-Université 14 mai 2007

Transcription:

Bases de données Multimédia JDBC pour les objets de jdbc API Oracle (jdbc sql) Mappings des objets Gestion des références Les outils : JPublisher JDBC (Java DataBase Connectivity) JDBC fournit un accès à des données de différentes sources ( bases de données) à partir d un programme java. L'API JDBC comporte des classes et des interfaces dans les paquetages java.sql (gestion des connexions, transmission des requêtes et traitement des résultats) javax.sql (côté serveur) Ces paquetages sont inclus dans la plate-forme Java Standard Edition (Java SE). Oracle propose également une API pour jdbc 1 2 Interfaces/Classes API spécifiques JBDC Oracle Oracle 11g ojbdc6.jar (avec jdk6, jdk7 et jdk8) Oracle 12c : ojdbc7.jar (avec jdk7 et jdk8) http://www.oracle.com/technetwork/database/features/jdbc/jdbc-drivers-12c-download-1958347.html Contenu du paquetage java.sql de JDBC (3.0) java.sql.driver java.sql.connection java.sql.statement java.sql.preparedstatement java.sql.callablestatement java.sql.resultset java.sql.drivermanager (Classe) java.sql.sqlexception (Classe) java.sql.databasemetadata java.sql.resultsetmetadata Java.sql.SavePoint Pilotes JDBC pour la connexion aux sources de données SQL Construction d'ordres SQL Gestion des résultats des requêtes Gestion des pilotes de connexion Gestion des erreurs SQL Gestion des méta-informations (description de la base de donnée, des tables, etc.) Gestion des transactions. 3 4 Structure d'un programme import java.sql.*; import oracle.jdbc.driver.*; public class JDBCTest { public static void main(string args[]) throws SQLException {try { //Chargement d'un pilote JBDC // Création d'une connexion // Ordres SQL catch (SQLException e) {System.out.println("Erreur" + e; Connexion à une base Utilisation de la classe DriverManager Chargement du pilote Mise en place de la connexion Instructions DriverManager.registerDriver(new oracle.jdbc.driver.orcaledriver()); Connection conn=drivermanager.getconnection(...); Connexion sur Butor (si l instance de la base est ensb2017) jdbc:oracle:thin:@butor:1521:ensb2017 5 6 1

Méthodes de l'interface Connection createstatement preparestatement(string) preparecall(string) void setautocommit(boolean) void commit() void rollback() void close() Création d'un objet pour recevoir un ordre SQL non paramétré Pré-compilation d'un ordre SQL avec paramètres Appel d'une procédure cataloguée Fixe la validation automatique Valide la transaction Invalide la transaction Ferme la connexion 7 Interfaces pour l'encapsulation d'ordres SQL en Java Statement : pour les ordres SQL statiques. Cet état est construit par la méthode createstatement appliquée à la connexion. PreparedStatement pour les ordres paramétrés SQL, construits par preparestatement sur la connexion. CallableStatement pour les procédures ou fonctions cataloguées PL/SQL, C, java, etc., construit par la méthode preparecall sur la connexion. 8 Quand un état paramétré est créé, les paramètres sont insérés par les méthodes génériques setxxx (num_param, valeur) setint, setstring,... Il existe les méthodes inverses, pour récupérer les valeurs getxxx getint, getstring,... Et des méthodes updatexxx depuis java vers Oracle. Mise à jour de la base via un curseur java. Méthodes de l'interface Statement ResulSet executequery(string) int executeupdate(string) boolean execute(string) Connection getconnexion() void setmaxrows(int) int getupdatecount() void close() Exécute une requête et renvoie un ensemble de lignes Exécute une instruction SQL (insert, update ou delete) et renvoie le nombre de lignes traitées. Exécute une instruction SQL. Renvoie l'objet de la connexion. Fixe le nombre max d'enregistrements à extraire Nombre de lignes traitées par l'ordre SQL (ou 1) Ferme l'état 9 10 Exemples Statement st=conn.createstatement(); st.execute("insert INTO etudiant VALUES('123','Dupont,'Paul')"); ResultSet res= st.executequery("select * FROM etudiant"); Extraction des données du résultat (pour ResultSet) Parcours : boolean next() Fermeture du curseur : void close Récupération des valeurs : getxxx(int) Modification de l'enregistrement : updatexxx(...) Métadonnées : ResultSetMetaData getmetadata() Un curseur de type ResultSet est par défaut ni navigable, ni modifiable. Uniquement du début à la fin par next() Il est possible de le rendre navigable Déplacement avant, arrière, depuis le début, la fin ou la position courante Et modifiable La base peut être modifiée par le curseur. Création d un curseur navigable et modifiable Statement createstatement (int typecur, int modifcur) ResultSet.TYPE_SCROLL_INSENSITIVE (navigable, non sensible aux modifications) ResultSet.TYPE_SCROLL_SENSITIVE (navigable, sensible aux modifications) 11 12 2

Il existe un ensemble de méthodes pour parcourir un curseur navigable. setfetchdirection, getfetchdirection beforefirst, afterlast, previous, next, last, isbeforefirst, isafterlast, isfirst, islast, absolute(int), relative(int) Un curseur modifiable permet de mettre à jour la base de données Modification de colonnes, suppressions et insertions d'enregistrements. Valeurs du 2 ème paramètre 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 requête SELECT. Méthodes de l interface «Statement» int getresultsettype() Renseigne sur la navigabilité des curseurs d'un état int getresultsetconcurrency() Renseigne sur le caractère modifiable des curseurs d'un état 13 14 Méthodes applicables aux curseurs modifiables de l interface «ResultSet» int gettype() int getconcurrency() void deleterow() void updaterow() void movetoinsertrow() void insertrow() void movetocurrentrow() Renseigne sur la navigabilité d'un curseur donné Renseigne sur le caractère modifiable d'un curseur donné Supprime l'enregistrement en cours Modifie la table avec l'enregistrement courant. Déplace le curseur vers un nouvel enregistrement. Insère dans la table l'enregistrement courant Retour à l'enregistrement courant (après insertion par exemple) Les instructions paramétrées : interface PreparedStatement Les paramètres sont indiqués par le symbole? Les valeurs sont affectées par les méthodes setxxx Les méthodes de l'interface : ResultSet executequery(), int executeupdate () pour INSERT, UPDATE ou DELETE -> nombre de lignes traitées boolean execute() void close() 15 16 Exemple PreparedStatement pst=conn.preparestatement("select * FROM etudiant where ide=? "); pst.setint(1,100); ResultSet res= pst.executequery(); Extraction des données du résultat (pour ResultSet) Parcours : boolean next() Fermeture du curseur : void close Récupération des valeurs : getxxx(int) Appel de sous-programmes L'interface CallableStatement permet d'appeler des sous-programmes (fonctions ou procédures PL/SQL, java, C, etc.) Création des états par preparecall CallableStatement preparecall(string) Paramètre de la méthode {? = call nomfonction([?,?,...]) {call nomprocedure ([?,?,...]) 17 18 3

Les paramètres d'entrée sont affectés par les méthodes setxxx Les paramètres de sortie sont extraits par les méthodes getxxx. Lorsque l'état est créé, il faut : répertorier le type des paramètres de sortie méthode RegisterOutParameter(int,int) passer les paramètres d'entrée, appeler le sous-programme, analyser les résultats. Les méthodes sont similaires à PreparedStatement excepté la méthode ci-dessus. 19 Exemple Appel d une fonction PL/SQL qui prend en paramètre (en lecture) une chaîne de caractères et retourne un entier. create function testfunc( a IN VARCHAR2) return integer is CallableStatement stmt= conn.preparecall("{? = call testfunc(?)"); stmt.registeroutparameter(1, Types.INTEGER); stmt.setstring(2, "test "); int i=stmt.getint(1); 20 API Oracle (jdbc sql) API Oracle Oracle fournit une implémentation (ojdbc7.jar pour Oracle 12c) de l'api qui inclut les paquetages : oracle.sql et oracle.jdbc Il faut aussi inclure le paquetage nls_charset12.jar (selon la version de JDK) pour les drivers «thin» et «oci» Le paquetage oracle.jdbc comporte les classes/interfaces suivantes OracleDriver, OracleConnection, OracleStatement, OraclePrepareStatement, OracleCallableStatement, OracleResultSet, OracleResultSetMetaData, OracleDatabaseMetaData, OracleTypes Extensions de l'api d'oracle Le paquetage Oracle.sql Il permet d'accéder directement à des données au format SQL (types reconnus dans la base). oracle.sql.char, oracle.sql.date, oracle.sql.number, etc. oracle.sql.struct (pour les objets structurés) oracle.sql.ref (pour les références) oracle.sql.array (pour les tableaux) 21 22 CREATE TYPE etudiant_type AS OBJECT (IdE VARCHAR(15), nom VARCHAR(20), adresse VARCHAR(100)); / CREATE TABLE etudiant of etudiant_type; INSERT INTO etudiant VALUES ('123', 'DUPONT', 'Dijon'); 23 Exemple : Récupération des résultats d une requête OracleResultSet rset= (OracleResultSet) st.executequery("select e.ide, e.nom, e.adresse from etudiant e where e.ide='123'; { int id=rset.getint(1); String n=rset.getstring(2); String ad=reset.getstring(3);... 24 4

Exemple : Mise à jour d'un étudiant OraclePreparedStatement ps = conn.preparestatement("update etudiant set adresse=? where ide=?"); ps.setstring(1,'dijon'); ps.setstring(2,'123'); ps.execute(); Mécanismes pour faire correspondre des objets d'oracle (persistants) avec des objets java (non persistants). Les objets stockés dans la base peuvent être manipulés à l'aide des interfaces oracle.sql.struct pour l API Oracle ou java.sql.struct pour l API java. Typage faible ou bien, il est possible de construire des types personnalisés avec les interfaces Typage fort À l aide de oracle.sql.oradata pour l API Oracle ou java.sql.sqldata pour l API java. 25 26 Interface Oracle STRUCT Les principales méthodes sont oracle.sql.datum[] getoracleattributes() Pour récupérer les attributs du type SQL String getsqltypename() Pour récupérer le nom du type oracle.sql.structdescriptor getdescriptor() Pour récupérer le descripteur du type java.sql.oracleconnection getoracleconnection() Retourne la connexion «Oracle» courante CREATE TYPE adresse_type as object (numero INTEGER, rue VARCHAR(50), ville VARCHAR(50)); / CREATE TYPE etudiant_type AS OBJECT (IdE VARCHAR(15), nom VARCHAR(20), adresse adresse_type); / CREATE TABLE etudiant of etudiant_type; INSERT INTO etudiant VALUES ('123', 'DUPONT', 'Dijon'); 27 28 API Oracle OracleResultSet rset= (OracleResultSet) st.executequery("select value(e) from etudiant e where e.ide='123'; { oracle.sql.struct stetu=rset.getstruct(1); oracle.sql.datum[] tabatt=stetu.getoracleattributes(); La classe oracle.sql.datum est une sous-classe de la classe java.lang.object. Il est aussi possible d écrire : Object[] tabatt=stetu.getoracleattributes(); 29 Type composé : avec une adresse de type adresse_type OracleResultSet rset= (OracleResultSet) st.executequery("select value(e) from etudiant e where e.ide='123'; {oracle.sql.struct stetu= rset.getstruct(1); oracle.sql.datum[] tabattetu=stetu.getoracleattributes(); String nom = tabattetu[1]; 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;... 30 5

L'utilisation des primitives de bas niveau ne permet pas une gestion automatisée aisée 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 méthodes getobject : utilisation de la méthode readsql setobject : utilisation de la méthode writesql. Méthodes de l'interface java.sql.sqldata String getsqltypename() void readsql(sqlinput stream, String type_name) Implémente l'objet java à partir de la base void writesql(sqloutput stream) Implémente l'objet de la base à partir de l'objet java 31 32 Etapes de mise en place du mapping Création du type de mapping associé à la connexion Utilisation de java.util.map Implémentation de la méthode readsql de l'interface SQLData Extraction par getobject Implémentation de la méthode writesql de l'interface SQLData Mise à jour par setobject 33 Définition de la classe java Etudiant qui implémente l'interface SQLData import java.sql.*; public class etudiant implements SQLData { String sql_type; public String ide, nom, adresse; public etudiant() { public String getsqltypename() throws SQLException {return "etudiant_type"; 34 // méthode readsql public void readsql(sqlinput stream, String typename) throws SQLException { sql_type = typename; ide = stream.readstring(); nom = stream.readstring(); adresse = stream.readstring(); // méthode writesql public void writesql(sqloutput stream) throws SQLException { stream.writestring(ide); stream.writestring(nom); stream.writestring(adresse); 35 36 6

Chargement d'un objet java La définition de la correspondance est faite à l'aide de l'interface Map, associée à la connexion. La méthode getmaptype renvoie l'objet de correspondance associé à la connexion. La méthode put permet d'associer une classe java à un type SQL. 37 try { Connection conn= DriverManager.getConnection(...); java.util.map mamap =conn.gettypemap(); mamap.put("etudiant_type",class.forname("etudiant"); Statement st=conn.createstatement(); ResultSet rset=st.executequery("select value(e) from etudiant e"); { Etudiant etu = rset.getobject(1,mamap); System.out.println(etu.idE+" "+etu.nom+" " etu.adresse); rset.close(); st.close(); catch... 38 Stockage d'un objet java (writesql) try { Connection conn= DriverManager.getConnection(...); java.util.map mamap =conn.gettypemap(); 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... Gestion des références Les références peuvent manipulées par les API java.sql.ref ou oracle.sql.ref qui offre plus de fonctionnalités. Les méthodes d'accès getref(int) ou getref(int) pour oracle permettent d'extraire une référence dans un objet ResultSet ou OracleResultSet. On peut aussi utiliser les méthodes setref(int) ou setref(int) pour passer en paramètre une référence à un objet paramétré. Les méthodes de l'interface oracle.sql.ref : String getbasetypename() -> nom du type SQL de la cible de la référence Object getvalue() -> extrait l'objet cible de la référence void setvalue(objet) -> affecte l'objet cible de la référence 39 40 Gestion des références Gestion des références CREATE TYPE conseil_type as object (idc integer, nomc varchar2(20)); CREATE personne_type as object (idp integer, nomp varchar2(20), membrec REF conseil_type); On suppose que la classe "Conseil" java correspondant au type conseil_type est définie. Implémentation de l'interface SQLData Avec définition des méthodes readsql et writesql Code java pour afficher les objets référencés par membrec dans la table personne. java.util.map map=conn.gettypemap(); map.put("conseil_type",class.forname("conseil")); OracleResultSet rset = (..) st.executequery("select p.membrec from personne p;"); oracle.sql.ref refc = rset.getref(1); Conseil cs=refc.getvalue(); System.out.println(cs.getBaseTypeName() +cs.nomc);... 41 42 7

Gestion des références Mise à jour d'une référence Le principe est identique mais il faut utiliser la méthode setref (ou setref), 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();... 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 passées en paramètres par setarray ou setarray getarray ou getarray. Les méthodes de l'interface java.sql.array sont : Object getarray(int) -> renvoie la collection Objetc getarray(map) -> même méthode mais avec un mapping String getbasetypename() renvoie le nom du type cible de la référence ResultSet getresultset() renvoie un curseur java ResultSet getresultset(map) renvoie un curseur java avec un mapping 43 44 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; Extraction de la collection simple Utilisation de getarray Affichage des éléments d'une collection (extraction) ResultSet rset = st.executequery("select ex.nome, ex.docs from expose ex"); {sop(rset.getstring(1)); Array ar =(Array) rset.getarray(2); ResultSet docsset=ar.getresultset(); while (docsset.next()) System.out.println( docsset.getstring(1));... 45 46 Mise à jour d'une collection L'interface ArrayDescriptor permet de créer un objet de type ARRAY. Descriptions des méthodes de l'interface oracle.sql.arraydescriptor 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 utilisée lors de la création du descripteur. Mise à jour de l'attributs docs (nested table) de la table expose pour l'expose de nom 'expose1' String nvdoc[]={"journal", "revue", "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(); 47 48 8

JPublisher JPublisher est un outil de l'offre Oracle écrit en java Qui permet de générer des classes (.java) pour préparer la programmation de mappings entre les objets de la base et les objets de l'application. Ces classes sont déduites à partir des types SQL (objets, références, collections nested table ou varray) du schéma Oracle. Principe : Créer des types sous Oracle, Générer des classes avec JPublisher et les utiliser dans des paquetages applicatifs si nécessaire Importer ces classes dans l'application générale et utiliser les méthodes de classes générées Compiler toutes les classes et exécuter l'application. 49 9