11
Taha BEN [email protected]
Version 1.02 / 2006-2008
NEORMF…NEORMF… New Entreprise Object Relational Mapping New Entreprise Object Relational Mapping
FrameworkFramework
.Net.Net
http://neormf.dev.java.net
http://neormf.sourceforge.net
22
AgendaAgenda1.1. Design PatternsDesign Patterns
2.2. Mapping Objet/RelationnelMapping Objet/Relationnel
3.3. Présentation NEORMFPrésentation NEORMF
4.4. Génération de CodeGénération de Code
5.5. ConclusionConclusion
33
«entre perspicacité et éloquence? »…!«entre perspicacité et éloquence? »…!
Design Patterns…Design Patterns…
44
Design PatternsDesign Patterns
Synonymes Synonymes Design Pattern Design Pattern Blue PrintBlue Print
C’est C’est Un « Modèle Conceptuel » est une Un « Modèle Conceptuel » est une
«façon» de «façon» de concevoirconcevoir ou de ou de développerdévelopper Une organisation particulière « Une organisation particulière «
standardisée »standardisée »
55
Design PatternsDesign Patterns
Ce n’est pas Ce n’est pas Du codeDu code Une implémentationUne implémentation Une bibliothèqueUne bibliothèque FrameworkFramework PlateformePlateforme ArchitectureArchitecture SpécificationSpécification
66
Design PatternsDesign Patterns
Non obligatoires mais fortement Non obligatoires mais fortement recommandésrecommandés
Au même titre que Au même titre que Les règles de codageLes règles de codage Les « cartouches » de commentairesLes « cartouches » de commentaires
Applicables à tous les niveauxApplicables à tous les niveaux
77
Règles de nommagesRègles de nommages
Constantes en MajusculesConstantes en Majuscules Les fonctions/méthodes en verbesLes fonctions/méthodes en verbes
bool hasChildren()bool hasChildren() void validate()void validate() Mais pasMais pas validation()validation()
Les accesseurs avec un getXXX et les Les accesseurs avec un getXXX et les modificateurs en setXXXmodificateurs en setXXX getName()getName() setName(String name)setName(String name) Mais pasMais pas String validate()String validate()
88
Design Patterns : IntérêtDesign Patterns : Intérêt
Augmenter Augmenter Lisibilité Lisibilité
Du codeDu code De la conceptionDe la conception
CohésionCohésion CohérenceCohérence
Diminuer Diminuer les dépendances / couplageles dépendances / couplage Les références croiséesLes références croisées
99
Design Patterns : IntérêtDesign Patterns : Intérêt
Spécialisation des « unités de Spécialisation des « unités de compilation »compilation »
Une unité de compilation correspond àUne unité de compilation correspond à une classe dans un langage Objetune classe dans un langage Objet Un fichier code dans un langage non objetUn fichier code dans un langage non objet Dans certains langages Objet une classe Dans certains langages Objet une classe
correspond bien à un fichier (Java, C# 1.1)correspond bien à un fichier (Java, C# 1.1)
1010
Design Patterns : IntérêtDesign Patterns : Intérêt
Tout langage prévoit nécessairement 4 Tout langage prévoit nécessairement 4 types opérationstypes opérations Opérations Arithmétiques et logiquesOpérations Arithmétiques et logiques Opérations Entrées/SortiesOpérations Entrées/Sorties Opérations de contrôle de flux (si, sinon)Opérations de contrôle de flux (si, sinon) Opération de saut (jump, while, for, etc)Opération de saut (jump, while, for, etc)
Ce serait bien de trouver Ce serait bien de trouver exhaustivement les types de « modèles exhaustivement les types de « modèles conceptuels » pouvant répondre à conceptuels » pouvant répondre à tous les problèmestous les problèmes
1111
IntérêtIntérêt
Dans un monde idéal Dans un monde idéal « l’homme » conçoit « l’homme » conçoit et la « machine » réaliseet la « machine » réalise
Rêve encore lointain parce queRêve encore lointain parce que Il y’a plusieurs façon de résoudre un Il y’a plusieurs façon de résoudre un
même problèmemême problème Meilleure façon ?Meilleure façon ?
1212
IntérêtIntérêt
Diminuer le gap entre conception et Diminuer le gap entre conception et implémentationimplémentation 1ere étape vers l’automatisation de 1ere étape vers l’automatisation de
l’implémentation l’implémentation Rêve suprême Rêve suprême
Augmenter la modularitéAugmenter la modularité Mieux séparer les rôlesMieux séparer les rôles
Des intervenants humainsDes intervenants humains Des composants logicielsDes composants logiciels
1313
Domaines d’applicationDomaines d’application
Peuvent intervenir au niveauPeuvent intervenir au niveau Architecture physiqueArchitecture physique Architecture logiqueArchitecture logique ConceptionConception Artifice et astuces de développementArtifice et astuces de développement
1414
Domaines d’applicationDomaines d’application
Architecture physiqueArchitecture physique Définissent les entités de déploiementDéfinissent les entités de déploiement
Nombre de serveurs de clientsNombre de serveurs de clients
Définissent les rôles de chaque entitéDéfinissent les rôles de chaque entité Rôles de serveurs Rôles de serveurs
FrontalFrontal BackofficeBackoffice ClustersClusters
Définissent les modèles de communicationDéfinissent les modèles de communication Client ServeurClient Serveur Business to BusinessBusiness to Business Peer to PeerPeer to Peer Call BackCall Back
1515
Domaines d’applicationDomaines d’application
Architecture LogiqueArchitecture Logique Spécialisation des « unités de compilation Spécialisation des « unités de compilation
»» Une unité de compilation correspond àUne unité de compilation correspond à
une classe dans un langage Objetune classe dans un langage Objet Un fichier code dans un langage non objetUn fichier code dans un langage non objet Dans certains langages Objet une classe Dans certains langages Objet une classe
correspond bien à un fichier (Java, C# 1.1)correspond bien à un fichier (Java, C# 1.1)
Unités de compilationUnités de compilation Métiers : fortement couplées au projetMétiers : fortement couplées au projet Services : faiblement couplées au projet Services : faiblement couplées au projet
(d’ordre général, réutilisables)(d’ordre général, réutilisables) Accessoires : fortement couplées au projet Accessoires : fortement couplées au projet
mais font partie des besoins fonctionnelsmais font partie des besoins fonctionnels
1616
Domaines d’applicationDomaines d’application
Architecture LogiqueArchitecture Logique Proche de las Programmation orientée Proche de las Programmation orientée
ComposantsComposants Rappellent les composants électroniquesRappellent les composants électroniques Exemple : Plugins WinampExemple : Plugins Winamp
1717
Domaines d’applicationDomaines d’application
ConceptuelConceptuel Définit Définit
les stéréotypesles stéréotypes les composants les composants
Les types de relations entre composantsLes types de relations entre composants Les types de messages (méthodes)Les types de messages (méthodes)
1818
Domaines d’applicationDomaines d’application
Codages/RéalisationCodages/Réalisation Garantir une « bonne » implémentation de Garantir une « bonne » implémentation de
la conceptionla conception Augmenter les performancesAugmenter les performances Optimiser l’utilisation des ressourcesOptimiser l’utilisation des ressources
MémoireMémoire ProcesseurProcesseur Ressources Logicielles (Fichiers, sockets, …) Ressources Logicielles (Fichiers, sockets, …)
1919
Design PatternsDesign Patterns Client/ServeurClient/Serveur N TiersN Tiers Composite EntityComposite Entity DAO (Data Access Object)DAO (Data Access Object) DTO (Data Transfert Object)DTO (Data Transfert Object) BO (Business Object)BO (Business Object) Session FacadeSession Facade Business DelegateBusiness Delegate Value List HandlerValue List Handler Chain of ResponsibilityChain of Responsibility Model View ControllerModel View Controller Flyweight OO patternFlyweight OO pattern
2020
Design PatternsDesign Patterns
Divide And ConquerDivide And Conquer FactoryFactory SingletonSingleton Service LocatorService Locator PrototypePrototype IteratorIterator StrategyStrategy BridgeBridge AdapterAdapter
2121
2222
« de la terre à la lune, par Vernes »…!« de la terre à la lune, par Vernes »…!
Mapping Objet Mapping Objet Relationel…Relationel…
2323
Persistance applicativePersistance applicative
La persistance doit être non La persistance doit être non directement visible au développeurdirectement visible au développeur
Les mécanismes de persistance doit Les mécanismes de persistance doit être configurable au niveau être configurable au niveau architecturalarchitectural
Les mécanismes de persistance Les mécanismes de persistance doivent être réutilisables dans d’autres doivent être réutilisables dans d’autres projetsprojets
Les mécanismes de persistance Les mécanismes de persistance doivent être indépendants des doivent être indépendants des serveurs (de données/d’application)serveurs (de données/d’application)
2424
Mapping O/RMapping O/R
Correspondance entreCorrespondance entre Objet, Classe, Attributs/Accesseur, types Objet, Classe, Attributs/Accesseur, types
et structures de données du langage de et structures de données du langage de programmation d’une partprogrammation d’une part
Table, Enregistrement, Vue, Procédure Table, Enregistrement, Vue, Procédure stockée, fonction types et structures de stockée, fonction types et structures de données du serveur de la base de données du serveur de la base de données d’autre partdonnées d’autre part
2525
ProblèmesProblèmes
Dépend du langageDépend du langage Java, C# …Java, C# …
Dépend de la technologieDépend de la technologie Serveur d’application dans le cas J2EEServeur d’application dans le cas J2EE EJB, Corba, MTS, RMIEJB, Corba, MTS, RMI
Dépend de du serveur de la base de Dépend de du serveur de la base de donnéesdonnées MSSQL Server, Oracle, DB2, etc…MSSQL Server, Oracle, DB2, etc…
2626
ProblèmesProblèmes
Problème d’héritageProblème d’héritage Relationnel Relationnel ?? Héritage Héritage Héritage par duplicationHéritage par duplication Héritage par fusionHéritage par fusion Héritage par concaténationHéritage par concaténation
class A{class A{ X,YX,Y}}
class B : A{class B : A{ V,WV,W}}
class C : A{class C : A{ M,NM,N}}
2727
ProblèmesProblèmes
Héritage par duplicationHéritage par duplication Deux tables Deux tables
Table B{X,Y,V,W} Table B{X,Y,V,W} et Table C{X,Y,M;N} et Table C{X,Y,M;N}
contenants une duplication des champs contenants une duplication des champs communscommuns plus une Vue A{X,Y} plus une Vue A{X,Y}
contenant l’union des deux tables sur les contenant l’union des deux tables sur les champs communschamps communs
2828
ProblèmesProblèmes
Héritage par fusionHéritage par fusion Une seule table globaleUne seule table globale
Table A{X,Y,V,W,M,N, Table A{X,Y,V,W,M,N, Type<B ou C>Type<B ou C>} } contenants tous les champs en plus d’un nouveau contenants tous les champs en plus d’un nouveau
champ type qui permet de différentier le typechamp type qui permet de différentier le type
2929
ProblèmesProblèmes
Héritage par concaténationHéritage par concaténation Trois tables Trois tables
Table A{X,Y} Table A{X,Y} Table BTable B00{V,W} {V,W} et Table Cet Table C00{M,N} {M,N}
Deux vues Deux vues B jointure sur A et BB jointure sur A et B00 avec toutes les colonnes avec toutes les colonnes C jointure sur A et CC jointure sur A et C00 avec toutes les colonnes avec toutes les colonnes
3030
ProblèmesProblèmes
Problèmes d’optimisationProblèmes d’optimisation On peut être contraint d’ajouter des On peut être contraint d’ajouter des
champs calculés contenant des valeurs champs calculés contenant des valeurs intermédiaires ou qui simplifient les intermédiaires ou qui simplifient les jointuresjointures
Le choix du type de mapping peut Le choix du type de mapping peut changer pour des raisons d’optimisationchanger pour des raisons d’optimisation
Le choix d’implémentation Le choix d’implémentation Table/Vue/Procédure/Fonction peut Table/Vue/Procédure/Fonction peut changer pour des raisons d’optimisationchanger pour des raisons d’optimisation
3131
ProblèmesProblèmes
Problèmes d’implémentationProblèmes d’implémentation Dialecte et objets SQL différents pour les Dialecte et objets SQL différents pour les
différentes Basesdifférentes Bases Séquences(ORACLE)Séquences(ORACLE) Vues (matérialisées)Vues (matérialisées) Procédures stockées …Procédures stockées … TOP (MSSQL), ROWS(ORACLE)TOP (MSSQL), ROWS(ORACLE)
3232
« Qu’est ce que Matrix a à faire la dedans? »…!« Qu’est ce que Matrix a à faire la dedans? »…!
NEORMFNEORMF
3333
NEORMFNEORMF
Beaucoup de technologiesBeaucoup de technologies Beaucoup de Design PatternsBeaucoup de Design Patterns Simplifier, Minimiser le codeSimplifier, Minimiser le code Refactoring et Génération de Code par Refactoring et Génération de Code par
les IDEles IDE Frameworks Frameworks
propriétaires propriétaires open sources open sources selon la technologieselon la technologie
3434
NEORMFNEORMF
New Entreprise Object Relational New Entreprise Object Relational Mapping FrameworkMapping Framework
FrameworkFramework API (donc extensible)API (donc extensible) Implémentation (donc utilisable)Implémentation (donc utilisable) Générateur de code (donc rapide)Générateur de code (donc rapide)
SupporteSupporte JavaJava J2EE (Serveurs d’application)J2EE (Serveurs d’application) C# DotNetC# DotNet
3535
NEORMF : BundleNEORMF : Bundle Quatre projets (en publication Open Sources)Quatre projets (en publication Open Sources)
NEORMF-COMMONSNEORMF-COMMONS API implémentée en Java et C#API implémentée en Java et C#
NEORMF-JBGENNEORMF-JBGEN « Java Bean Generator »« Java Bean Generator » Générateur de Code; les classes générées héritent et utilisent de Générateur de Code; les classes générées héritent et utilisent de
classes de COMMONSclasses de COMMONS
NEORMF-WWSNEORMF-WWS « Wise Web Support » actuellement pour Java, une implémentation en « Wise Web Support » actuellement pour Java, une implémentation en
cours pour C#cours pour C# Contient des contrôles web directement mappés aux colonnes de la Contient des contrôles web directement mappés aux colonnes de la
base de donnéesbase de données Utilsable conjointement avec Struts ou JSFUtilsable conjointement avec Struts ou JSF
NEORMF-WFSNEORMF-WFS « Wise Forms Support » actuellement pour CSharp, une « Wise Forms Support » actuellement pour CSharp, une
implémentation en cours pour Javaimplémentation en cours pour Java Contient des contrôles Desktop directement mappés aux colonnes de Contient des contrôles Desktop directement mappés aux colonnes de
la base de donnéesla base de données
3636
NEORMFNEORMF
IdéeIdée Réaliser un Mapping Objet Relationnel Réaliser un Mapping Objet Relationnel
OptimalOptimal Écrire le minimum en générant le code selon Écrire le minimum en générant le code selon
Une conception particulièreUne conception particulière Un ensemble de Design PatternsUn ensemble de Design Patterns Un ensemble de frameworks standardsUn ensemble de frameworks standards
3737
NEORMFNEORMF
Supporte un ensemble de Design Supporte un ensemble de Design Patterns ArchitecturauxPatterns Architecturaux Composite EntityComposite Entity DAO (Data Access Object)DAO (Data Access Object) DTO (Data Transfert Object)DTO (Data Transfert Object) BO (Business Object)BO (Business Object) Session FacadeSession Facade Business DelegateBusiness Delegate Value List HandlerValue List Handler Chain of ResponsibilityChain of Responsibility Model View ControllerModel View Controller
3838
NEORMFNEORMF
Implémente un ensemble de Design Implémente un ensemble de Design PatternsPatterns FactoryFactory SingletonSingleton Service LocatorService Locator CompositeComposite PrototypePrototype
3939
NEORMFNEORMF Supporte d’autres frameworksSupporte d’autres frameworks
JavaJava Log4j (généré)Log4j (généré) Struts (dockable)Struts (dockable) JSF (dockable)JSF (dockable) ICEfaces (dockable, génération en encours)ICEfaces (dockable, génération en encours)
C#C# log4net (généré)log4net (généré)
4040
NEORMFNEORMF
Supporte Plusieurs Serveurs d’applicationSupporte Plusieurs Serveurs d’application JBOSSJBOSS GlassfishGlassfish OC4JOC4J Weblogic...Weblogic...
Supporte plusieurs Bases de donnéesSupporte plusieurs Bases de données OracleOracle MSSQL ServerMSSQL Server Derby...Derby...
4141
NEORMFNEORMF
DescriptionDescription Design Pattern NTIERS : Séparation nette Design Pattern NTIERS : Séparation nette
entre les couchesentre les couches Données (DAL : Data Access Layer)Données (DAL : Data Access Layer) Métier (BL : Business Layer)Métier (BL : Business Layer) Présentation (UI : Presentation Layer)Présentation (UI : Presentation Layer)
4242
NEORMFNEORMF
Buttom-Up FrameworkButtom-Up Framework De la base de données ‘Couche Données’ De la base de données ‘Couche Données’
vers les couches les couches supérieuresvers les couches les couches supérieures Pourquoi ?Pourquoi ?
Modèle OO Modèle OO depuis quelques 15 ans depuis quelques 15 ans laisse sa place pour l’orienté composant (EJB/COM) laisse sa place pour l’orienté composant (EJB/COM)
et orienté service (Web Service) et orienté service (Web Service) Susceptible de changer en cours de routeSusceptible de changer en cours de route
Modèle Relationnel Modèle Relationnel depuis +30ansdepuis +30ans Un bon MCD ne change pasUn bon MCD ne change pas
4343
NEORMFNEORMF
Design pattern PyramideDesign pattern Pyramide
ApplicationApplication
BLBL
DALDAL
RLRL
4444
NEORMFNEORMF
InstallationInstallation Installer JDK 1.5Installer JDK 1.5 Décompresser neormf.zip dans un Décompresser neormf.zip dans un
répertoire qu’on nommera désormais $répertoire qu’on nommera désormais ${NEORMF_ROOT}{NEORMF_ROOT}
4545
NEORMFNEORMF
PrincipePrincipe Décrire dans des fichiers xml Décrire dans des fichiers xml
l’architecture de l’application et les design l’architecture de l’application et les design patterns utiliséspatterns utilisés jbgen-config.xmljbgen-config.xml jbgen-defaults.xmljbgen-defaults.xml XYZXYZ.do.xml.do.xml XYZXYZ.bo.xml.bo.xml
4646
NEORMFNEORMF
jbgen-config.xmljbgen-config.xml : contient la configuration : contient la configuration de l’application ainsi que les propriétés de l’application ainsi que les propriétés applicables à tous les composants de applicables à tous les composants de l’applicationl’application Unique par projetUnique par projet
jbgen-defaults.xmljbgen-defaults.xml : contient les règles de : contient les règles de nommages et les paramètres par défautsnommages et les paramètres par défauts rarement modifié et unique par entrepriserarement modifié et unique par entreprise
XYZXYZ.do.xml.do.xml : contient les règles applicables : contient les règles applicables uniquement l’entité (Data Object) XYZ (de la uniquement l’entité (Data Object) XYZ (de la couche DAL)couche DAL)
XYZXYZ.bo.xml.bo.xml : contient les règles applicables : contient les règles applicables uniquement au BO XYZ (de la couche BL)uniquement au BO XYZ (de la couche BL)
4747
NEORMFNEORMF
ÉtapesÉtapes 1. Concevoir la base correctement 1. Concevoir la base correctement
En raisonnant Objet (possibilité d’héritage)En raisonnant Objet (possibilité d’héritage) En dissociant les tablesEn dissociant les tables
DonnéesDonnées Opérations (horodatée)Opérations (horodatée)
Créer le modèle physique avec un outil Créer le modèle physique avec un outil approprié ou un script sur un serveur de approprié ou un script sur un serveur de référenceréférence
Règles de nommage : Noms en Majuscules Règles de nommage : Noms en Majuscules avec ‘_‘ comme séparateuravec ‘_‘ comme séparateur
4848
NEORMFNEORMF
2. Regrouper les Tables en Entités2. Regrouper les Tables en Entités Une Entité défini la couche DALUne Entité défini la couche DAL Regrouper Les tables à multiplicité simpleRegrouper Les tables à multiplicité simple Regrouper les Tables implémentant un Regrouper les Tables implémentant un
HéritageHéritage Définir les colonnes calculéesDéfinir les colonnes calculées
Ex :Ex : Client et ClientInfo (1-0/1)Client et ClientInfo (1-0/1) Engin et Voiture (Impl Héritage)Engin et Voiture (Impl Héritage)
4949
Colonnes calculéesColonnes calculées
Types d’implémentation Types d’implémentation sql-query-field-expressionsql-query-field-expression
Expression SQLExpression SQL
sql-call-field-expressionsql-call-field-expression Procédure stockéeProcédure stockée
sql-relation-field-expressionsql-relation-field-expression Collection par application d’une RelatinoCollection par application d’une Relatino
sql-view-field-expressionsql-view-field-expression Champ d’une VueChamp d’une Vue
sql-function-field-expressionsql-function-field-expression Fonction SQLFonction SQL
code-field-expressioncode-field-expression Code Java/C#Code Java/C#
5050
Colonnes calculéesColonnes calculées
Persistance des colonnesPersistance des colonnes LiveLive StoredStored Stored OnceStored Once
5151
Triggers ApplicatifsTriggers Applicatifs
Triggers ApplicatifsTriggers Applicatifs preInsertpreInsert postInsertpostInsert preDeletepreDelete postDeletepostDelete preUpdatepreUpdate postUpdatepostUpdate
5252
NEORMFNEORMF
Une Entité définitUne Entité définit DTO : structure modélisant l’enregistrementDTO : structure modélisant l’enregistrement
Champ pour chaque colonne (réelle ou calculée)Champ pour chaque colonne (réelle ou calculée)
DAO : structure modélisant la tableDAO : structure modélisant la table Opérations (Insert, Update, Select, Delete)Opérations (Insert, Update, Select, Delete)
Meta DataMeta Data Structures pour modéliser Structures pour modéliser
les colonnes/attributsles colonnes/attributs la clef uniquela clef unique ……
5353
NEORMFNEORMF
3. Regrouper les Entités en Modules3. Regrouper les Entités en Modules Un module est un Business Object (BO)Un module est un Business Object (BO) Un BO fait partie de la couche BLUn BO fait partie de la couche BL Un BO ne peut manipuler que les Entités qu’il Un BO ne peut manipuler que les Entités qu’il
englobeenglobe Si un BO nécessite l’utilisation d’une autre Si un BO nécessite l’utilisation d’une autre
Entité, il fait appel à un service d’un autre BOEntité, il fait appel à un service d’un autre BO Deux BO ne doivent jamais s’appeler Deux BO ne doivent jamais s’appeler
mutuellement car dans ce cas on pourra soit mutuellement car dans ce cas on pourra soit fusionner les deux BO soit déplacer la fusionner les deux BO soit déplacer la méthode de référence croisée vers le méthode de référence croisée vers le deuxième BO.deuxième BO.
Ex : Module PaieEx : Module Paie Ex : Engin et Voiture (Impl Héritage)Ex : Engin et Voiture (Impl Héritage)
5454
NEORMFNEORMF
Écrire les fichiers de configuration Écrire les fichiers de configuration JBGENJBGEN
Par défaut NEORMF fait un mapping Par défaut NEORMF fait un mapping Vertical c’est à dire Vertical c’est à dire à chaque Table il associe un DO à chaque Table il associe un DO
(DAO/EJB Entité)(DAO/EJB Entité) à chaque DO il associe un BO (EJB à chaque DO il associe un BO (EJB
Session)Session)
Il ne faut spécifier que les particularitésIl ne faut spécifier que les particularités
5555
«garçon… un exemple svp, pas trop serré »…!«garçon… un exemple svp, pas trop serré »…!
Exemple…Exemple…
5656
5757
NEORMFNEORMF
ExempleExemple
ApplicationApplication
BLBL
DALDAL
RLRL CLIENTCLIENTCLIENT_INFOCLIENT_INFO
FACTUREFACTURE
LigneFactureDAOLigneFactureDAOFactureDAOFactureDAO
FacturationBOFacturationBO
ApplicationApplication
ClientBOClientBO
ClientDAOClientDAO
LIGNE_FACTURELIGNE_FACTURE
5858
jbgen-config.xmljbgen-config.xml<?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?><jbgen><jbgen> <source><source> … </source>… </source> <object-mappings> … </object-mappings><object-mappings> … </object-mappings> <target> … </target><target> … </target> <object-definition> … </object-definition><object-definition> … </object-definition></jbgen></jbgen>
5959
jbgen-config.xmljbgen-config.xml<?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?><jbgen><jbgen> <source><source>
<driver value=<driver value="com.microsoft.jdbc.sqlserver.SQLServerDriver""com.microsoft.jdbc.sqlserver.SQLServerDriver"/>/> <url value=<url value="jdbc:microsoft:sqlserver://localhost;databaseName=sicar10""jdbc:microsoft:sqlserver://localhost;databaseName=sicar10"/>/> <user value<user value=“sa"=“sa"/>/> <password value=<password value=“"“"/>/> <schema value=<schema value=“dbo"“dbo"/>/> <include type=<include type="TABLE|VIEW""TABLE|VIEW" name= name="*""*"/>/> <exclude type=<exclude type="*""*" name= name=“sys*|dtprop*"“sys*|dtprop*"/>/> </source></source> <object-mappings><object-mappings>
…… </object-mappings></object-mappings> <target><target> … … </target></target> <object-definition> … </object-definition><object-definition> … </object-definition></jbgen></jbgen>
6060
jbgen-config.xmljbgen-config.xml<?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?><jbgen><jbgen> <source><source> … </source>… </source> <object-mappings><object-mappings> <data-objects><data-objects> <do name=<do name="Client""Client" table-list= table-list="CLIENT*""CLIENT*"/>/> </data-objects></data-objects> <business-objects><business-objects> <bo name<bo name="FacturationBO"="FacturationBO" do-list= do-list="*Facture*""*Facture*"/>/> </business-objects></business-objects> </object-mappings></object-mappings> <target> … </target><target> … </target> <object-definition> … </object-definition><object-definition> … </object-definition>
</jbgen></jbgen>
6161
jbgen-config.xmljbgen-config.xml<?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?><jbgen><jbgen> <source><source> … </source>… </source> <object-mappings> … </object-mappings><object-mappings> … </object-mappings> <target><target> <csharp-dao-target enabled=<csharp-dao-target enabled="true""true">> <datasource name=<datasource name="MyDataSource""MyDataSource"/>/> <package><package>org.vpc.neormf.testjbgenorg.vpc.neormf.testjbgen</package></package> <root-path><root-path>generated/csharp-dao-target/srcgenerated/csharp-dao-target/src</root-path></root-path> <log-generation enable=<log-generation enable="true""true" api= api="log4net""log4net" layers= layers="db""db">> <log-option name=<log-option name="layers""layers" value= value="db""db"/>/> </log-generation></log-generation> <dto-module><dto-module> <include type=<include type="*""*" name= name="*""*"/>/> <exclude type=<exclude type="none""none" name= name="none""none"/>/> </dto-module></dto-module> <dao-module/><dao-module/>
</csharp-dao-target></csharp-dao-target> </target></target> <object-definition> … </object-definition><object-definition> … </object-definition></jbgen></jbgen>
6262
jbgen-config.xmljbgen-config.xml<?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?><jbgen><jbgen> <source><source> … </source> <object-mappings> … </object-mappings>… </source> <object-mappings> … </object-mappings> <target> …</target><target> …</target> <object-definition><object-definition> <do name=<do name="Client""Client" title-field= title-field="cliName""cliName"/>/>
<do name="Facture"><do name="Facture"> <field name=<field name="facValid""facValid" isForbiddenOnInsert= isForbiddenOnInsert="true""true">> <converter><converter>INTEGER_TO_BOOLEANINTEGER_TO_BOOLEAN</converter></converter> </field></field> <field name=<field name="facMnt""facMnt">> <definition type=<definition type="FLOAT""FLOAT" nullable= nullable="false""false"/>/> <expression><expression> <sql-query-field-expression><sql-query-field-expression> Select Sum(LNF_PRIX*LNF_QTE) From Select Sum(LNF_PRIX*LNF_QTE) From
LIGNE_FACTURE Where FAC_ID=LNF_FAC_IDLIGNE_FACTURE Where FAC_ID=LNF_FAC_ID </sql-query-field-expression></sql-query-field-expression> </expression></expression>
</field></field> </do></do> </object-definition></object-definition></jbgen></jbgen>
6363
jbgen-defaultsjbgen-defaults
6464
GénérationGénération
Vérifier que le jdk1.5 est bien installé et Vérifier que le jdk1.5 est bien installé et mettez à jour le chemin dans « run-mettez à jour le chemin dans « run-jbgen.bat »jbgen.bat »
1- Lancer le générateur1- Lancer le générateur
6565
GénérationGénération
Sélectionner le répertoire contenant les Sélectionner le répertoire contenant les fichier de configurationfichier de configuration
6666
Code généréCode généré
6767
Code généré : DAOCode généré : DAO
6868
Code généré : DTOCode généré : DTO
6969
Code C#Code C#
Pour InsérerPour Insérer Les Identifiants auto et les séquences Les Identifiants auto et les séquences
sont gérés automatiquement sont gérés automatiquement (indépendamment de la base)(indépendamment de la base)
ClientDTOClientDTO client= client=newnew ClientDTO (); ClientDTO ();Client.cliName=Client.cliName="IER""IER" Client.cliAddress=Client.cliAddress="Paris""Paris" ClientDAOClientDAO dao= dao=newnew ClientDAO(); ClientDAO();ClientKeyClientKey key=dao.Insert(client); key=dao.Insert(client);
7070
Code C#Code C#
Pour Mettre à jourPour Mettre à jour Uniquement les colonnes spécifiées sont Uniquement les colonnes spécifiées sont
mises à jourmises à jour
ClientDTOClientDTO client= client=newnew ClientDTO (); ClientDTO ();Client.cliId=Client.cliId=1212;;Client.cliAddress=Client.cliAddress="Paris""Paris";;ClientDAOClientDAO dao= dao=newnew ClientDAO(); ClientDAO();dao.Update(client);dao.Update(client);
7171
Code JavaCode Java
Pour Mettre à jourPour Mettre à jour Uniquement les colonnes spécifiées sont Uniquement les colonnes spécifiées sont
mises à jourmises à jour
ClientDTOClientDTO client= client=newnew ClientDTO (); ClientDTO ();Client.Client.setsetCliId(CliId(1212); ); Client.Client.setsetCliAddress(CliAddress("Paris""Paris"););ClientDAOClientDAO dao= dao=newnew ClientDAO(); ClientDAO();ClientKeyClientKey key=dao. key=dao.setDatasetData(client);(client);
7272
Code C#Code C#
Pour SupprimerPour Supprimer
ClientKeyClientKey client= client=newnew ClientKey (3); ClientKey (3);ClientDAOClientDAO dao= dao=newnew ClientDAO(); ClientDAO();dao.Delete(client);dao.Delete(client);
7373
Code C#Code C#
Pour Récupérer un enregistrementPour Récupérer un enregistrement
ClientKeyClientKey id= id=newnew ClientKey (3); ClientKey (3);ClientDAOClientDAO dao= dao=newnew ClientDAO(); ClientDAO();ClientPropertiesClientProperties colonnes= colonnes=newnew ClientProperties(); ClientProperties();colonnes.addCliName().addCliId();colonnes.addCliName().addCliId();ClientDTOClientDTO client=dao.GetData(colonnes,id); client=dao.GetData(colonnes,id);
7474
Code C#Code C#
Pour Récupérer plusieurs Pour Récupérer plusieurs enregistrements par design Pattern « enregistrements par design Pattern « Prototype »Prototype »
ClientDTOClientDTO prototype= prototype=newnew ClientDTO(); ClientDTO();prototype.cliName=prototype.cliName="%to%""%to%" ; ;ClientPropertiesClientProperties colonnes= colonnes=newnew ClientProperties(); ClientProperties();colonnes.addCliName().addCliId();colonnes.addCliName().addCliId();ICollectionICollection tous=dao.Select( tous=dao.Select(
colonnes,prototype,null colonnes,prototype,null //ordre//ordre););
7575
ExtensibilitéExtensibilité
Code modifiable après générationCode modifiable après génération Tags intelligentsTags intelligents
/*@user_code:begin*//*@user_code:begin*/ /*@user_code:end*//*@user_code:end*/
Tout ce qui est entre ces deux lignes sera Tout ce qui est entre ces deux lignes sera conservé même après régénérationconservé même après régénération
Paramétrage du code généréParamétrage du code généré Règles de nommageRègles de nommage Possibilité de renommer une méthodePossibilité de renommer une méthode Possibilité de supprimer la génération d’une Possibilité de supprimer la génération d’une
méthodeméthode Possibilité de remplacer la génération d’une Possibilité de remplacer la génération d’une
méthodeméthode
7676
Outil graphiqueOutil graphique Désormais un plugin pour dbclient Désormais un plugin pour dbclient
(dbclient.dev.java.net) est disponible (dbclient.dev.java.net) est disponible pour ne plus avoir à écrire les fichiers pour ne plus avoir à écrire les fichiers XML manuellementXML manuellement
7777
« et le dessert? »…!« et le dessert? »…!
Conclusion…Conclusion…
7878
ConclusionConclusion
Intérêts:Intérêts: Design PatternsDesign Patterns Mapping Objet/RelationnelMapping Objet/Relationnel Génération de CodeGénération de Code
NEORMFNEORMF Pluri plateformes (java/j2ee/c#.net)Pluri plateformes (java/j2ee/c#.net) Pluri base de données (MSSQL, Oracle)Pluri base de données (MSSQL, Oracle) Une seule interface de configUne seule interface de config Génération de codeGénération de code
Optimisée pour les performancesOptimisée pour les performances Minimise les anomaliesMinimise les anomalies ExhaustivitéExhaustivité ExtensibilitéExtensibilité
7979
RéférencesRéférences
http://neormf.sourceforge.nethttp://neormf.sourceforge.net http://dbclient.dev.java.nethttp://dbclient.dev.java.net http://msdn.microsoft.com/practiceshttp://msdn.microsoft.com/practices http://msdn.microsoft.com/architecturehttp://msdn.microsoft.com/architecture http://shop.microsoft.com/practiceshttp://shop.microsoft.com/practices http://java.sun.comhttp://java.sun.com http://www.microsoft.comhttp://www.microsoft.com http://dotnet.developpez.nethttp://dotnet.developpez.net http://www.dotnet247.comhttp://www.dotnet247.com http://www.dotnetguru.orghttp://www.dotnetguru.org http://www.dotnet-fr.orghttp://www.dotnet-fr.org http://application-servers.comhttp://application-servers.com http://www.theserverside.comhttp://www.theserverside.com http://www.freeroller.nethttp://www.freeroller.net http://staff.develop.comhttp://staff.develop.com http://www.bytonic.dehttp://www.bytonic.de http://ils.unc.edu/blaze/java/javahist.htmlhttp://ils.unc.edu/blaze/java/javahist.html
8080
Merci !Merci !
Questions?