15 Dveloppement dapplication de base de donnes en
15 Développement d'application de base de données en Java 30/11/2020 © Robert Godin. Tous droits réservés. 1
Patron d'architecture en couche (layer) n n Couche présentation Couche contrôle (coordonnateur d'application) Couche domaine d'application (ou métier) Couche de services. – – – 30/11/2020 persistance transaction communication sécurité etc. © Robert Godin. Tous droits réservés. 2
15. 1 Application Java/JDBC client-serveur 30/11/2020 © Robert Godin. Tous droits réservés. 3
Cas d ’utilisation Enregistrer. Prêts 30/11/2020 © Robert Godin. Tous droits réservés. 4
Cas de test pour scénario normal 30/11/2020 © Robert Godin. Tous droits réservés. 5
Cas d ’exception : nombre maximal d'emprunts (ici 2) atteint 30/11/2020 © Robert Godin. Tous droits réservés. 6
Cas d ’exception : exemplaire non disponible 30/11/2020 © Robert Godin. Tous droits réservés. 7
Cas d'utilisation et classes métiers concernées 30/11/2020 © Robert Godin. Tous droits réservés. 8
Patron courtier BD : classes du programme Java et tables concernées ~ Data Access Object (DAO) + Domain Data Transfer Object 30/11/2020 © Robert Godin. Tous droits réservés. 9
Classe Java pour Personne Lecteurs/modifieurs pour attributs (peut en faire un Java Bean) 30/11/2020 © Robert Godin. Tous droits réservés. 10
Classe Java pour Utilisateur Lecteurs/modifieurs pour naviguer les associations Lecteur pour donnée dérivée 30/11/2020 © Robert Godin. Tous droits réservés. 11
Classe Java pour Membre Attributs et méthodes static pour attributs de classe (ou singleton) 30/11/2020 © Robert Godin. Tous droits réservés. 12
Classe Java pour Employé 30/11/2020 © Robert Godin. Tous droits réservés. 13
Classe Java pour Prêt 30/11/2020 © Robert Godin. Tous droits réservés. 14
Classe Java pour Prêt. En. Cours 30/11/2020 © Robert Godin. Tous droits réservés. 15
Classe Java pour Exemplaire 30/11/2020 © Robert Godin. Tous droits réservés. 16
Courtier. BDUtilisateur 30/11/2020 © Robert Godin. Tous droits réservés. 17
Diagramme de séquence pour Courtier. BDUtilisateur 30/11/2020 © Robert Godin. Tous droits réservés. 18
Classe Usine. Connection 30/11/2020 © Robert Godin. Tous droits réservés. 19
Courtier. BDPrêt. En. Cours : cher. Les. Prêts. En. Cours 30/11/2020 © Robert Godin. Tous droits réservés. 20
Matérialisation d ’un Prêt. En. Cours : insérer. Prêt. En. Cours 30/11/2020 © Robert Godin. Tous droits réservés. 21
Enjeux de la conception des courtiers Granularité des courtiers n Granularité de matérialisation/dématérialisation n – – 30/11/2020 minimiser les appels au serveur de BD limiter le volume de données à transférer © Robert Godin. Tous droits réservés. 22
Classe de contrôle Controle. Enregistrer. Prets 30/11/2020 © Robert Godin. Tous droits réservés. 23
30/11/2020 © Robert Godin. Tous droits réservés. 24
15. 1. 1 Enjeux de conception d'une application Java/JDBC Dépendance au temps de réflexion 30/11/2020 © Robert Godin. Tous droits réservés. 25
Limiter les verrouillages ? 30/11/2020 © Robert Godin. Tous droits réservés. 26
Limiter la durée des transactions n Contraintes de sérialisabilité ? 30/11/2020 © Robert Godin. Tous droits réservés. 27
Vérification des contraintes par le serveur Non sérialisabilité perçue par T 2 30/11/2020 © Robert Godin. Tous droits réservés. 28
Contrôle de concurrence optimiste par estampillage explicite n Lecture en une première transaction – n Note l’estampille courante (ou numéro de version, …) Écriture en une deuxième transaction distincte – Vérifie si l’état a changé depuis la lecture n n Si non, met à jour les données et l’estampille Si oui, annulation Ne bloque pas les objets lus Populaire dans les applications Web 30/11/2020 © Robert Godin. Tous droits réservés. 29
Réduire l'interactivité 30/11/2020 © Robert Godin. Tous droits réservés. 30
Controle. Enregistrer. Prets. Simple 30/11/2020 © Robert Godin. Tous droits réservés. 31
Libérer la connexion entre les appels Transaction ne peut chevaucher les appels n Ouverture/fermeture couteuse n – 30/11/2020 Solution : connection pooling (JDBC 2) © Robert Godin. Tous droits réservés. 32
15. 1. 2 Gestion de la sécurité n Qui gère l ’id. Utilisateur et le mot de passe ? – – 30/11/2020 par les données : le SGBD par les traitements : le programme client © Robert Godin. Tous droits réservés. 33
Controle. Enr. Prets. Securite. Par. Donnees 30/11/2020 © Robert Godin. Tous droits réservés. 34
Controle. Enr. Prets. Securite. Par. Traitement 30/11/2020 © Robert Godin. Tous droits réservés. 35
15. 1. 3 Façade pour les services de la couche application 30/11/2020 © Robert Godin. Tous droits réservés. 36
Diagramme de séquence pour Controle. Enregistrer. Pret. Avec. Facade Dépendance réduite par rapport à la couche persistence 30/11/2020 © Robert Godin. Tous droits réservés. 37
Patron d'objet de transfert de données (OTD) 30/11/2020 © Robert Godin. Tous droits réservés. 38
Controle. Enregistrer. Prets. Simple. Avec. Facade Connexion libérée entre les appels 30/11/2020 © Robert Godin. Tous droits réservés. 39
15. 2 Développement d'applications Web par servlet Java 30/11/2020 © Robert Godin. Tous droits réservés. 40
15. 2. 1 Principe de base du Web : le protocole HTTP et le langage de présentation HTML 30/11/2020 © Robert Godin. Tous droits réservés. 41
15. 2. 2 Développement de servlet Java 30/11/2020 © Robert Godin. Tous droits réservés. 42
Diagramme de séquence de l'invocation de la servlet Servlet. Enregistrer. Pret. Simple. Facade Réutilisation des classes du client-serveur 30/11/2020 © Robert Godin. Tous droits réservés. 43
30/11/2020 © Robert Godin. Tous droits réservés. 44
30/11/2020 © Robert Godin. Tous droits réservés. 45
15. 2. 3 Cycle de vie d'une servlet n Compilation et démarrage à la première invocation (par conteneur) – init() appelé une fois n permet d ’initialiser des ressources (e. g. connexion) – – nouveau fil à chaque invocation d ’une méthode de service (do. Get, do. Post, …) destroy() à la fin n e. g. fermer connexion 30/11/2020 © Robert Godin. Tous droits réservés. 46
15. 2. 4 Gestion d'une session HTTP dans une servlet La FORM n ’envoie que le id. Utilisateur 30/11/2020 © Robert Godin. Tous droits réservés. 47
Form. Identification. Utilisateur. Facade. html 30/11/2020 © Robert Godin. Tous droits réservés. 48
Enregistrer. Prets en deux servlets 30/11/2020 © Robert Godin. Tous droits réservés. 49
30/11/2020 © Robert Godin. Tous droits réservés. 50
30/11/2020 © Robert Godin. Tous droits réservés. 51
15. 2. 5 Data. Source, Connection. Pool. Data. Source et Pooled. Connection n Passage par serveur JNDI (Java Naming and Directory Interface) – – – 30/11/2020 e. g. service d’annuaire LDAP repérage de ressources (e. g. serveur BD) accès sécurisé © Robert Godin. Tous droits réservés. 52
Ouverture d ’une Connection en passant par Data. Source 30/11/2020 © Robert Godin. Tous droits réservés. 53
Enregistrement du Data. Source par descripteur de déploiement XML pour serveur embarqué OC 4 J de Oracle 9 i JDevelopper (généré par JDevelopper) 30/11/2020 © Robert Godin. Tous droits réservés. 54
Partage d'un pool de connexions 30/11/2020 © Robert Godin. Tous droits réservés. 55
15. 2. 6 Mécanismes de sécurité pour l'accès à un servlet Sécurité programmatique n Sécurité déclarative par le conteneur n – – 30/11/2020 rôles/utilisateurs géré par conteneur © Robert Godin. Tous droits réservés. 56
15. 3 Architecture pour la persistance transparente n n n Persistance gérée par la classe métier Transparent au client Mécanisme paresseux de matérialisation/dématérialisation – – n Norme Java Data Objects (JDO) – – – n gestion de cache transactionnelle programmation complexe http: //access 1. sun. com/jdo/ inspirée de ODMG outils : http: //www. javaskyline. com/database. html Nouvelle norme Java Persistence API (JPA) 30/11/2020 – Inspirée des meilleures solutions (JDO, Hibernate, Toplink, © Robert Godin. Tous droits réservés. …) 57
15. 4 Norme EJB de J 2 EE (http: //java. sun. com/products/ejb/) n Transparence « extrême » – – – n persistance répartition services Spécification déclarative de services – – – comportement transactionnel sécurité gestion de ressources (CPU, mémoire, serveurs, . . . ) n n n e. g. partage transparent d’un bassin d’objets EJB (pooling) entre clients robustesse, « scalabilité » Prise en charge des services par le conteneur à EJB 30/11/2020 © Robert Godin. Tous droits réservés. 58
Séparation propre des responsabilités (rôles) n Fournisseur de EJB (Enterprise. Bean Provider) – n Assembleur d'application (Application Assembler). – n serveur EJB : services de bas niveau pour le conteneur EJB Fournisseur de conteneur EJB (EJB Container Provider) – n déploie les EJB dans leur environnement d'exécution Fournisseur de serveur EJB (EJB Server Provider). – n assemble EJB + servlet, JSP, HTML, etc. Déployeur (Deployer) – n développe les composantes EJB conteneur EJB : environnement de déploiement et d'exécution des EJB Administrateur de Système (System Administrator) – 30/11/2020 administre serveur et le conteneur EJB © Robert Godin. Tous droits réservés. 59
Catégories de EJB n EJB session (Session Bean) – – service d ’objet distant un seul client à la fois par objet partage d’un bassin d’objets entre clients état au besoin entre les appels n – n non persistent (perdu suite à une panne) EJB entité (Entity Bean) – – – n stateful/stateless session EJB services d'objet distant persistant objet ~ proxy pour une ligne d'une table un objet EJB entité peut être partagé par plusieurs clients EJB message (Message Bean) – 30/11/2020 service de message © Robert Godin. Tous droits réservés. 60
Codage d ’un EJB n Interface home – usine à objet EJB n Interface à – distance (remote) accès aux méthodes d'un objet EJB n Classe bean (bean – 30/11/2020 class) implémente les méthodes de l'objet EJB © Robert Godin. Tous droits réservés. 61
15. 4. 1 Développement d'un EJB session sans état : Facade. Enr. Pret. Simple. Session. EJB n Interface home (usine à EJB) n Interface remote (interface à l’objet EJB) NB Paramètres sérialisables (au sens de Java) passés par valeur 30/11/2020 © Robert Godin. Tous droits réservés. 62
30/11/2020 © Robert Godin. Tous droits réservés. 63
Descripteur de déploiement XML 30/11/2020 © Robert Godin. Tous droits réservés. 64
Client du EJB : façade locale qui délègue à la façade EJB distante (patron Business Delegate) 30/11/2020 © Robert Godin. Tous droits réservés. 65
JDevelopper 10 g (déploiement de défaut différent) 30/11/2020 © Robert Godin. Tous droits réservés. 66
Interposition transparente d ’objets Conteneur de bean 30/11/2020 © Robert Godin. Tous droits réservés. 67
Dans Servlet. Enregistrer. Prets. Simple. Facade remplacer Facade. Enregistrer. Prets. Simple par une Facade. EJBEnregitrer. Pret. Simple 30/11/2020 © Robert Godin. Tous droits réservés. 68
15. 4. 2 Développement d'un EJB session avec état 30/11/2020 © Robert Godin. Tous droits réservés. 69
Classe bean État maintenu entre les appels Méthode du cycle de vie appelée à la création de l’objet avant ejb. Create() NB set. Session. Context() permet d’initialiser la connexion au Data. Source (interdit dans ejb. Create()…) 30/11/2020 © Robert Godin. Tous droits réservés. 70
Classe Bean (suite) : méthode métier identique à Facade. Enregistrer. Prets 30/11/2020 © Robert Godin. Tous droits réservés. 71
Processus de création d ’un EJB avec état 30/11/2020 © Robert Godin. Tous droits réservés. 72
Client du EJB : façade locale qui délègue à la façade EJB distante 30/11/2020 © Robert Godin. Tous droits réservés. 73
Dans Servlet. Identification. Utilisateur. Facade et Servlet. Terminer. Pret. Facade remplacer Facade. Enregistrer. Prets par une Facade. EJBEnregistrer. Prets 30/11/2020 © Robert Godin. Tous droits réservés. 74
15. 4. 3 Support de transactions distribuées n Plusieurs ressources indépendantes – serveur BD, serveur JMS, . . . Protocole transparent de transaction répartie n Démarcation programmatique ou déclarative n 30/11/2020 © Robert Godin. Tous droits réservés. 75
15. 4. 4 Démarcation programmatique de transaction distribuée (bean managed transaction demarcation) Deux connexions indépendantes ! 30/11/2020 © Robert Godin. Tous droits réservés. 76
Classe bean Deux connexions 30/11/2020 © Robert Godin. Tous droits réservés. 77
Classe bean 30/11/2020 © Robert Godin. Tous droits réservés. 78
Descripteur de déploiement XML 30/11/2020 © Robert Godin. Tous droits réservés. 79
15. 4. 5 Démarcation déclarative de transaction (container managed transaction demarcation) 30/11/2020 © Robert Godin. Tous droits réservés. 80
Classe bean 30/11/2020 © Robert Godin. Tous droits réservés. 81
balise <trans-attribut> n Not. Supported n Required n Supports n Requires. New n Mandatory n Never 30/11/2020 © Robert Godin. Tous droits réservés. 82
15. 4. 6 EJB entité n Bean Managed Persistence - BMP – n codage du SQL/JDBC Container Managed Persistence - CMP – – 30/11/2020 SQL généré par conteneur associations depuis EJB 2 héritage avec EJB 3 clé primaire obligatoire. . . © Robert Godin. Tous droits réservés. 83
Classe de clé primaire 30/11/2020 © Robert Godin. Tous droits réservés. 84
Interface remote 30/11/2020 © Robert Godin. Tous droits réservés. 85
Interface home 30/11/2020 © Robert Godin. Tous droits réservés. 86
Classe bean 30/11/2020 © Robert Godin. Tous droits réservés. 87
Descripteur de déploiement XML 30/11/2020 © Robert Godin. Tous droits réservés. 88
Descripteur spécifique au conteneur Orion 30/11/2020 © Robert Godin. Tous droits réservés. 89
Client du EJB 30/11/2020 © Robert Godin. Tous droits réservés. 90
Client du EJB (suite) 30/11/2020 © Robert Godin. Tous droits réservés. 91
Client du EJB (suite) 30/11/2020 © Robert Godin. Tous droits réservés. 92
Façade EJB session accède au EJB entité 30/11/2020 © Robert Godin. Tous droits réservés. 93
EJB 2 n Interfaces locales pour accès léger – EJBLocal. Home, EJBLocal. Object Gestion des associations par le conteneur n EJBQL pour la spécification des find. XXX() n 30/11/2020 © Robert Godin. Tous droits réservés. 94
EJB 3 n n Simplification de l’architecture EJB Annotation par métadonnées dans le code – – n n Mapping objet-relationnel Comportement transactionnel EJB codé comme une classe ordinaire (POJO) Java Persistence API (JPA) – – 30/11/2020 – interface Java indépendante de l’architecture (JSE ou JEE) test hors conteneur © Robert Godin. Tous droits réservés. 95 pas de home (cycle de vie géré par
Exemple avec JDeveloppeur Classes EJB entités Editeur et Livre et annotations générées à partir des tables du schéma relationnel par le « wizard » n Association un à plusieurs entre Editeur et Livre n 30/11/2020 © Robert Godin. Tous droits réservés. 96
Classe Editeur package logiquemetier. persistance; import … Annotation @Entity pour EJB entité @Entity @Table(name="EDITEUR") public class Editeur implements Serializable { @Table pour correspondance entre private String nomediteur; private String ville; la classe et la table private Collection<Livre> livre. Collection; public Editeur() { } public Editeur(String nomediteur, String ville) { this. nomediteur = nomediteur; this. ville = ville; } … 30/11/2020 © Robert Godin. Tous droits réservés. 97
Classe Editeur @Id pour clé primaire … @Column pour correspondance avec @Entity @Table(name="EDITEUR") colonne de la table (sur variable ou public class Editeur implements Serializable {. . . méthodes) package logiquemetier. persistance; @Id @Column(name="NOMEDITEUR", primary. Key=true, nullable=false) public String get. Nomediteur() { return nomediteur; } public void set. Nomediteur(String nomediteur) { this. nomediteur = nomediteur; } @Column(name="VILLE", nullable=false) public String get. Ville() { return ville; } public void set. Ville(String ville) { this. ville = ville; } … 30/11/2020 © Robert Godin. Tous droits réservés. 98
Classe Editeur. . . @One. To. Many(target. Entity="logiquemetier. persistance. Livre") @Join. Column(name="LIVRE. NOMEDITEUR", referenced. Column. Name="EDITEUR. NOMEDITEUR") public Collection<Livre> get. Livre. Collection() { return livre. Collection; } public void set. Livre. Collection(Collection<Livre> livre. Collection) { this. livre. Collection = livre. Collection; } public Livre add. To. Livre. Collection(Livre livre) { get. Livre. Collection(). add( livre ); livre. set. Editeur( this ); return livre; } public Livre remove. From. Livre. Collection(Livre livre) { get. Livre. Collection(). remove( livre ); livre. set. Editeur( null ); return livre; } } 30/11/2020 © Robert Godin. Tous droits réservés. 99
Classe Livre package logiquemetier. persistance; import … @Entity @Table(name="LIVRE") public class Livre implements Serializable { private Long anneeparution; private String code; private String isbn; private String titre; private Editeur editeur; public Livre() { } public Livre(Long anneeparution, String code, String isbn, Editeur editeur, String titre) { this. anneeparution = anneeparution; this. code = code; this. isbn = isbn; this. editeur = editeur; this. titre = titre; } 30/11/2020 © Robert Godin. Tous droits réservés. 100
Classe Livre … @Column(name="ANNEEPARUTION", nullable=false) public Long get. Anneeparution() { return anneeparution; } public void set. Anneeparution(Long anneeparution) { this. anneeparution = anneeparution; } @Column(name="CODE", nullable=false) public String get. Code() { return code; } public void set. Code(String code) { this. code = code; } @Id @Column(name="ISBN", primary. Key=true, nullable=false) public String get. Isbn() { return isbn; } public void set. Isbn(String isbn) { this. isbn = isbn; } @Column(name="TITRE", nullable=false) public String get. Titre() { return titre; } public void set. Titre(String titre) { this. titre = titre; } 30/11/2020 © Robert Godin. Tous droits réservés. 101
Classe Livre … @Many. To. One(target. Entity="logiquemetier. persistance. Editeur") @Join. Column(name="LIVRE. NOMEDITEUR", referenced. Column. Name="EDITEUR. NOMEDITEUR") public Editeur get. Editeur() { return editeur; } public void set. Editeur(Editeur editeur) { this. editeur = editeur; } } 30/11/2020 © Robert Godin. Tous droits réservés. 102
EJB session pour « CRUD » (généré par JDevelopper) n Transactions gérées par le conteneur (mode REQUIRES NEW) package logiquemetier. facade; import … import logiquemetier. persistance. Editeur; import logiquemetier. persistance. Livre; @Remote public interface Session. Facade. EJB 3 { List<Livre> find. All. Livre() throws Naming. Exception; Livre create. Livre(Long anneeparution, String code, Editeur editeur, String isbn, String titre) throws Naming. Exception; List<Editeur> find. All. Editeur() throws Naming. Exception; Editeur create. Editeur(String nomediteur, String ville) throws Naming. Exception; void update. Entity(Object entity) throws Naming. Exception; void delete. Entity(Object entity) throws Naming. Exception; void refresh. Entity(Object entity) throws Naming. Exception; } 30/11/2020 © Robert Godin. Tous droits réservés. 103
EJB session pour « CRUD » (généré par JDevelopper) Entity. Manager est la classe JPA pour gérer les entités et transactions package logiquemetier. facade; import … @Stateless(name="Session. Facade. EJB 3") public class Session. Facade. EJB 3 Bean implements Session. Facade. EJB 3 { private Entity. Manager _entity. Manager; public Session. Facade. EJB 3 Bean() { } @Resource : injection du Entity. Manager public Entity. Manager get. Entity. Manager() { par le conteneur return _entity. Manager; Associé à un persistence unit définis dans } descripteur persistence. xml (paramètres connexion, …) @Resource public void set. Entity. Manager(Entity. Manager entity. Manager) { _entity. Manager = entity. Manager; } 30/11/2020 © Robert Godin. Tous droits réservés. 104
EJB session pour « CRUD » (généré par JDevelopper) . . . public List<Livre> find. All. Livre() throws Naming. Exception { return get. Entity. Manager(). create. Query("select object(o) from Livre o"). get. Result. List(); } Langage de requête JPQL public Livre create. Livre(Long anneeparution, String code, Editeur editeur, String isbn, String titre) throws Naming. Exception { final Livre livre = new Livre(); Constructeur normal avec new livre. set. Anneeparution(anneeparution); livre. set. Code(code); livre. set. Editeur(editeur); Appel à persist() rend l’objet persistant livre. set. Isbn(isbn); Devient géré par le Entity. Manager : livre. set. Titre(titre); contexte de persistance get. Entity. Manager(). persist(livre); return livre; } 30/11/2020 … © Robert Godin. Tous droits réservés. 105
EJB session pour « CRUD » (généré par JDevelopper) … public List<Editeur> find. All. Editeur() throws Naming. Exception { return get. Entity. Manager(). create. Query("select object(o) from Editeur o"). get. Result. List(); } public Editeur create. Editeur(String nomediteur, String ville) throws Naming. Exception { final Editeur editeur = new Editeur(); editeur. set. Nomediteur(nomediteur); editeur. set. Ville(ville); get. Entity. Manager(). persist(editeur); return editeur; } public void update. Entity(Object entity) throws Naming. Exception { get. Entity. Manager(). merge( entity ); } public void delete. Entity(Object entity) throws Naming. Exception { final Entity. Manager em = get. Entity. Manager(); em. remove(em. merge(entity)); } public void refresh. Entity(Object entity) throws Naming. Exception { get. Entity. Manager(). refresh( entity ); } 30/11/2020 © Robert Godin. Tous droits réservés. } merge() pour rattacher un objet au contexte de persistance remove() pour supprimer 106
- Slides: 106