Architectures Logicielles - Polytech`Lille, page Olivier Caron

publicité
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
Téléchargement