Architectures Logicielles Olivier Caron c Polytech’Lille Architectures 2-tiers Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 1 / 45 Problématique ? Les applications logicielles deviennent de plus en plus complexes : L’application ne fonctionne pas sur une machine mais sur plusieurs. → programmation réseau, efficacité, performances, sécurité, tolérance aux pannes,. . . Intéropérabilité des langages et plates-formes. L’application utilise/ou réutilise des applications existantes. → applications patrimoines, bases de données Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 2 / 45 Problématique ? Les applications logicielles deviennent de plus en plus complexes : L’application ne fonctionne pas sur une machine mais sur plusieurs. → programmation réseau, efficacité, performances, sécurité, tolérance aux pannes,. . . Intéropérabilité des langages et plates-formes. L’application utilise/ou réutilise des applications existantes. → applications patrimoines, bases de données Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 2 / 45 Problématique ? Les applications logicielles deviennent de plus en plus complexes : L’application ne fonctionne pas sur une machine mais sur plusieurs. → programmation réseau, efficacité, performances, sécurité, tolérance aux pannes,. . . Intéropérabilité des langages et plates-formes. L’application utilise/ou réutilise des applications existantes. → applications patrimoines, bases de données Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 2 / 45 Problématique ? Les applications logicielles deviennent de plus en plus complexes : L’application ne fonctionne pas sur une machine mais sur plusieurs. → programmation réseau, efficacité, performances, sécurité, tolérance aux pannes,. . . Intéropérabilité des langages et plates-formes. L’application utilise/ou réutilise des applications existantes. → applications patrimoines, bases de données Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 2 / 45 Des objectifs ambitieux Face à cette complexité, on veut, en outre : Améliorer la qualité et la production de code Simplifier le travail du programmeur Réutiliser au mieux le logiciel Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 3 / 45 Des objectifs ambitieux Face à cette complexité, on veut, en outre : Améliorer la qualité et la production de code Simplifier le travail du programmeur Réutiliser au mieux le logiciel Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 3 / 45 Des objectifs ambitieux Face à cette complexité, on veut, en outre : Améliorer la qualité et la production de code Simplifier le travail du programmeur Réutiliser au mieux le logiciel Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 3 / 45 Des objectifs ambitieux Face à cette complexité, on veut, en outre : Améliorer la qualité et la production de code Simplifier le travail du programmeur Réutiliser au mieux le logiciel Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 3 / 45 Les solutions Définir en premier lieu l’architecture logicielle la mieux adaptée : A software architecture is an abstract system specification consisting primarily of functional components described in terms of their behaviors and interfaces and component-component interconnections". (Hayes-Roth, 1994) Disposer de briques logicielles réutilisables : les composants. Disposer d’infrastructures d’accueil de ces composants : les serveurs d’applications. Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 4 / 45 Les solutions Définir en premier lieu l’architecture logicielle la mieux adaptée : A software architecture is an abstract system specification consisting primarily of functional components described in terms of their behaviors and interfaces and component-component interconnections". (Hayes-Roth, 1994) Disposer de briques logicielles réutilisables : les composants. Disposer d’infrastructures d’accueil de ces composants : les serveurs d’applications. Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 4 / 45 Les solutions Définir en premier lieu l’architecture logicielle la mieux adaptée : A software architecture is an abstract system specification consisting primarily of functional components described in terms of their behaviors and interfaces and component-component interconnections". (Hayes-Roth, 1994) Disposer de briques logicielles réutilisables : les composants. Disposer d’infrastructures d’accueil de ces composants : les serveurs d’applications. Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 4 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (1/2) Les architectures 2-tiers Code et Bases de données (applications JDBC) Des objets aux composants Le modèle de composants Java Beans Des objets aux objets répartis Le modèle Java RMI Le modèle CORBA Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 5 / 45 Plan du cours (2/2) Des objets aux composants répartis Les architectures clients/serveurs 3-tiers L’architecture J2EE (composants Web, composants EJB) Introduction aux web services Le modèle de composants CORBA Conception d’applications 3-tiers Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 6 / 45 Plan du cours (2/2) Des objets aux composants répartis Les architectures clients/serveurs 3-tiers L’architecture J2EE (composants Web, composants EJB) Introduction aux web services Le modèle de composants CORBA Conception d’applications 3-tiers Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 6 / 45 Plan du cours (2/2) Des objets aux composants répartis Les architectures clients/serveurs 3-tiers L’architecture J2EE (composants Web, composants EJB) Introduction aux web services Le modèle de composants CORBA Conception d’applications 3-tiers Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 6 / 45 Plan du cours (2/2) Des objets aux composants répartis Les architectures clients/serveurs 3-tiers L’architecture J2EE (composants Web, composants EJB) Introduction aux web services Le modèle de composants CORBA Conception d’applications 3-tiers Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 6 / 45 Plan du cours (2/2) Des objets aux composants répartis Les architectures clients/serveurs 3-tiers L’architecture J2EE (composants Web, composants EJB) Introduction aux web services Le modèle de composants CORBA Conception d’applications 3-tiers Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 6 / 45 Plan du cours (2/2) Des objets aux composants répartis Les architectures clients/serveurs 3-tiers L’architecture J2EE (composants Web, composants EJB) Introduction aux web services Le modèle de composants CORBA Conception d’applications 3-tiers Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 6 / 45 Architectures 2-tiers Découpage d’une application en deux entités. Niveau données : fichiers, SGBD Niveau code métier logiciel : Gère l’IHM et le code métier Dispose d’une API pour gérer les données Code plus ou moins complexe : en réseau ?, sécurité ?, accès concurrents ?, . . . Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 7 / 45 Architectures 2-tiers Découpage d’une application en deux entités. Niveau données : fichiers, SGBD Niveau code métier logiciel : Gère l’IHM et le code métier Dispose d’une API pour gérer les données Code plus ou moins complexe : en réseau ?, sécurité ?, accès concurrents ?, . . . Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 7 / 45 Architectures 2-tiers Découpage d’une application en deux entités. Niveau données : fichiers, SGBD Niveau code métier logiciel : Gère l’IHM et le code métier Dispose d’une API pour gérer les données Code plus ou moins complexe : en réseau ?, sécurité ?, accès concurrents ?, . . . Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 7 / 45 Architectures 2-tiers Découpage d’une application en deux entités. Niveau données : fichiers, SGBD Niveau code métier logiciel : Gère l’IHM et le code métier Dispose d’une API pour gérer les données Code plus ou moins complexe : en réseau ?, sécurité ?, accès concurrents ?, . . . Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 7 / 45 Architectures 2-tiers Découpage d’une application en deux entités. Niveau données : fichiers, SGBD Niveau code métier logiciel : Gère l’IHM et le code métier Dispose d’une API pour gérer les données Code plus ou moins complexe : en réseau ?, sécurité ?, accès concurrents ?, . . . Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 7 / 45 Architectures 2-tiers Découpage d’une application en deux entités. Niveau données : fichiers, SGBD Niveau code métier logiciel : Gère l’IHM et le code métier Dispose d’une API pour gérer les données Code plus ou moins complexe : en réseau ?, sécurité ?, accès concurrents ?, . . . Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 7 / 45 L’ancêtre ODBC Programme ODBC select * from personne ODBC Oracle Olivier Caron (Polytech’Lille) ODBC Postgres Architectures Logicielles ODBC Excel AL IMA5 8 / 45 JDBC Langage Java (multi-plateforme :-) API Adopté par presque tous les constructeurs Passerelle ODBC-JDBC Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 9 / 45 JDBC Langage Java (multi-plateforme :-) API Adopté par presque tous les constructeurs Passerelle ODBC-JDBC Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 9 / 45 JDBC Langage Java (multi-plateforme :-) API Adopté par presque tous les constructeurs Passerelle ODBC-JDBC Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 9 / 45 JDBC Langage Java (multi-plateforme :-) API Adopté par presque tous les constructeurs Passerelle ODBC-JDBC Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 9 / 45 Des utilisations possibles des protocoles Access ... Access Programme JDBC select * from personne JDBC-ODBC ODBC JDBC Oracle Olivier Caron (Polytech’Lille) ODBC JDBC Postgres Architectures Logicielles ODBC Excel AL IMA5 10 / 45 Chargement du driver Disposer d’un driver propriétaire (Réseau Polytech : /usr/share/java/postgresql.jar) Charger le driver : try { Class . forName ( " sun . j d b c . odbc . JdbcOdbcDriver " ) ; } catch ( ClassNotFoundException e ) { System . e r r . p r i n t l n ( " E x c e p t i o n : " + e . t o S t r i n g ( ) ) ; } Système basé sur le mécanisme d’interfaces Java Driver postgres :org.postgresql.Driver Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 11 / 45 Obtenir une connexion Utilisation d’une méthode static de DriverManager Connection connect = DriverManager . getConnection ( urlBase , " nomLogin " , " nomPassword " ) ; Il faut définir dans l’url : le protocole et sous-protocole l’adresse du serveur de base de données et le nom de la base S t r i n g u r l B a s e = " j d b c : odbc : / / nomServeur / nomBase " ; S t r i n g u r l B a s e = " j d b c : p o s t g r e s q l : / / weppes / b i b l i o " ; Connexion réseau conforme internet Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 12 / 45 Chargement driver, version 2 (1/2) Objectif : avoir un programme 100% réutilisable Définition d’un fichier de propriétés, fichier database.properties : j d b c . d r i v e r =org . p o s t g r e s q l . D r i v e r j d b c . u r l = j d b c : p o s t g r e s q l : / / weppes . s t u d s e r v / base j d b c . username=admin j d b c . password= s e c r e t Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 13 / 45 Chargement driver, version 2 (2/2) P r o p e r t i e s props= new P r o p e r t i e s ( ) ; F i l e I n p u t S t r e a m i n =new F i l e I n p u t S t r e a m ( fileName ) ; props . l o a d ( i n ) ; S t r i n g d r i v e r =props . g e t P r o p e r t y ( " j d b c . d r i v e r " ) ; S t r i n g u r l =props . g e t P r o p e r t y ( " j d b c . u r l " ) ; S t r i n g username=props . g e t P r o p e r t y ( " j d b c . username " ) ; S t r i n g password=props . g e t P r o p e r t y ( " j d b c . password " ) ; Class . forName ( d r i v e r ) ; Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 14 / 45 L’interface Statement permet de définir les requêtes SQL à envoyer à la base connectée Statement s t m t = connect . c r e a t e S t a t e m e n t ( ) ; Permet d’exécuter deux types de requêtes : Les requêtes de modification de la base Les requêtes de consultation de la base Toutes les méthodes doivent prendre en compte l’exception SQLException Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 15 / 45 Modification de la base API : int executeUpdate(String requeteSQL) s t m t . executeUpdate ( " c r e a t e " (num s t m t . executeUpdate ( " i n s e r t s t m t . executeUpdate ( " i n s e r t table tester "+ i n t e g e r , ch t e x t ) " ) ; i n t o t e s t e r v a l u e s ( 1 , ’ dupont ’ ) " ) ; i n t o t e s t e r values ( 2 , ’ durant ’ ) " ) ; Valable pour toutes les commandes SQL DDL (Data Definition Language) Valable pour les requêtes du type select * into ... retourne le nombre de lignes créées, modifiées,. . . Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 16 / 45 Consultation de la base API : ResultSet executeQuery(String requeteSQL) R e s u l t S e t r s = s t m t . executeQuery ( " s e l e c t ∗ from t e s t e r " ) ; Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 17 / 45 Récupération des données (1/2) La classe ResultSet dispose des méthodes suivantes : boolean next() retourne true s’il reste un n-uplet à lire Date getDate(int i) retourne l’objet Date de la colonne i Date getDate(String col) retourne l’objet Date de la colonne col int getInt(int i) retourne un entier de la colonne i int getInt(String col) retourne un entier de la colonne col String getString(int i) retourne l’objet String de la colonne i String getString(String col) retourne l’objet String de la colonne col ... ... Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 18 / 45 Récupération des données (2/2) Un exemple : int i = 0; while ( r s . n e x t ( ) ) { i n t num = r s . g e t I n t ( "num" ) ; S t r i n g ch = r s . g e t S t r i n g ( " ch " ) ; System . o u t . p r i n t l n ( " l i g n e " + i + " : " + num + " , " + ch ) ; i ++; } next() est obligatoire même pour lire une seule ligne (ex : count) JDBC 1.0 oblige à parcourir la table résultat Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 19 / 45 Fermeture de la connexion Fermer le dialogue SQL Fermer la session avec la base stmt . close ( ) ; connect . c l o s e ( ) ; Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 20 / 45 Préparation des requêtes Lorsqu’elles sont exécutées plusieurs fois Les SGBD ont une version compilée de la requête (performances) dépend des SGBD JDBC offre une API pour : Préparer une requête Paramétrer une requête Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 21 / 45 Préparation des requêtes Lorsqu’elles sont exécutées plusieurs fois Les SGBD ont une version compilée de la requête (performances) dépend des SGBD JDBC offre une API pour : Préparer une requête Paramétrer une requête Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 21 / 45 Préparation des requêtes Lorsqu’elles sont exécutées plusieurs fois Les SGBD ont une version compilée de la requête (performances) dépend des SGBD JDBC offre une API pour : Préparer une requête Paramétrer une requête Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 21 / 45 Préparation des requêtes Lorsqu’elles sont exécutées plusieurs fois Les SGBD ont une version compilée de la requête (performances) dépend des SGBD JDBC offre une API pour : Préparer une requête Paramétrer une requête Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 21 / 45 Préparation des requêtes Lorsqu’elles sont exécutées plusieurs fois Les SGBD ont une version compilée de la requête (performances) dépend des SGBD JDBC offre une API pour : Préparer une requête Paramétrer une requête Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 21 / 45 Préparation des requêtes Lorsqu’elles sont exécutées plusieurs fois Les SGBD ont une version compilée de la requête (performances) dépend des SGBD JDBC offre une API pour : Préparer une requête Paramétrer une requête Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 21 / 45 L’interface PreparedStatement Création d’une requête préparée : PreparedStatement cmdSQL = connect . prepareStatement ( " s e l e c t ∗ " + " from personne where nom=? and age > ? " Paramétrer la requête : cmdSQL . s e t S t r i n g ( 1 , " dupont " ) ; cmdSQL . s e t I n t ( 2 , 1 7 ) ; Exécution de la requête : R e s u l t S e t r s = cmdSQL . executeQuery ( ) ; La concaténation Java marche aussi ! Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 22 / 45 Gérer les transactions Mode par défaut :auto-commit Chaque requête SQL forme une transaction Modifier le mode par défaut : connect . setAutoCommit ( f a l s e ) ; Valider une transaction : s t m t . executeUpdate ( " d e l e t e from emprunter where numl=2 " ) ; s t m t . executeUpdate ( " d e l e t e from r e s e r v e r where numl=2 " ) ; s t m t . executeUpdate ( " d e l e t e from l i v r e s where numl=2 " ) ; connect . commit ( ) ; connect . setAutoCommit ( t r u e ) ; Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 23 / 45 Gestion des erreurs méthode rollback() try { connect . setAutoCommit ( f a l s e ) ; / / début t r a n s a c t i o n cmdeSQL= " i n s e r t i n t o emprunter v a l u e s ( " +numl+ " , " +numu+ " ) " ; s t m t . executeUpdate ( cmdeSQL ) ; i f ( nbEmprunts >= 3 ) connect . r o l l b a c k ( ) ; else connect . commit ( ) ; / / f i n transaction connect . setAutoCommit ( t r u e ) ; } catch ( SQLException e ) { i f ( connect ! = n u l l ) { t r y { connect . r o l l b a c k ( ) ; connect . setAutoCommit ( t r u e ) ; } catch ( SQLException ex ) { System . e r r . p r i n t l n ( " on e s t mal ! " ) ; } } Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 24 / 45 JDBC Procédures stockées JDBC propose une nouvelle interface CallableStatement C a l l a b l e S t a t e m e n t cs = connect . p r e p a r e C a l l ( " { c a l l now } " ) ; Invocation de la procédure : R e s u l t S e t r s = cs . executeQuery ( ) ; Les paramètres sont gérés comme une requête préparée Utile pour être indépendant du SGBD (portabilité) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 25 / 45 JDBC Procédures stockées et Postgresql Utilisation classique (expr. select) Non portable s t m t = connect . c r e a t e S t a t e m e n t ( ) ; r s =s . executeQuery ( " s e l e c t now ( ) " ) ; rs . next ( ) ; System . o u t . p r i n t l n ( " La date du j o u r : " + r s . getDate ( " now " ) ) ; Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 26 / 45 Gestion des warnings disposer d’informations provenant d’erreurs non graves d’exécution (déconnexion, une instruction grant ne s’est pas réalisée,. . . ) SQLWarning warning = s t m t . getWarnings ( ) ; i f ( warning ! = n u l l ) { System . o u t . p r i n t l n ( " \ n−−−Warning−−−\n " ) ; while ( warning ! = n u l l ) { System . o u t . p r i n t l n ( " Message : " + warning . getMessage ( ) ) ; System . o u t . p r i n t l n ( " SQLState : " + warning . getSQLState ( ) ) ; System . o u t . p r i n t ( " Vendor e r r o r code : " ) ; System . o u t . p r i n t l n ( warning . getErrorCode ( ) ) ; warning = warning . getNextWarning ( ) ; } } Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 27 / 45 Applet et JDBC A éviter lorsque la sécurité est importante Accès réseau limité Nécessite de charger le driver Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 28 / 45 Applet et JDBC : un exemple (1/3) <html > <head> < t i t l e > t e s t a p p l e t e t JDBC< / t i t l e > </ head> <body> <h1>Les u t i l i s a t e u r s de l a base < / h1> <APPLET code = " AppletJDBC . c l a s s " archive = " postgresql . j a r " codebase= " h t t p : / / weppes . s t u d s e r v . deule . n e t / ~ ocaron / " w i d t h =200 h e i g h t =50> </APPLET> </ body> </ html > Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 29 / 45 Applet et JDBC : un exemple (2/3) I import j a v a . s q l . ∗ ; import j a v a . a p p l e t . A p p l e t ; import j a v a . awt . Label ; public class AppletJDBC extends A p p l e t { public void i n i t ( ) { Label l a b e l =new Label ( ) ; Statement s t m t = n u l l ; Connection db = n u l l ; ResultSet rs =null ; try { Class . forName ( " org . p o s t g r e s q l . D r i v e r " ) ; db=DriverManager . getConnection ( " j d b c : p o s t g r e s q l : / / weppes . s t u d s e r v . deule . n e t / t e m p l a t e 1 " , " nomLogin " , " motdepasse " ) ; s t m t =db . c r e a t e S t a t e m e n t ( ) ; r s = s t m t . executeQuery ( " s e l e c t count ( ∗ ) from pg_user " ) ; rs . next ( ) ; l a b e l . s e t T e x t ( " nombre d ’ u t i l i s a t e u r s : " + Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 30 / 45 Applet et JDBC : un exemple (2/3) II r s . g e t I n t ( " count " ) ) ; s t m t . c l o s e ( ) ; db . c l o s e ( ) ; } catch ( ClassNotFoundException e1 ) { l a b e l . s e t T e x t ( e1 . getMessage ( ) ) ; } catch ( SQLException e2 ) { l a b e l . s e t T e x t ( e2 . getMessage ( ) ) ; try { i f ( stmt != null ) stmt . close ( ) ; i f ( db ! = n u l l ) db . c l o s e ( ) ; } catch ( SQLException e3 ) { } } t h i s . add ( l a b e l ) ; } } Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 31 / 45 Applet et JDBC : un exemple (3/3) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 32 / 45 JDBC 2.0 Déplacement amélioré dans une table Mise à jour de la base en utilisant des méthodes Java au lieu de commandes SQL Envoi de plusieurs commandes SQL (batch) Quelques adaptations à SQL 3 Package java : javax.sql Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 33 / 45 JDBC 2.0 Déplacement amélioré dans une table Mise à jour de la base en utilisant des méthodes Java au lieu de commandes SQL Envoi de plusieurs commandes SQL (batch) Quelques adaptations à SQL 3 Package java : javax.sql Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 33 / 45 JDBC 2.0 Déplacement amélioré dans une table Mise à jour de la base en utilisant des méthodes Java au lieu de commandes SQL Envoi de plusieurs commandes SQL (batch) Quelques adaptations à SQL 3 Package java : javax.sql Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 33 / 45 JDBC 2.0 Déplacement amélioré dans une table Mise à jour de la base en utilisant des méthodes Java au lieu de commandes SQL Envoi de plusieurs commandes SQL (batch) Quelques adaptations à SQL 3 Package java : javax.sql Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 33 / 45 JDBC 2.0 Déplacement amélioré dans une table Mise à jour de la base en utilisant des méthodes Java au lieu de commandes SQL Envoi de plusieurs commandes SQL (batch) Quelques adaptations à SQL 3 Package java : javax.sql Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 33 / 45 Scrollable Result Sets Nouvelle définition pour obtenir une table résultat : Statement s t m t ; R e s u l t S e t s r s ; s t m t = db . c r e a t e S t a t e m e n t ( R e s u l t S e t . TYPE_SCROLL_SENSITIVE , R e s u l t S e t .CONCUR_UPDATABLE ) ; s r s = s t m t . executeQuery ( "SELECT ∗ from j o u e u r " ) ; Des constantes définies au niveau de ResultSet : TYPE_FORWARD_ONLY parcours dans un seul sens TYPE_SCROLL_SENSITIVE sensible aux changements TYPE_SCROLL_INSENSITIVE non sensible aux changements CONCUR_READ_ONLY non modifiable CONCUR_UPDATABLE modifiable Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 34 / 45 Les possibilités de déplacement srs.next() srs.previous() srs.absolute(i) srs.absolute(-i) srs.relative(i) srs.relative(-i) srs.afterlast() srs.isAfterLast() srs.last() Olivier Caron (Polytech’Lille) ligne suivante ligne précédente aller à la ième ligne aller à la ième ligne en partant de la dernière descendre de i lignes remonter de i lignes fin de la table retourne vrai si fin de table aller à la dernière ligne Architectures Logicielles AL IMA5 35 / 45 Modification de lignes Des nouvelles méthodes pour ResultSet : void updateType(String nomColonne, type nouvelleValeur) void updateRow() void cancelRowUpdates() Un exemple : s r s . u p d a t e S t r i n g ( "nom" , " Benzema " ) ; s r s . updateRow ( ) ; / / changement v a l i d é s r s . u p d a t e S t r i n g ( "nom" , " Caron " ) ; s r s . cancelRowUpdates ( ) ; / / i c i , s e u l e l a l i g n e / / précédente e s t i n v a l i d é e Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 36 / 45 Insertion de lignes Des nouvelles méthodes pour ResultSet : void moveToInsertRow() void moveToCurrentRow() void insertRow() Un exemple : / / phase d ’ i n s e r t i o n s r s . moveToInsertRow ( ) ; s r s . u p d a t e I n t ( "num" , 5 ) ; s r s . u p d a t e S t r i n g ( "nom" , " Mexes " ) ; s r s . insertRow ( ) ; s r s . moveToCurrentRow ( ) ; / / r e t o u r au c u r s e u r / / avant phase d ’ i n s e r t i o n Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 37 / 45 Suppression de lignes et Gérer les changements Des nouvelles méthodes pour ResultSet : void deleteRow() void refreshRow() (mode TYPE_SCROLL_SENSITIVE) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 38 / 45 Programmes Batch Permet de diminuer les échanges entre client/serveur (performances) Un exemple : db . setAutoCommit ( f a l s e ) ; try { Statement s t m t = db . c r e a t e S t a t e m e n t ( ) ; s t m t . addBatch ( " i n s e r t i n t o j o u e u r v a l u e s ( 6 , ’ Anelka ’ ) " ) s t m t . addBatch ( " i n s e r t i n t o j o u e u r v a l u e s ( 7 , ’ R i b e r y ’ ) " ) s t m t . addBatch ( " i n s e r t i n t o j o u e u r v a l u e s ( 8 , ’ V i e r a ’ ) " ) ; i n t [ ] updateCounts = s t m t . executeBatch ( ) ; } catch ( BatchUpdateException e ) { . . . Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 39 / 45 Prise en compte de SQL 3 SQL 3 : unification de concepts orienté-objet et le monde relationnel Des colonnes de type non simple : Des tableaux (rs.getArray("nomColonne")) Des objets (rs.getBlob("nomColonne")) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 40 / 45 Prise en compte de SQL 3 SQL 3 : unification de concepts orienté-objet et le monde relationnel Des colonnes de type non simple : Des tableaux (rs.getArray("nomColonne")) Des objets (rs.getBlob("nomColonne")) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 40 / 45 Prise en compte de SQL 3 SQL 3 : unification de concepts orienté-objet et le monde relationnel Des colonnes de type non simple : Des tableaux (rs.getArray("nomColonne")) Des objets (rs.getBlob("nomColonne")) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 40 / 45 Prise en compte de SQL 3 SQL 3 : unification de concepts orienté-objet et le monde relationnel Des colonnes de type non simple : Des tableaux (rs.getArray("nomColonne")) Des objets (rs.getBlob("nomColonne")) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 40 / 45 Le niveau Meta Une meta-donnée est une donnée qui décrit une donnée Des Exemples : Modèle Relationnel : table(colonne1 type1, . . . ) Postgres pg_database, pg_user, pg_class,. . . Java : getClass() , getMethods, getFields(), . . . JDBC propose une API pour analyser une base (introspection) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 41 / 45 Le niveau Meta Une meta-donnée est une donnée qui décrit une donnée Des Exemples : Modèle Relationnel : table(colonne1 type1, . . . ) Postgres pg_database, pg_user, pg_class,. . . Java : getClass() , getMethods, getFields(), . . . JDBC propose une API pour analyser une base (introspection) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 41 / 45 Le niveau Meta Une meta-donnée est une donnée qui décrit une donnée Des Exemples : Modèle Relationnel : table(colonne1 type1, . . . ) Postgres pg_database, pg_user, pg_class,. . . Java : getClass() , getMethods, getFields(), . . . JDBC propose une API pour analyser une base (introspection) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 41 / 45 Le niveau Meta Une meta-donnée est une donnée qui décrit une donnée Des Exemples : Modèle Relationnel : table(colonne1 type1, . . . ) Postgres pg_database, pg_user, pg_class,. . . Java : getClass() , getMethods, getFields(), . . . JDBC propose une API pour analyser une base (introspection) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 41 / 45 Le niveau Meta Une meta-donnée est une donnée qui décrit une donnée Des Exemples : Modèle Relationnel : table(colonne1 type1, . . . ) Postgres pg_database, pg_user, pg_class,. . . Java : getClass() , getMethods, getFields(), . . . JDBC propose une API pour analyser une base (introspection) Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 41 / 45 JDBC et le niveau Meta Analyser dynamiquement la structure d’une table résultat l’interface ResultSetMetaData int getColumnCount() int getColumnDisplaySize(int column) String getColumnLabel(int column) String getColumnName(int column) int getColumnType(int column) String getColumnTypeName(int column) Olivier Caron (Polytech’Lille) Architectures Logicielles le nombre de colonnes taille d’affichage d’une col nom suggéré d’une colonne nom de colonne type (cste) de la colonne nom du type de la colonne AL IMA5 42 / 45 Un exemple d’analyse dynamique de table I r s = s t m t . executeQuery ( " s e l e c t count ( ∗ ) from j o u e u r " ) ; r s . n e x t ( ) ; i n t nbLignes= r s . g e t I n t ( " count " ) ; r s = s t m t . executeQuery ( " s e l e c t ∗ from j o u e u r " ) ; ResultSetMetaData rsmd = r s . getMetaData ( ) ; / / stockage des noms de colonne S t r i n g colName [ ] = new S t r i n g [ rsmd . getColumnCount ( ) ] ; f o r ( i n t i =0; i <rsmd . getColumnCount ( ) ; i ++) { colName [ i ] = rsmd . getColumnLabel ( i + 1 ) ; Object r e s u l t a t [ ] [ ] = new O b j e c t [ rsmd . getColumnCount ( ) ] [ nbLignes ] ; i n t l i g =0 ; while ( r s . n e x t ( ) ) { f o r ( i n t i =0; i <colName . l e n g t h ; i ++) switch ( rsmd . getColumnType ( i + 1 ) ) { case Types . INTEGER : r e s u l t a t [ i ] [ l i g ] =new I n t e g e r ( r s . g e t I n t ( colName [ i ] ) ) ; break ; Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 43 / 45 Un exemple d’analyse dynamique de table II case Types .VARCHAR : r e s u l t a t [ i ] [ l i g ] =new S t r i n g ( r s . g e t S t r i n g ( colName [ i ] ) ) ; break ; ... } } Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 44 / 45 Analyse dynamique de la base L’interface DatabaseMetaData API très riche (et donc complexe) Permet de connaître les possibilités du SGBD Portable (de nombreux outils génériques) Alternative : les tables systèmes postgres Simple non portable Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 45 / 45 Analyse dynamique de la base L’interface DatabaseMetaData API très riche (et donc complexe) Permet de connaître les possibilités du SGBD Portable (de nombreux outils génériques) Alternative : les tables systèmes postgres Simple non portable Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 45 / 45 Analyse dynamique de la base L’interface DatabaseMetaData API très riche (et donc complexe) Permet de connaître les possibilités du SGBD Portable (de nombreux outils génériques) Alternative : les tables systèmes postgres Simple non portable Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 45 / 45 Analyse dynamique de la base L’interface DatabaseMetaData API très riche (et donc complexe) Permet de connaître les possibilités du SGBD Portable (de nombreux outils génériques) Alternative : les tables systèmes postgres Simple non portable Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 45 / 45 Analyse dynamique de la base L’interface DatabaseMetaData API très riche (et donc complexe) Permet de connaître les possibilités du SGBD Portable (de nombreux outils génériques) Alternative : les tables systèmes postgres Simple non portable Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 45 / 45 Analyse dynamique de la base L’interface DatabaseMetaData API très riche (et donc complexe) Permet de connaître les possibilités du SGBD Portable (de nombreux outils génériques) Alternative : les tables systèmes postgres Simple non portable Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 45 / 45 Analyse dynamique de la base L’interface DatabaseMetaData API très riche (et donc complexe) Permet de connaître les possibilités du SGBD Portable (de nombreux outils génériques) Alternative : les tables systèmes postgres Simple non portable Olivier Caron (Polytech’Lille) Architectures Logicielles AL IMA5 45 / 45