Vous êtes sur la page 1sur 240

Programmationclientserveur Programmation client serveur

KamalMOUMMADI

Objectifsdumodule Objectifs du module


Comprendrelensembledesconceptsdes architecturesclients/serveur Savoirconcevoir,dvelopperdesapplications client/serveur

plan
I. II. III. IV. V. VI. VII. VIII. Prsentationdel'architectured'unsystmeclient/serveur Introduction y / Avantagesdel'architectureclient/serveur Inconvnientsdumodleclient/serveur Fonctionnementd'unsystmeclient/serveur Prsentationdel'architecture2niveaux Prsentationdel'architecture3niveaux Comparaisondesdeuxtypesd'architecture L'architecturemulti_niveaux

Introductionauclient/serveur I d i li /

historique
1tape: uneseulemachine,1seulutilisateur E/S:voyantslumineux,interrupteurs / y , p 2tape: AmliorationdesE/s:lecteur(decartes),imprimantes Multiutilisateur,1programmelafois 3etape 3 t Monteenpuissance:multiexcution Tempspartag,apparitiondeterminaux 4tape p PCsdesanne80 volutiondesrseauxpourpermettreauxsystmescentrauxdecommuniquer 5tape stationsdetravail stations de travail Systmescentralisedesannes1970(grossystmes,terminauxpassifs,monoos, systmepropritaire,BDnonrelationnelles,langagesdeprogrammation:cobol,)

Besoins
ConsisteraliseruneintgrationdelinformatiquepersonnelledansleSI de lentrepriseaveclesobjectifssuivants: lentreprise avec les objectifs suivants: toututilisateurdanslentreprisedoitpouvoiraccdertouteinformationutilesa tachedslorsquecetaccsestautorisparlesrglesdeconfidentialitetde scurit Laccsdoittreinstantanetdoittrefaitpartirdenimportequelpostede travail Laccslinformationdoitavoirlieuuneinterfaceaussisimplequepossible, choisieparl utilisateur choisie par lutilisateur

volution
Architecturerpartie A hit t ti Rseaux,PCpluspuissant,Osouverts InterfacesetAPIstandards BDrelationnelles Langages4GL Outilsdetransports C/s
7

CaractristiquesdumodleC/s
Notiondeservice:leserveurestfournisseurdeservice.Leclientest N i d i l f i d i L li consommateurdeservices. Partagedesressources:unserveurtraiteplusieursclientsenmmetempset contrleleursaccsauxressources contrle leurs accs aux ressources Redimensionnement:ilestpossibledajouteretderetirerdesstationsclients. Intgrit:lesdonnesduserveursontgressurleserveurdefaoncentralise. Lesclientsrestentindividuelsetindpendants Les clients restent individuels et indpendants
8

Unegrandediversitdoutils
Ilcomportelescomposantssuivants: Il comporte les composants suivants: Unsystmeouvert UnsGBDsexcutantsurleserveur Desstationsdetravailpersonnellesavecinterfacegraphiqueconnectesaurseau Desoutilsdedveloppementdapplications DeslogicielsdetransportderequtesetrponsesassocisausGBDou indpendant Desoutilsdeconception,dedploiementetdemaintenancepourpermettrele suividucycledeviedesapplications
9

Pourquoileclient/serveur? Pourquoi le client/serveur?


Adaptl organisationdessocitsmodernes:(structuresenentitsdemoindre Adapt lorganisation des socits modernes: (structures en entits de moindre taille) p Grerlescontraintesdelentreprise Mieuxsatisfairelesclients g Fairefacelvolutiondesrgles Produiremieuxetplusvite y Mieuxmatriserlesystmedinformations Prendreencomptelvolutiondestechnologies Rduirelescots
10

Lasolutionclient/serveur La solution client/serveur


L architectureclient/serveurestl aboutissementd unensembled volutions Larchitecture client/serveur est laboutissement dun ensemble dvolutions technologiquessurvenuesdanslesvingtderniresannes: p , Capacitsmmoires, Performancesdesprocesseursetdesrseau g g p q , , volutionsdeslogiciels:interfacesgraphiques,multimdia,desinterfacesde communications Dfinition:modledarchitectureapplicativeolesprogrammessontrepartis entreprocessusclientsetserveurscommuniquantpardesrequtesavecrponses

11

Exempled utilisation Exemple dutilisation


Stenddeplusenplusverstouslesdomainesdactivits Gestiondebasededonnes L Lessystmesdemessageries,Web,Internet d i W b I Le calcul scientifique Lecalculscientifique

12

LesniveauxdunearchitectureC/s /
2niveaux: 2 niveaux: Plusieursclientsetunserveur. Dcoupageendeuxdelachargedelapplication 3ouNniveaux Unclient,plusieursserveurs Rpartitiondelachargeentreleclientetplusieursserveurs

13

Quandutiliserunmodle3 niveaux
L applicationcomprendplusde50classesouservices Lapplication comprend plus de 50 classes ou services Lesapplicationssontprogrammesdansdeslangagesdiffrentsoucritespardes organisationsdiffrentes i ti diff t Ilexisteaumoinsdeuxsourcesdedonneshtrognes,tellesquedeuxsGBD diffrents Lescommunicationsentreapplicationssontnombreuses Lachargeestleve,plusde50000transactionsparjourouplusde300 utilisateursaccdentlammebase

14

Architectureclient/serveur Architecture client/serveur


Notiondebases TechniquesdedialogueC/s(recherche) q g /( ) DiffrentstypesC/s Middleware

15

Client Client
Dfinition Dfi iti ProcessusdemandantlexcutionduneoprationunautreProcessus Parenvoidunmessagecontenantledescriptifdeloprationexcuter,et Attendantlarponsecetteoprationparunmessageenretour Attendant la rponse cette opration par un message en retour Ilesttoujourslinitiateurdudialogue

16

Serveur Serveur
Dfinition: ProcessusaccomplissantuneoprationSur demandedunclient,etTransmettantla rponsececlient
17

REQ&REP
Requte q Messagetransmisparunclientunserveur dcrivantloprationexcuterpourlecompteduclient Rponse Messagetransmisparunserveurunclient Suitelexcutionduneoprationcontenantlesparamtresderetourde lopration

18

DiffrentstypesC/s Diffrents types C/s

19

Couchesd uneapplication Couches dune application


1. 2. 2 Uneapplicationinformatiqueestreprsenteselonunmodleentroiscouches Une application informatique est reprsente selon un modle en trois couches Lacoucheprsentation (interfaceHomme/Machine): Gestiondel affichage Gestion de laffichage Logiquedelaffichage Lacouchetraitements quiconstituelafonctionnalitintrinsquede La couche traitements qui constitue la fonctionnalit intrinsque de lapplication: gq g q pp Lalogiquedetraitements:lossaturealgorithmiquedelapplication Lagestiondestraitementsdclenchesparlalogiquedetraitementsquiralise lamanipulationdesdonnesdelapplication(exemple:procduresSQL)

JSF

MarocTelecom

20

Couchesd uneapplication Couches dune application


Lacouchedonnes quiassurelagestiondesdonnes: La couche donnes qui assure la gestion des donnes : Lalogiquedesdonnesconstituantlesrglesrgissantlesobjetsdela basededonnes Lagestiondesdonnes(consultationetmisejourdes enregistrements.UnsystmedetypeSGBDRhabituellement,est responsablecettetache Ledcoupagepermetdestructureruneapplicationenmode client/serveur Lemoduledegestiondesdonnespeuttrehbergparunserveur distant
21

Architectureduneapplication multitiers
CLIENT Lger Applet Java Oracle 8i

HTTP

Serveur d application Applet Java l

SQL SQ PL/SQL

Net8 N t8
CLIENT LOURD Application J D B C

Procdures Java

Net8 N 8

Java

22

C/sorientclientouserveur C/s orient client ou serveur


Clientlourd(FatClient)
Stockelesdonnesetlesapplicationslocalement.Leserveurstockeles pp fichiersmisjour leclientobtientunebonnepartiedutraitement:serveurdebasede le client obtient une bonne partie du traitement: serveur de base de donnes,defichiers, Leserveurestplusallge

23

C/sorientclientouserveur C/s orient client ou serveur


Serveurlourd(Fatserver): Serveur lourd (Fat server): Onmetplusdechargesurleserveur Plusfacilesgrercaronpeutenrichirleserveursanstropaffecterlesclients Plus faciles grer car on peut enrichir le serveur sans trop affecter les clients Clientlger(ThinClient) Clientfonctionnalitminimale:terminaux,stationsdetravailsansdisquedur Beaucoupdechargesurleserveur

24

DiffrentstypesdeC/S
ModledeGartnerpourlessystmesdeuxniveaux(2tiers):

Prsentation

Donnes

Traitement T it t

client

serveur
Prsentation rhabillage g donnes transaction Systme rpartie y p

25

DiffrentstypesdeC/S Diffrents types de C/S


C/Sdeprsentation: Leclientnegrequelesdialoguesaveclutilisateur L li t l di l l tili t Interfaceutilisateur Rhabillage: Prsentationrepartie p Onrajouteunclientuneapplicationexistante C/Sdedonnes: Servicedefichier Accsauxdonnes Accs aux donnes RequtesdutypeSQL Transactionrparties: Applicationdes2cots Soustraitance Systmesrpartis: Tousdes2cots coopration
26

Intrttechniquesdeclientserveurdedonneset transactions t ti
Miseencommundeprocduresrutilisable: p Dveloppementdebibliothquedeprocdures Scuritdesaccsauxdonnes: Authentificationdesutilisateursetcontrledesdroits daccs Gestion transactionnelle fiable: Gestiontransactionnellefiable: Atomicit,cohrence,misejour,journaux,etcparle serveur Diminutionducodagedesapplication AccsauinformationviaSQL Pasdegestiondescuritetdecohrenceauniveau applicatif

27

Client/serveurtroisniveaux Client/ serveur trois niveaux

28

Fonctionnementd unsystmec/S Fonctionnement dun systme c/S


Leclientmetunerequteversleserveurgrcesonadresseetleport, quidsigneunserviceparticulierduserveur Leserveurreoitlademandeetrpondlaidedeladressedelamachine clientetsonport

29

Middleware Middleware
Dfinition:Ensembledesserviceslogicielsconstruitsaudessusd un Dfinition: Ensemble des services logiciels construits au dessus dun protocoledetransportafindepermettrelchangederequtesetdes rponsesentreleclientetleserveurdemaniretransparente: t l li t t l d i t t Transparenceauxrseaux Transparenceauxserveurs Transparenceauxlangages

30

Fonctionsd unmiddleware Fonctions dun middleware


Procduredeconnexion: Oprationpermettantdouvrirunchemindepuisunclient versunserveurdsigneparunnom,avecauthentification delutilisateurassociparunnometunmotdepasse d l tili t i t td Prparationderequtes: Oprationconsistantenvoyerunerequteavecdes Opration consistant envoyer une requte avec des paramtresnoninstanciesunserveurafinquilprpares lexcution Excutionderequte: Oprationconsistantenvoyerunedemandedexcutionde requteprcdemmentprpareunserveur,en requte prcdemment prpare un serveur en fournissantlesvaleursdesparamtres
31

Fonctionsd unmiddleware Fonctions dun middleware


Rcuprationdesrsultats: Oprationpermettantderamenertoutoupartiedursultatdune requtesurleclient Cachedersultats: Techniquepermettantdetransfrerlesrsultatsparblocsetdeles conserversurleclientou/etsurleserveurafindelesrutiliserpour rpondredesrequtes p q Cachederequtes Techniquepermettantdeconserverdesrequtescompilessurle serveurafindelesrutilisepourrpondredesquestionsimilaires serveur afin de les rutilise pour rpondre des question similaires Procdurededconnexion Oprationinversedelaconnexion,permettantdefermerlechemin ouvertdepuisleclientversleserveurassoci ouvert depuis le client vers le serveur associ
32

Architecturedumiddleware Architecture du middleware


Client
Application client Middleware OS

Serveur
Application serveur

I2 I1

I3

Middleware OS

I2 I1

Carte rseau C

Carte rseau C

33

Architecturedumiddleware Architecture du middleware


I1 est linterface la plus simple dans larchitecture : un middleware est estl interfacelaplussimpledansl architecture:unmiddlewareest compatibleunOSounon I2 reprsentelintgrationaveclapplication:API I3 estuneinterfacelogique.Fournituneintgrationentreles composantesdumiddlewaredelamachineclienteetlamachineserveur Lechoixdemiddlewaredpenddelafaondontcesinterfaces(I1,I2,I3) adhrent

34

Listecompatibled interfaces Liste compatible dinterfaces


Interface 1: systme dexploitation 2: application Usage Client OS Serveur OS Environnement de dveloppent Technique de communication du middleware exemple Windows NT Windows NT Server Java, c, c++, vb

3: communication

ODBC,CORBA,RPC

35

Middlewarebasededonnes Middleware base de donnes


L LessystmesBDsebasentgnralementsurlarchitecture BD b l l hi clientserveurdeuxniveaux Clientquiformatelesdonnespourlaprsentation Middleware:comprendlapplicationduprogrammeurpour accderetmanipulerlesdonnesstocksdanslesserveurs accder et manipuler les donnes stocks dans les serveurs distants

36

OpenDataBase Connectivity(ODBC)
Objectif: liminer la relation entre lapplication client et le serveur liminerlarelationentrel applicationclientetleserveur
deBD.Dveloppementdesapplicationouvertes. DveloppsparMicrosoftaudbutde1992etprsentcommeune interfaceuniverselled accsauserveursdedonnes interface universelle daccs au serveurs de donnes ConuesautourSQL ArchitectureODBCconsisteendeuxcouche: Gestionnairedepilots:dfinirlepiloteadquatpourlaBD PiloteODBC: traduitlesrequtesSQLformulespar ODBCenmessagecomprhensibleparleSGBD Inconvnients ODBCncessitedinstallerundriverODBCsurlamachinecliente. ODBC ne pourrait pas tre employ dans java car son interface est en ODBCnepourraitpastreemploydansjavacarsoninterfaceesten langageC ODBCnestpasobjet. 37

JavaDataBaseConnectivity(JDBC) y( )
JDBCestuneAPId accsauxsystmesdegestiondebasededonnes JDBC est une API daccs aux systmes de gestion de base de donnes relationnellesquipermetdexcuterdesrequtesSQLauseindun p g programmeJava etdercuprerlesrsultats,cequireprsenteune p , q p alternativeauxsolutionspropritaires LesclassesdeJDBCversion1.0sontregroupesdanslepackagejava.sqlet g p p g j q sontinclusesdansleJDKpartirdesaversion1.1.Laversion2.0decette APIestinclusedanslaversion1.2duJDK JDBC(JavaDatabaseConnectivity),estunebibliothquedeclasses(et surtoutd'interfaces)quipermetdetravailleravecdiffrentsserveursde basesdedonnesrelationnelles.
38

JavaDataBaseConnectivity(suite) y( )

JDBCestunframeworkquiabstraitlaccsdesbasesdedonnes relationnelles

Ilpermetlaconnexion/dconnexiondesbasesdedonnes IlpermetlenvoiderequtesSQLetlagestiondestransactions JDBCdfinituneinterfacecommunedemanipulationdeSGBDR JDBCestassociaupaquetagesjava.sqletjavax.sql(extension) JDBC est associ au paquetages java sql et javax sql (extension)
39

Lesoutilsncessairespourutiliser JDBC
1 LesclassesdeJDBCjava.sqletjavax.sql. 2 PourpouvoirutiliserJDBC,ilfautunpilotequiestspcifiquelabasede donneslaquelleonveutaccder.AvecleJDK,Sunfournitunpilotequi permetl accsauxbasesdedonnesviaODBC. permet l'accs aux bases de donnes via ODBC 3 Cepilotepermetderaliserl'indpendancedeJDBCvisvisdesbasesde donnes.

Laplupartdesfabricantsproposedetels pilotes,pourquel'onpuisseeffectivement seconnecterleurbasededonnesdepuis se connecter leur base de donnes depuis Java.


40

JDBCetlesarchitecturesclientsserveursmultitiers

2 tiers 2tiers

3tiers
41

Architecture JDBC ArchitectureJDBC


Java Appli/Applet pp pp JDBC API JDBC DriverManager JDBC Driver API JDBC-ODBC bridge driver ODBC driver
Proprietary protocol

JDBC driver for Oracle

JDBC driver for Sybase

JDBC-Net driver

Proprietary protocol

JDBC protocol

Oracle

Sybase

Oracle

Sybase

42

ArchitectureJDBC Architecture JDBC


Gestionnaire de drivers (driver manager): Gestionnairededrivers(drivermanager):
chaqueprogramme.Javachargele(oules)driversdontilabesoin drivermanager=gestionnairedetouslesdriverschargsparun programmeJava DriverJDBC:grelesdtailsdescommunicationsavecuntypedeSGBD untypededriverparBD(Oracle,MySQL,PostGres,...) ilexisteundrivergnriqueJDBCODBCpourtouteslesdonnes accessiblesparODBC SGBD:MSAccess,SQLServer,Oracle,dBase,... , , , , tableurs:Excel,... toutautreapplicationconformeODBC

43

Chargerunpiloteenmmoire Charger un pilote en mmoire


Il existe quatre types de pilote JDBC : IlexistequatretypesdepiloteJDBC:
Type1(JDBCODBCbridge): lepontJDBCODBCqui s utiliseavecODBCetunpiloteODBCspcifique s'utilise avec ODBC et un pilote ODBC spcifique pourlabaseaccder.Cettesolutionfonctionne trsbiensousWindows.

44

LestypesdepilotesJDBC
Type2: unpilotecritenJavaappellel'APInativedelabasede
donnes.CetypedepiloteconvertitlesordresJDBCpourappeler directementlesAPIsdelabasededonnes.Ilestdecefaitncessairede fournirauclientlAPInativedelabasededonnes.Ellessont gnralementenCouenC++.

45

LestypesdepilotesJDBC Les types de pilotes JDBC


Type3 : unpilotecritenJavautiliseunprotocolerseauspcifique
pourdialogueravecunserveurintermdiaire.Cetypedepiloteutiliseun protocolerseaupropritairespcifiqueunebasededonnes.Un serveurddireoitlesmessagesparceprotocoleetdialogue directementaveclabasededonnes

46

LestypesdepilotesJDBC Les types de pilotes JDBC


Type4: unpiloteJavanatif:Cetypedepilote,critenJava,appelle
directementleSGBDparlerseau.Ilssontfournisparl'diteurdelabase dedonnes.Cetypededriverestlasolutionidale,tantauniveaudela simplicitquedesperformancesetdudploiement.

47

LestypesdepilotesJDBC Les types de pilotes JDBC


Liste de quelques pilotes : Listedequelquespilotes
PourunebaseOracle : oracle.jdbc.driver.OracleDriver PourunebaseAccess : sun.jdbc.odbc.JdbcOdbcDriver PourunebasePostgreSQL :postgresql.Driver Pour une base MySQL : org.gjt.mm.mysql.Driver PourunebaseMySQL :org.gjt.mm.mysql.Driver

48

Structuregnrale Structure gnrale


Poureffectueruntraitementavecunebasede donnes,ilfaut donnes il faut :
chargerunpiloteenmmoire, tabliruneconnexionaveclabasededonnes, bl l b d d rcuprerlesinformationsrelativeslaconnexion, excuterdesrequtesSQLet/oudesprocdures stockes, rcuprerlesinformationsrenvoyesparlabasede l f l b d donnes(sincessaire), f fermerlaconnexion. l i
49

JDBCClassUsage JDBC Class Usage


DriverManager Di M Driver Connection Statement

ResultSet
50

Prsentationdesclassesdel'API JDBC LAPIJDBCestcomposededeuxPackagesjava.sqletjavax.sqljava.sql:


Packagedebasedel API. Package de base de lAPI. javax.sql:packageoptionneltendlesfonctionnalitsdejava.sqletpermet ledveloppement3 tiers(l APIfonctionnectserveur) le dveloppement 3tiers (lAPI fonctionne ct serveur) JDBC1.0(1997) JDBC4.0(2005) JDBC 4 0 (2005) Ilya4classesimportantes:DriverManager,Connection,Statement (et PreparedStatement),etResultSet,chacunecorrespondantunetapede PreparedStatement ) et ResultSet chacune correspondant une tape de l'accsauxdonnes:

51

Vuedensembledupaquetage j java.sql q

52

LesprincipalesinterfacesdeJDBC Les principales interfaces de JDBC


CallableStatement: Grelesprocduresstockesavecparamtresdesortie Connection: GrelesconnexionsaveclaBDD DatabaseMetaData FournitdesinformationssurlaBDD Driver Di Interfacespcifiquechaquepilote PreparedStatement Interfacedexcutiondesrequtesetdesprocduresstockesdynamiques q p y q ResultSet Grelesrsultatsdunerequte ResultSetMetaData Fournitdesinformationssurlesrsultats Fournit des informations sur les rsultats Statement InterfacedexcutiondesrequtesSQLetdesprocduresstockesnormales

53

LesprincipalesinterfacesdeJDBC Les principales interfaces de JDBC


Date EncapsuleunedateauformatdesBDD DriverManager PermetdecrerdesconnexionslaBDD DriverPropertyInfo Grelespilotes Time EncapsuleunevaleurdetypeTime E l l d t Ti Timestamp EncapsuleunevaleurdetypeTimestamp Types Fournitunelistedentiers

54

LesexceptionsdeJDBC Les exceptions de JDBC


DataTrunction

SQLException

SQLWarning

55

Prsentationdesclassesdel'APIJDBC

Remarque : Chacune de ces classes dpend de l'instanciation d'un objet de la prcdente classe.

56

Structuregnrale Structure gnrale


Poureffectueruntraitementavecunebasededonnes,ilfaut : chargerunpiloteenmmoire, tabliruneconnexionaveclabasededonnes, rcuprer les informations relatives la connexion rcuprerlesinformationsrelativeslaconnexion, excuterdesrequtesSQLet/oudesprocduresstockes, rcuprerlesinformationsrenvoyesparlabasededonnes(si ncessaire), ncessaire) fermerlaconnexion.

57

Laconnexionunebasededonnes:Le chargement du pilote:


Pour se connecter une base de donnes, il faut tout d'abord charger le pilote qui fait le lien entre les deux deux. try { Class.forName(driver"); } catch (ClassNotFoundException e) { ... } 1. Il n'est pas ncessaire de crer une instance de cette classe et de l enregistrer l'enregistrer avec le DriverManager car l appel Class forName le fait l'appel Class.forName automatiquement : ce traitement charge le pilote et crer une instance de cette classe. 2. La mthode static forName() de la classe Class peut lever l'exception java.lang.ClassNotFoundException. l Cl N F dE

1)Le chargement du pilote:

3. Force le chargement dans la JVM de la classe implmentant le driver JDBC pour le SGBDR cible. Lors du chargement, le driver senregistre auprs du DriverManager JDBC
58

Laconnexionunebasededonnes:Le chargement du pilote


1)Le chargement du pilote:
try { Pour se connecter une base de donnes via ODBC, il faut tout d'abord charger le pilote JDBCODBC qui fait le lien entre les deux. Class.forName( sun.jdbc.odbc.JdbcOdbcDriver ); Class forName("sun jdbc odbc JdbcOdbcDriver"); } catch (ClassNotFoundException e) { ... }

Pour se connecter une base en utilisant un driver spcifique, la documentation du driver fournit le nom de la classe utiliser. Par exemple, si le nom d l classe est package.DriverXXX, l chargement d d i de la l t k Di XXX le h t du driver se f fera avec le code suivant :Class.forName("package.DriverXXX");

59

Enregistrer une base de donnes dans ODBC sous Windows XP

Sous Windows XP, il faut double cliquer sur l'icne "Source de donnes q (ODBC)" dans le rpertoire "Outils d'administration" du panneau de configuration. nfi ti n

60

Enregistrer une base de donnes dans ODBC sous Windows XP


L'outil se compose de plusieurs onglets. L'onglet "Pilote ODBC" liste l'ensemble des pilotes qui sont installs sur la machine machine. L'onglet "Source de donnes utilisateur" liste l'ensemble des sources de donnes pour l'utilisateur couramment connect sous Windows. L'onglet "Source de donnes systme" liste l'ensemble des sources de donnes accessibles par tous les utilisateurs.

61

Enregistrer une base de donnes dans ODBC sous Windows XP


Le plus simple est de crer une telle source de donnes en cliquant sur le bouton "Ajouter". Une boite de dialogue permet de slectionner le pilote qui sera utilis par la source de donnes.

Il suffit de slectionner le pilote et de cliquer sur "Terminer". Dans l'exemple ci dessous, le pilote slectionn concerne une base Oracle

62

Enregistrer une base de donnes dans ODBC sous Windows XP

Il suffit de saisir les informations ncessaires notamment le nom de la source de donnes et le serveur sql connecter. Et clic sur le bouton Suivant .

63

Enregistrer une base de donnes dans ODBC sous Windows XP

Un clic sur le bouton Terminer cre la source de donnes qui pourra alors t i l s tre utilise.

64

Laconnexionunebasededonnes:Le chargement du pilote


chargementdupilotepourunebaseMySQL: try { Class.forName("org.gjt.mm.mysql.Driver"); Cl f N (" jt l D i ") }catch (ClassNotFoundExceptione){ ... } chargementdupilotepourunebaseOracle: t y{ try{ Class.forName("oracle.jdbc.driver.OracleDriver"); System.out.println("lepiloteestcharg"); } catch(ClassNotFoundExceptionex){ System.out.println("lepiloten'estpascharg"+ex.getMessage()); }
65

Structuregnrale Structure gnrale


Poureffectueruntraitementavecunebasededonnes,ilfaut Pour effectuer un traitement avec une base de donnes il faut : chargerunpiloteenmmoire, tabliruneconnexionaveclabasededonnes, rcuprerlesinformationsrelativeslaconnexion, excuterdesrequtesSQLet/oudesprocduresstockes, rcuprerlesinformationsrenvoyesparlabasededonnes(si rcuprer les informations renvoyes par la base de donnes (si ncessaire), f fermerlaconnexion. l i
66

Laclassejava.sql.DriverManager La classe java.sql.DriverManager

67

Laconnexionunebasededonnes
2) L'tablissement de la connection
Pour se connecter une base de donnes, il faut instancier un objet de la classe Connection en lui prcisant sous forme d'URL la base accder. Connection con = DriverManager.getConnection(URL ); La syntaxe URL peut varier d'un type de base de donnes l'autre mais elle d un l autre est toujours de la forme : protocole:sous_protocole:nom

68

Laconnexionunebasededonnes
L'tablissement de la connection Le code suivant dcrit la cration d'une connection avec un user et un mot de passe : Connection con = DriverManager.getConnection(chaine, "myLogin", "myPassword"); myPassword ); A la place de " myLogin " ; il faut mettre le nom du user qui se connecte la base et mettre son mot de passe la place de "myPassword " String chaine = "jdbc:odbc:factures"; Connection con = D i M C ti DriverManager.getConnection(chaine, "t t " " tC ti ( h i "toto", "passwd"); d")

69

Laconnexionunebasededonnes
2) L'tablissement de la connection: JDBC-ODBC
public static Connection con=null; String chaine = "jdbc:odbc:testDB"; con = DriverManager.getConnection(chaine );

jbdc dsigne le protocole est vaut toujours jdbc . odbc dsigne le sous protocole qui dfinit le mcanisme de connection pour un type de bases de donnes. Le nom de la base de donnes doit tre celui saisi dans le nom de la source sous ODBC.

70

Laconnexionunebasededonnes
GrceaupontJDBCODBC Stringurl="jdbc:odbc:DB"; GrceundriverspcifiqueMySQL Stringurl="jdbc:mysql://server/DB"; GrcedesdriversspcifiqueOracle Stringurl="jdbc:oracle:thin:@server:1521:DB"; try{ con=DriverManager.getConnection(url,"system","123"); System.out.println("conctionestetablie"); } catch(SQLExceptione){ System.out.println("laconctionn'estpascharg"+e.getMessage()); }

71

Laconnexionunebasede donnes
jdbc:oracle:thin:@server:1521:DB jdb l thi @ 1521 DB oracle:thinestlesousprotocole(driverthinOraclefournitaussi unautretypededriver) @ @server:1521:DBdsignelabasededonnesINFOsituesurla 1521 DB d i l b d d INFO it l machinesirocco(leserveurduSGBDcoutesurleport1521) Laformeexactedespartiessousprotocoleetbasededonnesdpenddu SGBDcible SGBD cible
72

Laconnexionunebasede donnes
LinterfaceConnection disposedeplusdemthodespermettantde fermerlaconnexionainsiquedetestersontat : publicvoid close()throws SQLException; publicboolean isClosed()throws SQLException;

73

Lesmthodesdelinterface: Connection
clearWarnings: vacuelesavertissementsliscetteconnexion close: F l FermelaconnexionlaBDD l i l BDD commit: Lorsquelecommitautomatiqueestdsactiv,permetdefaireun commit. createStatement: CreunobjetpouvantservirexcuterdesrequtesSQL getAutoCommit/setAutoCommit getCatalog/setCatalog getMetaData:RetourneuneinstancedeDatabaseMetada getWarnings:RetourneuneinstancedeSQLWarningliecetteconnexion getWarnings: Retourne une instance de SQLWarning lie cette connexion isClosed:Retourneunboolenindiquantsilaconnexionestferme isReadOnly /setReadOnly:RetourneunboolenindiquantsilaBDDestaccessible enlectureseulement nativeSQL prepareCall:RetourneuneinstancedeCallableStatementcontenantune procdurestocke.UtilepourlesprocduresayantdesparamtresdeE/Soude sortie prepareStatement:RetourneuneinstancedePreparedStatementpermettant prepareStatement Retourne une instance de PreparedStatement permettant dexcuterdesrequtesSQLdynamiques Rollback:RevientsurlesdernierschangementseffetusparlaBDD.Doittre 74 employeenconjonctionavecsetAutoCommit(false)

Exemple Exemple

// //Chargerunpilotespcifiquelabasededonnesetobteniruneconnexionlabase g p p q dedonnes.
75

Structuregnrale Structure gnrale


Poureffectueruntraitementavecunebasededonnes,ilfaut : chargerunpiloteenmmoire, tabliruneconnexionaveclabasededonnes, rcuprerlesinformationsrelativeslaconnexion, excuterdesrequtesSQLet/oudesprocduresstockes, / rcuprerlesinformationsrenvoyesparlabasededonnes(si ncessaire), fermer la connexion fermerlaconnexion.
76

ExcuterdesrequtesSQLet/oudesprocdures stockes t k
TypesderequtesSQL: 1. StatementrequteSQL"normale 1 St t t t SQL " l 2. PreparedStatementrequteSQLprcompile 3. CallableStatementprocdurestocke PreparedStatement: RequteSQL Prcompile pouvant tre paramtre pouvanttreparamtre pouvanttreexcute+sieursfois greparleclientJDBC CallableStatement ProcdurestockedanslaBD criteaveclelangageinternedelaBD pouvanttreparamtre Pouvanttreexcute+sieursfois Pouvant tre excute +sieurs fois greparlaBD
77

L interfacejava.sql.Statement Linterface java.sql.Statement

78

ExcutionderequtesSQL
1) L'excution de requtes SQL
Les L requtes d'i t t d'interrogation SQL sont excutes avec l mthodes ti t t les th d d'un objet Statement que l'on obtient partir d'un objet Connection:

Statement stmt = con.createStatement(); ();


Pour une requte de type interrogation (SELECT), la mthode utiliser de la classe Statement est excuteQuery. Pour des traitements de mise jour, il faut utiliser la mthode executeUpdate(). Lors de l'appel l mthode d'excution, il est ncessaire d l i f la th d d' ti t i de lui fournir en paramtre i t la requte SQL sous forme de chaine

79

ExcutionderequtesSQL
Le rsultat d'une requte d'intrrogation est renvoy dans un objet de la classe ResultSet par la mthode executeQuery(). ResultSet rsultats = null; String requete = "SELECT * FROM client"; try { Statement stmt = con.createStatement(); rsultats = stmt.executeQuery(requete); } catch (SQLException e) { //traitement de l'exception }
80

ExcutionderequtesSQL
UnobjetStatementreprsenteunesimple(seule)requteSQL. UnappelexecuteQuery(),executeUpdate()ouexecute()ferme implicitementtoutResultSetactifassociaveclobjetStatement. AvantdexcuteruneautrerequteavecunobjetStatementilfauttre srdavoirexploitlesrsultatsdelarequteprcdente. Exemple: Statementstmt=conn.createStatement(); ResultSetrs1 stmt.executeQuery(myQuery1); ResultSet rs1 =stmt.executeQuery(myQuery1); ResultSetrs2=stmt.executeQuery(myQuery2); //exploitationdesrsultatsdemyQuery1 while(rs1.next(){...} hil ( 1 t() { } //exploitationdesrsultatsdemyQuery2 while(rs2.next(){...}
81

ExcutionderequtesSQL
Exemple: Statementstmt conn.createStatement(); Statement stmt =conn.createStatement(); ResultSetrs1=stmt.executeQuery(myQuery1); //exploitationdesrsultatsdemyQuery1 while(rs1.next(){...} ResultSetrs2=stmt.executeQuery(myQuery2); //exploitationdesrsultatsdemyQuery2 while(rs2.next(){...} Remarque: Siapplicationncessitedeffectuerplusdune q , requtesimultanment,ncessairedecreretutiliserautant d'objetsStatement.
82

ExcutionderequtesSQL
Traitementparlots(batch) But:rduirelecotd unesriedemisejour But : rduire le cot d'une srie de mise jour Crationd'unerequteenutilisantunobjetdelaclasseConnectionStatementst =cx.createStatement(); (); Ajoutdesdiffrentesrequtes st.addBatch("INSERTINTOagesVALUES('Pierre',45)"); st.addBatch("INSERTINTOagesVALUES('Anne',45)"); st.addBatch("UPDATEagesSETage=15WHEREnom='Paul'"); Excutiondesrequtes(dansl'ordredanslequelellesonttajoutes) int[]res=st.executeBatch();

83

Structuregnrale
Poureffectueruntraitementavecunebasededonnes,ilfaut : chargerunpiloteenmmoire, tabliruneconnexionaveclabasededonnes, rcuprerlesinformationsrelativeslaconnexion, excuterdesrequtesSQLet/oudesprocduresstockes, excuter des requtes SQL et/ou des procdures stockes rcuprerlesinformationsrenvoyesparlabasededonnes(si ncessaire), ) fermerlaconnexion.

84

Accderlabasededonnes
Une fois la connexion tablie, il est possible d'excuter des ordres SQL. Les objets qui peuvent tre utiliss pour obtenir des informations sur la base de donnes sont :

85

Linterfacejava.sql.ResultSet
JDBC1.X:Ilseparcourtitrativementligneparligne par la mthode next() parlamthode retournefalse siderniertuplelu,true sinon chaqueappelfaitavancerlecurseursurletuplesuivant initialement,lecurseurestpositionnavantlepremiertuple excuternext()aumoinsunefoispouravoirlepremier

while(rs.next()) {// Traitement de chaque tuple} impossible de revenir au tuple prcdant ou de parcourir lensemble dans un ordre alatoire

86

Linterfacejava.sql.ResultSet

87

ResultSetJDBC2.0
PardfautlorsqueloncreunStatementlesobjetsResultSetsontenlectureseule(read only)etaccssquentiel(forwardonly) AvecJDBC2.0possibilitdecrerdesResultSet p Scrollable: plusdelimitationunparcourssquentiel Updatable: possibilitdemodifierlesdonnesdanslaBD publicStatementcreateStatement(intresultSetType,intmode) resultSetType == ResultSet.TYPE_FORWARD_ONLY ResultSet.TYPE_SCROLL_SENSITIVE ResultSet.TYPE_SCROLL_INSENSITIVE mode == ResultSet.CONCUR_READ_ONLY ResultSet.CONCUR_UPDATABLE Exemple: Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

88

ResultSetJDBC2.0
TYPE_FOWARD_ONLY :parcoursdesrsultats enavantseulement. en avant seulement TYPE_SCROLL_INSENSITIVE :toutdplacement estpossible.Parcontre,silesdonnessont bl l d modifies,etquelonrevientsurunelignedj visite,lavaleurvisibleseralavaleurdorigine l l bl l l d etnonlavaleurmodifie. TYPE_SCROLL_SENSITIVE :toutdplacement estpossible.,Silesdonnessontmodifies,et quelonrevientsurunelignedjvisite,la valeurvisibleseralavaleurmodifie.

89

Linterfacejava.sql.ResultSet

90

Linterfacejava.sql.ResultSet

91

Modifierlersultatoulabase
PourpouvoirmodifierlesdonnescontenuesdanslinstancedeResultSet,celuici metdispositiondesmthodespermettantde : Modifierlavaleurdutypedonnetlacolonnedonne(parindiceouparnom) de yp (p p ) lenregistrementactuellementpointparlecurseur: publicvoidupdateXxxx(intindiceCol,Xxxxvalue) ; publicvoidupdateXxxx(StringnomCol,Xxxxvalue) ; oXxxxestletypedelavaleur updateString(intindiceCol,Stringvalue) updateString(int indiceCol String value) ; updateInt(intindiceCol,intvalue) ; Appliquerdanslabasededonnesleschangementseffectussurlenregistrement actuellementpointparlecurseur : publicvoidupdateRow(); public void updateRow(); Insrerdanslabasededonneslenregistrementactuellementpointparle curseur : publicvoidinsertRow(); public void insertRow(); Allersurunemplacementvidepermettantdinsrerunnouvelenregistrement : publicvoidmoveToInsertRow();

92

Modifierlersultatoulabase
Modification duResultSet Seplacersurlerangconcern ModifielavaleurduPassworddanslersultat rs.updateString("Password","toto"); Pourappliquerlesmodificationsdanslabasededonnes: Rs.updateRow(); Exemple: Statementstmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSetrs=stmt.executeQuery("SELECTNOM,PRENOMFROMCLIENTS); rs.first(); rs.updateInt(2,"toto"); rs.updateRow();

93

Modifierlersultatoulabase
Suppressionduneligne
S l Seplacersurlaligne l li deleteRow()

Exemple:
rs.last(); rs.deleteRow();

Insertionduneligne g
moveToInsertRow() Mthodes Mthodes updateXXX() MthodesMthodesupdateXXX() PuisinsertRow();

94

Modifierlersultatoulabase
Exemple: ResultSetrs=stmt.executeQuery("SELECTNOM,ID_CLIENT y( , _ FROMCLIENTS); rs.moveToInsertRow(); rs.updateString(1, toto ); rs updateString(1 "toto"); rs.updateInt(2,41); rs.insertRow(); Remarque: Siaucunevaleurnestspcifiepourunecolonnenacceptant paslavaleurnul,uneSQLExceptionestlance. pas la valeur nul une SQLException est lance moveToCurrentRow()permetdeserepositionnersurlaligne couranteavantlappelmoveToInsertRow() TouslesResultSetnesontpasncessairementmodifiables:En gnrallarequtenedoitrfrencerquuneseuletablesans jointure

95

Linterfacejava.sql.ResultSet

96

Linterfacejava.sql.ResultSet
CorrespondancestypesdonnesSQL/Java

97

Linterface java.sql.ResultSet

Autresaccesseurs:getInt,getShort,getLong,getFloat,
getDouble,getByte,getArray,getBigDecimal,getBlob,getClob, getBoolean,getDate,getTime,getTimestamp,getRef, getBoolean getDate getTime getTimestamp getRef getString,getURL
98

Linterfacejava.sql.ResultSet

99

Linterfacejava.sql.ResultSet

Autresaccesseurs updateInt,updateShort,updateLong,updateFloat,updateDouble, updateByte,updateArray,updateBigDecimal,updateBlob, updateClob,updateBoolean,updateDate,updateTime, updateClob updateBoolean updateDate updateTime updateTimestamp,updateRef,updateString,updateURL, updateAsciiStream,updateBinaryStream,updateCharacterStream,, updateBytes,updateObject,updateRow

100

Exemplecomplet
importjava.sql.*; publicclassTestJDBC{ publicstaticvoidmain(String[]args)throwsException{ Class.forName("oracle.jdbc.driver.OracleDriver"); Connectionconn=DriverManager.getConnection(""jdbc:oracle:thin:@localhost:1521:DB", "system","123"); Statementstmt=conn.createStatement(); ResultSetrs=stmt.executeQuery("SELECT*fromemploye"); l (" *f l ") while(rs.next()){ Stringnom=rs.getString("nom"); Stringprenom=rs.getString("prenom"); Stringemail=rs.getString("email"); S i il S i (" il") } rs.close(); stmt.close(); conn.close(); l () } }

101

Metadata :INFORMATIONS DE LA STRUCTURE DE LA BASE DE DONNEES


1) La classe ResultSetMetaData La mthode getMetaData() d'un objet ResultSet retourne un objet de typeResultSetMetaData. Cet objet permet de connatre le nombre, le nom et le t R ltS tM t D t C t bj t td t l b l tl type des colonnes.

102

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class Main { public static void main(String[] args) throws Exception { String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; Connection con; Statement stmt; ResultSet uprs; try { Class.forName(driver); con = DriverManager.getConnection("jdbc:odbc:RainForestDSN", "student","student"); stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); uprs = stmt.executeQuery("SELECT * FROM R t t t Q ("SELECT Records"); d ") // Check the column count ResultSetMetaData md = uprs.getMetaData(); System.out.println("Resultset has " + md.getColumnCount() + " cols."); int rowNum = uprs.getRow(); System.out.println( row1 System out println("row1 " + rowNum); uprs.absolute(1); rowNum = uprs.getRow(); System.out.println("row2 " + rowNum); uprs.next(); uprs.moveToInsertRow(); uprs.updateInt(1, 150); uprs.updateString(2, Madonna ); uprs updateString(2 "Madonna"); uprs.updateString(3, "Dummy"); uprs.updateString(4, "Jazz"); uprs.updateString(5, "Image"); uprs.updateInt(6, 5); uprs.updateDouble(7, 5); uprs.updateInt(8, 15); uprs.insertRow(); uprs.close(); stmt.close(); con.close(); } catch (SQLException ex) { System.err.println("SQLException: " + ex.getMessage()); }

103

Metadata:INFORMATIONSDELASTRUCTUREDELABASEDEDONNEES
Mtabase LaplupartdesprogrammesJDBCsontcritspourdesschmasdetablesconnus Butdelamtabase:dcouvrirl'excutionleschmadestables Avantage:leprogrammepeutmanipulern'importequelschma 1.Rcuprationdesenregistrementsd'unetable Statementst=cx.createStatement(); ResultSetrs=st.executeQuery("SELECT*FROMemp"); 2.Rcuprationd'unobjetdelaclasseResultSetMetaDatadcrivantleResultSet ResultSetMetaDatarsmd=rs.getMetaData(); 3.InterrogationduResultSetMetaDatapourdcouvrirleschmadelatableemp intcolumnCount=rsmd.getColumnCount();//#decolonnes StringcolLabel=rsmd.getColumnLabel(i);//nomdelacolonnei StringcolType=rsmd.getColumnTypeName(i);//typedelacolonnei

104

Metadata :INFORMATIONS DE LA STRUCTURE DE LA BASE DE DONNEES


La mthode getMetaData() retourne un objet de la classe ResultSetMetaData qui permet d'obtenir des informations sur le rsultat de la requte. Ainsi, le nombre d colonne peut t obtenu grace l mthode getColumnCount d cet b de l t tre bt la th d tC l C t de t objet. ResultSetMetaData rsmd; rsmd = results getMetaData(); results.getMetaData(); nbCols = rsmd.getColumnCount(); La mthode next() dplace le curseur sur le prochain enregistrement. Le curseur pointe initialement juste avant le premier enregistrement : il est ncessaire de faire un premier appel la mthode next() pour se placer sur le premier enregistrement. Elle retourne false lorsqu'il n'y a plus d'enregistrement. Il faut toujours protger le parcours d'une table dans un bloc de capture d'exception

105

Metadata :INFORMATIONS DE LA STRUCTURE DE LA BASE DE DONNEES

try { ResultSetMetaData rsmd = rsultats.getMetaData(); int nbCols = rsmd.getColumnCount(); boolean encore = rsultats.next(); while (encore) { for (int i = 1; i <= nbCols; i++) System.out.print(rsultats.getString(i) + " "); System.out.println(); encore = rsultats.next(); } rsultats.close(); } catch (SQLException e) { //traitement de l'exception }

106

Metadata :INFORMATIONS DE LA STRUCTURE DE LA BASE DE DONNEES


2) La classe DatabaseMetaData Un objet de la classe DatabaseMetaData permet d'obtenir des informations sur la base de donnes dans son ensemble : nom des tables, nom des colonnes dans une table, mthodes SQL supportes

107

Metadata:INFORMATIONSDELASTRUCTUREDELA BASEDEDONNEES

DtaildelobjetDatabaseMetaData (rsultats diffrentssuivantlesdroitsdel utilisateur diffrents suivant les droits de lutilisateur connect) : getCatalogs() throwsSQLException :retourne l () h lensembledesbasesdedonnesduserveur getTables(StringdbName,Stringarg1,String arg2,String[]arg3) :retournelalistedestables delabasededonnesindiqueenargument getColumns(StringdbName,Stringarg1,String g ( g , g g , g table,Stringarg3) :retournelensembledes colonnesdelatablespcifie

108

Metadata:INFORMATIONSDELASTRUCTUREDELABASEDEDONNEES
Mtabase Lamtabasecontientaussidesinformationssurlestablescontenuesdanslabase 1.Rcuprationd'unobjetdelaclasseDatabaseMetaDatadcrivantlabase DatabaseMetaDatadbmd=conn.getMetaData(); 2.Rcuprationdestables(utilisateur)delabase ResultSettables=dbmd.getTables(null,null,null,{"TABLE"}); 3.Rcuprationdesnomsdestables(itrationsurleResultSet)

while(tables.next()){ while ( tables.next() ) { StringtableName=tables.getString("TABLE_NAME"); }

Rq:nombreusesautrespossibilits d interrogationduDatabaseMetaData d'interrogation du DatabaseMetaData


109

L'utilisationd'unobjet PreparedStatement objet qui va L'interface PreparedStatement dfinit les mthodes pour un
encapsuler une requte prcompile. Ce type de requte est particulirement adapt pour une excution rpte d'une mme requte avec des paramtres diffrents. Cette interface hrite de l'interface Statement l interface Statement. Lors de l'utilisation d'un objet de type PreparedStatement, la requte est envoye au moteur de la base de donnes pour que celui ci prpare son excution. i Un objet qui implmente l'interface PreparedStatement est obtenu en utilisant la mthode preparedStatement() d'un objet de type Connection. Cette mthode d un attend en paramtre une chane de caractres contenant la requte SQL. Dans cette chaine, chaque paramtre est reprsent par un caractre ?.

JSF

MarocTelecom

110

L interfacejava.sql.PreparedStatement Linterface java.sql.PreparedStatement


Permetdedfinirunpatronderequtesquelonpeutspcialiserparlasuite pourenvoyerdesrequtessimilairesnediffrantqueparlavaleurdunouplusieurs paramtres Exemple: publicstaticvoidmain(String[]args) {//chargementdudriveretconnexion Stringreq UPDATEemp String req ="UPDATE emp " +"SETnom=?WHEREenoLIKE?"; try{PreparedStatementprestat=connection.prepareStatement(req);} catch(SQLExceptione){} try { prestat.setFloat(1,SMITH); p prestat.setString(2,2000); g( , ); prestat.executeUpdate(): } catch(SQLExceptione){} }
111

Linterface java.sql.PreparedStatement
EXEMPLE: try { String chaine = "jdbc:odbc:testDB"; con = DriverManager.getConnection(chaine); PreparedStatement recherchePersonne = con.prepareStatement("SELECT * FROM personnes WHERE nom_personne = ?"); recherchePersonne.setString(1, nom3 ); recherchePersonne setString(1 "nom3"); resultats = recherchePersonne.executeQuery(); affiche("parcours des donnes retournes"); boolean encore = resultats.next(); while ( hil (encore) { ) System.out.print(resultats.getInt(1) + " : "+resultats.getString(2)+" "+ resultats.getString(3)+"("+resultats.getDate(4)+")"); System.out.println(); y p (); encore = resultats.next(); } resultats.close(); } catch (SQLException e) { arret(e.getMessage()); } JSF MarocTelecom 112

Linterfacejava.sql.PreparedStatement

Autresaccesseurs setInt,setShort,setLong,setFloat,setDouble,setByte,setArray,setBigDecimal, setBlob,setClob,setBoolean,setDate,setTime,setTimestamp,setRef,setString, , , y , , y , j setURL,setAsciiStream,setBinaryStream,setCharacterStream,setBytes,setObject


113

GestiondestransactionsetJDBC
Lorsquuneconnexionesttablie,touterequtemisetravers lobjetConnection associformeunetransactionautovalide j (AutoCommit) LeBeginestimplicite Latransactionnecomportequuneseulerequte Latransactionestvalideimplicitementaprslexcutionde cetterequte cette requte OnpeutdciderdesortirdecemodeAutoCommit LeBeginresteimplicite g p Transaction=touteslesrequtesjusquauprochain Commit/RollBack Commit/RollBackdeviennentexplicites /
114

GestiondestransactionsetJDBC
Exempledegestiontransactionnelle

115

GestiondestransactionsetJDBC
cx.setAutoCommit(false); Statementst=cx.createStatement(); st.executeUpdate("UPDATEcomptesSETsolde=solde+montantWHERE nom='Paul'"); st.executeUpdate("UPDATEcomptesSETsolde=soldemontantWHERE p ( p nom='Bob'"); ResultSetrs=st.executeQuery("SELECTsoldeFROMcomptesWHERE nom='Bob'"); ) rs.next(); if(rs.getDouble("solde")<0.0) cx.rollback(); cx rollback(); else cx.commit();

116

Appelauxprocduresetauxfonctionsstockes Motivation Linterface CallableStatement permet dappeler des L interfaceCallableStatementpermetd appelerdes procduresoudesfonctionsstockes. On indique le nom de la procdure ou de la fonction Onindiquelenomdelaprocdureoudelafonction requiselorsdelinitialisationdelobjet CallableStatementgracelamthodeprepareCall() de g p p () linterfaceConnection. p q p Deuxformespossibles,selonquelaprocdureoula fonctionstockecomportedesparamtreslorsde lappelounencomportepas
117

Appelauxprocduresetauxfonctionsstockes
Comment? sans paramtre : sansparamtre: CallableStatementcst=myconnexion.prepareCall(callnom procedure); avecdesparamtres : CallableStatementcst=myconnexion.prepareCall( ?=callnomfonction(?,?, ? ll f i (? ? ...)); ou: ou : CallableStatementcst=myconnexionprepareCall( callnomprocedure(?,?,... ));
118

Appelauxprocduresetauxfonctionsstockes

119

Appelauxprocduresetauxfonctionsstockes

120

CallableStatement:Exemple
Exempledunefonctionstocke Oncherchelenombred Individusportantlemmenom. On cherche le nombre dIndividus portant le mme nom. CREATEFONCTIONmemeNomFonc(nom Individu.nomIndividu%type) RETURNNUMBERIS nbIndividusNUMBER; BEGIN G SELECTCOUNT(*)INTOnbIndividus FROMindividu FROM individu WHEREnomIndividu=nom GROUPBYnomIndividu RETURNIndividus; END;

121

CallableStatement:Exemple

122

CallableStatement:Exemple

123

Fonctionquirenvoieuncurseur
Ilfaut 1.Creruntypepourlarfrencedecurseur l f d quonvarenvoyer 2.Crerlafonctionquirenvoielarfrencede curseur

124

Crerletyperfrencedecurseur
Crerunnomdetypepourlarfrencede curseurqu onvarenvoyer curseur quon va renvoyer Pourutiliserensuiteletype,ilfautlecrer dansunpaquetage:
createorreplacepackageTypesAS typecurseur_typeisrefcursor; type curseur type is ref cursor; endTypes;

125

Crerlafonction
createorreplace functionlistdept(numinteger) function listdept(num integer) returnTypes.curseur_type is empcursorTypes.curseur_type; begin openempcurseur forselectdept,nomE fromempwheredept=num; returnempcurseur; end;

126

UtiliserlafonctiondansJDBC
CallableStatementcstmt=conn.prepareCall("{?=call list(?)} ); list(?) }"); cstmt.setInt(2,10); cstmt.registerOutParameter(1,OracleTypes.CURSOR); cstmt registerOutParameter(1 OracleTypes CURSOR); cstmt.execute(); ResultSetrs ResultSet rs =((OracleCallableStatement)cstmt).getCursor(1); while(rs.next()){ while (rs next()) { System.out.println(rs.getString("nomE") +";"+rs.getInt("dept")); + ";" + rs getInt("dept")); }

127

Reporting R ti Jasper Report p p

128

Reporting:JasperReport
Prsentation JasperReportsestunoutil100%OpenSourcedegnration d'tats/rapportsdveloppenJava,pourdesapplicationsJava. Ilseprsentesouslaformedelibrairiesintgreraux applications. Ceslibrairiespermettentlavisualisationoul exportdedonnes Ces librairies permettent la visualisation ou l'export de donnes versdemultiplesformats.

129

Reporting:JasperReport
Cycledevied'unrapport l'diteurgraphiqueiReportouencoren'importequelditeurdetexte.Cefichier portegnralementl'extension.jrxml(JasperReportXML). 2. Fichier jasper: Le fichier JRXML est ensuite compil pour pouvoir tre utilis. Cette Fichierjasper: LefichierJRXMLestensuitecompilpourpouvoirtreutilis.Cette compilationpeutsefairedansiReportcommedanslecoded'uneapplication.Dans lecasd'uneapplicationceserasouventlefichiercompilquiseraappelcarilest gnralementinutileetcoteuxderecompilerleXMLchaqueappeldurapport l t i til t t d il l XML h ld t 3. Sortieauformatdsir: Apartirdummefichierjapser,JasperReportpeutensuite produireplusieurstypesdefichier:PDF,XLS(Excel),ODF(OpenOffice),RTF(Word enautres),...Pourcela,ontransmetlesparamtresvoulus(sibesoin),onspcifie letypedesortiedsir. 1. FichierXML: Dansunpremiertemps,oncrelerapportauformatXML,via

130

Reporting:JasperReport
Sourcesdedonnes JapserReportsaccepteplusieurstypesde l d sourcesdedonnes.Quecesoitclassiquement unebasededonne,duCSVouencoredes b d d d d BeansJava,XML,.. Remarque: unrapportnepeutavoirqu'une seulesourcededonnesetnepeutfaire qu'uneseulerequteSQL!Heureusementun rapportpeuttrecomposdesousrapports quiaurontchacunleurrequte.
131

Reporting:JasperReport
Elmentsconstituantsunrapport Unrapportpeuttreconstitudemultipleslmentsvisuels: Un rapport peut tre constitu de multiples lments visuels: TexteStatique Textedynamiques(extraitesdedonnesenbases,retraitesou non) Graphiques(histogrammes,camemberts....) Formesgomtriquesplusoumoinscomplexes i l i l Images Lienshypertextes Liens hypertextes ... p p Leschampstextespeuventtremisenformeselonlebesoinet leurtypededonne
132

Lesdiffrentespartiesd'unrapport le rapport est compos de 9 : lerapportestcomposde9: Background :l'arrireplandurapport(logo,etc...) Title (Titre) PageHeader (enttedepage) ColumnHeader (enttedecolonne) Detail (corpsdurapport) ( p pp ) ColumnFooter (pieddecolonne) PageFooter (pieddepage) LastPageFooter (pied de la dernire page) (pieddeladernirepage) Summary NoData (depuis2.02):Cequiseraaffichsurdemandequandla requteSQL(parexemple)nerenvoierien t SQL ( l ) i i

133

Paramtres,Variables,Champs...
Ilexistedeuxtypesdeparamtres: p g p 1. Lesparamtresdits"intgrs": Ilssontpeunombreuxmais obligatoirespourlebonfonctionnementdurapport. Citonstoutefoisparmieuxlaconnexionlabasededonnes.il faudraletransmettreengnralsionveutavoirdesrsultats... g DepuisunIDEouuneapplicationontransmettraassezsouventune connexiondjexistante. 2. Lesparamtres"utilisateurs": Ceuxlc'estnousquilesdfinissons (type,valeurpardfaut...). Exemple: Onveutlemployeavecl'identifiantID='X',oninsreradoncle l l l l' d f ' ' d l paramtredanslarequteSQL.Oncreradoncleparamtre emp_ID',detypeStringetlarequteSQLressembleraa:SELECT* fromentreprisesWHEREID=$P{emp_ID} Syntaxe:$P{NOMDUPARAMETRE} 134

Paramtres,Variables,Champs...
Lesvariables sontdesvaleursquin'existentqu'auseindurapport. Lencore,deuxtypesdevariables,intgres et...utilisateurs , yp , g Lesvariablesintgressontparexemplelenumrodelapage, lenombred'enregistrementtraitsparpage... Lesvariablesutilisateurspeuventtresimplesouencore dfiniescommedessommesdevaleursd'unouplusieurs champs p Syntaxe: $V{NOMDELAVARIABLE} Champs(Fields) CesontlesrsultatsdelarequteSQLoudessourcesde donnes.ElleschangentaufurquejasperReportslitles enregistrementsdanslazonedtail enregistrements dans la zone dtail Syntaxe: $F{NOMDUCHAMP}
135

Lessousrapports

Onnepeutavoirqu'unesourcededonneset unerequteSQLparrapport,ceciauraitputre une requte SQL par rapport ceci aurait pu tre gnant,maisc'estlqu'interviennentlessous rapports! rapports ! Lessousrapportssontdesrapportsdansles Les sous rapports sont des rapports dans les rapports.Pourcrerunsousrapport,riende plussimple,oncreunrapportnormal,que plus simple on cre un rapport normal que l'onappelleradansunautrerapportqui deviendradonclerapport deviendra donc le rapport pre .
136

Classeddition
importjava.io.*;importjava.sql.*;importjava.util.HashMap; importjava.util.Map;importjavax.management.Query; i tj til M i tj tQ importcom.sun.rowset.FilteredRowSetImpl; importrex.metadata.QueryDimensionElement; importnet.sf.jasperreports.engine.*; publicclassGenererPDF { publicstaticvoidmain(String[]args){ public static void main(String[] args) { //Connexionlabase Stringurl="jdbc:oracle:thin:@localhost:1521:XE";Stringlogin="buy"; Stringpassword="12345"; try{DrivermonDriver=neworacle.jdbc.driver.OracleDriver(); DriverManager.registerDriver(monDriver); DriverManager registerDriver(monDriver); Connectionconnection=DriverManager.getConnection(url,login,password);
137

Classeddition(Suite)
// Chargementdurapport
JasperDesign jasperDesign=JRXmlLoader.load("C:\\ProgramFiles\\JasperSoft\\iReport 2.0.3\\classic.jrxml"); JRDesignQueryquery=newJRDesignQuery(); JRD i Q JRD i Q () BufferedReaderin=newBufferedReader(newInputStream(newSystem.in)); intvar=Integer.valueOf(in.readLine()); i l f(i d i ()) query.setText("select*fromproduitwhereidproduit="+var); jasperDesign.setQuery(query);

138

Classeddition(Suite)
//compilationdurapport JasperReport jasperReport=JasperCompileManager.compileReport(jasperDesign); // Paramtresenvoyeraurapport // P t t Mapparameters=newHashMap(); parameters.put("Titre","Titre"); //Executiondurapport //Execution du rapport

JasperPrint jasperPrint=JasperFillManager.fillReport(jasperReport,parameters,connection); // CrationdurapportauformatPDF


JasperExportManager.exportReportToPdfFile(jasperPrint, C:\\ProgramFiles\\JasperSoft\\iReport JasperExportManager.exportReportToPdfFile(jasperPrint, "C:\\Program Files\\JasperSoft\\iReport 2.0.3\\classic110.pdf"); }catch(JRExceptione){e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); } } }
139

ANNEXE(JTable)
Utilit Reprsenterdesdonnessousformetabulaire:

Leslignesetlescolonnessontidentifiesparunnombreentier(encommenant0) ObjetsutilisspourlefonctionnementdeJTable UnmodlededonnesquireprsentelesdonnesdanslaJTable Unmodledecolonnesquireprsentelescolonnesdelatable Un(ouplusieurs)rendererpourafficherlesdonnesdumodle Un(ouplusieurs)diteurdecellulepoursaisirlesmodificationsdesdonnes parlutilisateur

140

ANNEXE(JTable)
Lestableslesplussimplessontconstruitesavec lesconstructeursquiprennentenparamtres2 les constructeurs qui prennent en paramtres 2 tableauxdObjectou2Vector(1pourlesnoms descolonneset1pourlesdonnes) des colonnes et 1 pour les donnes) Exempledetablesimple Object[][] data={{"a11","a12"},{"a21", "a22"}}; String[] nomsColonnes={"Col1","Col2"}; JTable table = new JTable(data nomsColonnes); table=newJTable(data,nomsColonnes); JScrollPanesp=newJScrollPane(table);

141

ANNEXE(JTable)
ConstructeursdeJTable JTable(Object[][]donnes,Object[] descriptionColonnes):les d i ti C l ) l donnessontrangesdansuntableau donnes sont ranges dans un tableau JTable(Vectordonnes,VectordescriptionColonnes): lesdonnessontdansunVectordeVector
142

ANNEXE(JTable)
//lesColonnesduJtable1 publicstaticObjectcol_jtable_emp() public static Object col jtable emp() { Vector<Object>col_emp=newVector<Object>(); col_ens.add("Matricule"); col_ens.add("Nom"); col_ens.add("Prenom"); col_ens.add("Tel"); returncol_emp; t l }

143

ANNEXE(JTable)
//Lesdonneesdelatableemploy // Les donnees de la table employ publicstaticObjectdonnees_emp(){ Vector<Object>vect_ensei=newVector<Object>(); try{Connecter.get_driver();Connecter.get_Connection(); {C d i () C C i () ResultSetrs=Connecter.st.executeQuery("select*fromemploye"); while(rs.next()){ Vector<Object>vect1=newVector<Object>(); j j (); vect1.add(rs.getString(1)); vect1.add(rs.getString(2)); vect1.add(rs.getString(3)); //vect1.add(rs.getString(4)); // vect1 add(rs getString(4)); vect_ensei.add(vect1); } rs.close(); } catch(SQLExceptione){JOptionPane.showMessageDialog(null,"Recuperation Impossible"+e.getMessage());} returnvect_ensei; }
144

ANNEXE(JTable)
publicvoidactualiserTableEmp(Vectordonnees,Vectortitres){ if(donnees==null||donnees.size()==0) labelAucuneDonneeAffichee.setVisible(true); else labelAucuneDonneeAffichee.setVisible(false);

tableEnseignants.setModel(newDefaultTableModel(donnees,titres)); tableEnseignants setModel(new DefaultTableModel(donnees titres)); }

145

Annesxe(JOptionPane)
publicvoidaffchierMessage(Stringmessage,Stringtitle){ JOptionPane.showMessageDialog( this,message,title, JOptionPane.INFORMATION_MESSAGE); } publicvoidafficherAvertissement(Stringmessage,Stringtitle){ JOptionPane.showMessageDialog( this,message,title, JOptionPane.WARNING_MESSAGE); } publicvoidafficherErreur(Stringmessage,Stringtitle){ JOptionPane.showMessageDialog( this,message,title, JOptionPane.ERROR_MESSAGE); }

146

TP1(MAJ)

147

Contrlesaisie
privatebooleanchampsValides(){ returnchampMatricule.getText()!=null&& return champMatricule getText() ! null && !champMatricule.getText().equals("")&& champNom.getText()!=null&& champNom getText() != null && !champNom.getText().equals("")&& champPrenom.getText()!=null&& champPrenom getText() != null && !champPrenom.getText().equals("")&& champTelephone.getText()! null && champTelephone.getText() !=null&& !champTelephone.getText().equals("")&& !champTelephone.getText().equals("..."); }
148

Ajouter
privatevoidboutonAjouterActionPerformed(java.awt.event.ActionEventevt){ if(champsValides()){ try{ ajouterEemp( Integer.parseInt(champMatricule.getText()), champNom.getText(), champPrenom.getText(), champTelephone.getText()); }catch(NumberFormatExceptione){ afficherErreur( "Lematriculedoittreunevaleurnumrique", "Saisieincorrecte"); } }else{ afficherErreur( "Certainschampsn'ontpastrenseigns","Erreurdesaisie"); } }
149

Supprimer
privatevoidboutonSupprimerActionPerformed(java.awt.event.ActionEventevt){ if(champMatricule.getText()!=null&&!champMatricule.getText().equals("")){ intconfirmation=JOptionPane.showConfirmDialog( this, "tesvoussrsdevouloirsupprimercetemployer?", "Suppression",JOptionPane.YES_NO_OPTION); if(confirmation==JOptionPane.YES_OPTION){ try{ newDAO.DAOemp.supprimerEmp( Integer.parseInt(champMatricule.getText())); }catch(NumberFormatExceptione){ afficherErreur("Lematriculedoittreunevaleurnumrique","Saisieincorrecte"); } } }else{ afficherErreur( "Lechampdematriculen'apastrenseign","Erreurdesaisie"); } }
150

Modifier
privatevoidboutonSauvegarderActionPerformed(java.awt.event.ActionEventevt){ if(champsValides()){ try{ modifierEmp( Integer.parseInt(champMatricule.getText()), champNom.getText(), champPrenom.getText(), champTelephone.getText()); }catch(NumberFormatExceptione){ afficherErreur( "Lematriculedoittreunevaleurnumrique", "Saisieincorrecte"); } }else{ afficherErreur( "Certainschampsn'ontpastrenseigns","Erreurdesaisie"); } }

151

Recherchemulticritres

152

Recherchemulticritres

153

LesbuttonsdenafigationsetJTable
privatevoidjButton3ActionPerformed(java.awt.event.ActionEvent evt){ ){ if(jTable1.getSelectedRow()!=jTable1.getRowCount()1){ jTable1.changeSelection(jTable1.getSelectedRow()+1,0,false, false); intt=jTable1.getSelectedRow(); jTextField1.setText(jTable1.getValueAt(t,0).toString()); jTextField1 setText(jTable1 getValueAt(t 0) toString()); jTextField2.setText(jTable1.getValueAt(t,1).toString());} elseJOptionPane.showMessageDialog(null,"c'estlafin"); }
154

LesbuttonsdenavigationsetJTable
jTable1.changeSelection(jTable1.getSelectedRow() 1,0,false,false);

jTable1.changeSelection(0,0,false,false); jTable1 changeSelection(0 0 false false);

jTable1.changeSelection(jTable1.getRowCount() 1,1,false,false);

155

Dates(ANNEXE)
Pourpasserdejava.util.Datejava.sql.Date,utiliserlamthodegetTime(): Exemple: java.util.Datedate=newjava.util.Date(); java.sql.DatedateSQL=newjava.sql.Date(date.getTime()); java.sql.Timetime new Time(date.getTime()); java.sql.Time time =newTime(date.getTime()); java.sql.Timestamptime=newTimestamp(date.getTime());

UnpetitrappelsurlesdatesenJava: miseenformeaveclaclassejava.text.DateFormat calculssurlesdatesaveclaclassejava.util.Calendar

156

Lesfonctionetlesprocdures stockes(annexe)
Daoempl.java privatestaticCallableStatementinsertEmp,updateEmp,deleteEmp,selectIDEmp; //ajouteemploy // ajout eemploy publicstaticintcreateEmp(EmpBeanemp){ try{ if(insertEmp==null){ Stringappel="{callINSERT_EMP(?,?,?,?)}"; S i l "{ ll INSERT EMP(? ? ? ?) }" insertEmp=Connexion.getConnexion().prepareCall(appel); } p (); insertEmp.clearParameters(); insertEmp.setInt(1,emp.getMatricule()); iinsertEmp.setString(2,emp.getNom()); insertEmp.setString(3,emp.getPrenom()); insertEmp.setString(4,emp.getTelephone()); insertEmp setString(4 emp getTelephone()); returninsertEmp.executeUpdate(); }catch(SQLExceptionex){ newControleur().afficherErreur(ex.getMessage(),"Erreurd'accsauxdonnes"); return0; } }

157

Lesfonctionetlesprocdures stockes(annexe)
//modification publicstaticintupdateEnseignant(EnseignantBeanenseignant){ try{ try { if(updateEnseignant==null){ Stringappel="{callUPDATE_ENSEIGNANT(?,?,?,?)}"; updateEnseignant Connexion.getConnexion().prepareCall(appel); updateEnseignant =Connexion.getConnexion().prepareCall(appel); } updateEnseignant.clearParameters(); updateEnseignant.setString(2,enseignant.getNom()); updateEnseignant.setString(3,enseignant.getPrenom()); updateEnseignant.setString(4,enseignant.getTelephone()); updateEnseignant.setInt(1,enseignant.getMatricule()); returnupdateEnseignant.executeUpdate(); }catch(SQLExceptionex){ newControleur().afficherErreur(ex.getMessage(),"Erreurd'accsauxdonnes"); return0; return 0 } }

158

Lesfonctionetlesprocdures stockes(annexe)
//Suppression publicstaticintdeleteEnseignant(EnseignantBeanenseignant){ try{ try { if(deleteEnseignant==null){ Stringappel="{callDELETE_ENSEIGNANT(?)}"; deleteEnseignant Connexion.getConnexion().prepareCall(appel); deleteEnseignant =Connexion.getConnexion().prepareCall(appel); } deleteEnseignant.clearParameters(); deleteEnseignant.setInt(1,enseignant.getMatricule()); returndeleteEnseignant.executeUpdate(); }catch(SQLExceptionex){ newControleur().afficherErreur(ex.getMessage(),"Erreurd'accsauxdonnes"); return0; } }

159

Lesfonctionetlesprocdures stockes(annexe)
lectured'unenseigantparmatricule createorreplaceprocedureREAD_ENSEIGNANT( p_matriculeINOUTENSEIGNANT.matricule%TYPE, p matricule IN OUT ENSEIGNANT.matricule%TYPE, p_nomOUTENSEIGNANT.nom%TYPE, p_prenomOUTENSEIGNANT.prenom%TYPE, p_telephoneOUTENSEIGNANT.telephone%TYPE ) is begin selectmatricule,nom,prenom,telephone intop_matricule,p_nom,p_prenom,p_telephone fromenseignant wherematricule=p_matricule; endREAD_ENSEIGNANT; end READ ENSEIGNANT;

160

publicstaticEnseignantBeanfindEnseignantByMatricule(intmatricule){ try{ if(selectIDEnseignant==null){ Stringappel="{callREAD_ENSEIGNANT(?,?,?,?)}"; St i l "{ ll READ ENSEIGNANT(? ? ? ?)}" selectIDEnseignant=Connexion.getConnexion().prepareCall(appel); } selectIDEnseignant.clearParameters(); selectIDEnseignant.setInt(1,matricule);

Lesfonctionetlesprocdures stockes(annexe)

selectIDEnseignant.registerOutParameter(2,Types.VARCHAR); selectIDEnseignant.registerOutParameter(3,Types.VARCHAR); selectIDEnseignant registerOutParameter(3 Types VARCHAR); selectIDEnseignant.registerOutParameter(4,Types.VARCHAR); selectIDEnseignant.executeQuery(); returnnewEnseignantBean( matricule, i l selectIDEnseignant.getString(2), selectIDEnseignant.getString(3), selectIDEnseignant.getString(4)); }catch(SQLExceptionex){ //newControleur().afficherErreur(ex.getMessage(),"Erreurd'accsauxdonnes"); returnnull; }

161

FormattedField
champTelephone=newjavax.swing.JFormattedTextField(); try{ champTelephone.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("###'.##'.##'.##"))); }catch(java.text.ParseExceptionex){ } catch (java text ParseException ex) { ex.printStackTrace(); } champTelephone.setToolTipText("<html>\n<u>auformat:</u> ???.??.??.??<br/>\n<u>exemple:</u> <b>022.36.36.36</b>\n</html>"); / \ / )
162

FormattedField
importjava.util.regex.Pattern; privatebooleanisdate(Stringdate){ Stringmodel="\\d{2}\\/\\d{2}\\/\\d{2,4}"; returnPattern.matches(model,date); return Pattern matches(model date); }

163

Fonctionnalitsavances:ModedconnectRowSet
PardfautJDBCc/sconnectversSGBD + 1 seule copie des donnes (SGBD) +1seulecopiedesdonnes(SGBD) +misesjoursimples connectvsnonconnect nmessagespetitetaille vs1messagegrandetaille Modedconnect Pouvoirconsulter/modifierlesdonnesoffline conomiserlesressourcesrseaux(connexionsmoins i l ( i i longues) Travaillersurdesdonnesenmmoirepluttque p q directementsurunSGBD
164

MODE DCONNET
Package Javax.sql
Ce package est une extension l'API JDBC qui propose des fonctionnalits pour les dveloppements cot serveur. Il est uniquement intgre J2EE. Les principales fonctionnalits proposes sont : une nouvelle interface pour assurer la connection :

l'interface DataSource les pools de connections les transactions distribues l'API Rowset
DataSource et Rowset peuvent tre utilises directement. Les pools de connections et les transactions distribues sont utiliss par une implmentation dans les serveurs d'applications pour fournir ces services.

165

Interface ROWSET
L'interface javax.sql.Rowset dfiniedesobjetsquipermettentdemanipuler lesdonnesd unebasededonnesenmodedconnect. lesdonnesd'unebasededonnesenmodedconnect. Pourutiliserl'interfaceRowSet,ilestncessaired'avoiruneimplmentation L'implmentationd'unRowSetpeuttrededeuxtypes: connectlabasededonnesduranttoutesaduredevie dconnectdelabaseaprsavoirrcuprdesdonnesdanslabase pourpermettreunemanipulationdesdonnesenmodedconnect. Lesmodificationspeuventalorstrereportesdanslabaselorsd'une reconnexionultrieure. reconnexion ultrieure

166

Fonctionnalitsavances:ModedconnectRowSet

ModedconnectRowSet ResultSetrs=... l //CachedRowSethritedeResultSet CachedRowSetcrs=newCachedRowSet(); crs.populate(rs); crs populate(rs); cx.close(); //manipulationdecrs // i l i d

167

Interfaces filles de ROWSET


JDBCRowSet: manipulerlesdonnesenmodeconnect,quiencapsuleun ResultSet,avecnavigationendeuxsensetmodifiablesansqueleResulset R ltS t i ti d t difi bl l R l t acesproprits. p CachedRowSet :manipulerlesdonnesd'unesourcededonnesenmode dconnect (lesdonnessontstockesdansl'objet) WebRowSet :permetlalectureetl'crituredesdonnesauformatXML (hritedeCachedRowSet) FilteredRowSet :permetdefairedesfiltres(hritedeWebRowSet) JoinRowSet :permetdefairedesjointures(hritedeWebRowSet)avec desobjetsimplmentantl'interfaceJoinable

168

InterfacesFillesduRowSet

169

Caractristiques d'un RowSet


Cetteinterfaceproposeunensembledepropritspourpermettrela connexionunesourcededonnes. LamthodesetURL() permetdeprciserl'urlJDBCutiliselorsdela connexion.LesmthodessetUsername()etsetPassword() permettent connexion Les mthodes setUsername() et setPassword() permettent fournirlenomduuseretsonmotdepassepourlaconnexion. LamthodesetCommand() permetdeprciserlarequtequisera excutepourobtenirlesdonnesoudeffectuerunemisejour. Lamthodeexecute() permetdesraliserlestraitementspourchargerles donnes(connexionlabasededonnes,excutiondelarequte, parcoursdesdonnesetventuellementfermeturedelaconnexionselon p ) l'implmentationduRowSet). LeparcoursdesdonnessefaitdelammefaonquepourunResultSet sachantqu'ilpeuttoujourssefairedanslesdeuxsensselonle paramtrageduRowSet(utilisationdesmthodesfirst(),last(),next()et previous()). previous()) UnRowSetpeuttreremplidedeuxfaons : Enluifournissantlesinformationsdeconnexionetlarequte excuter EnluifournissantunobjetdetypeResultSetquicontientdjles donnesissuesdel'excutiond'unerequtelamthodepopulate()
170

Spcifications
Remarque: lorsqueleRowSetestrempligrceunResultSet,ilestncessairepour fairedesmodificationsdanslatabledelabasededonnesdefournirau faire des modifications dans la table de la base de donnes de fournir au Rowsetlesinformationsdeconnexionetmmelatableconcerneen utilisantlamthodesetTableName(). LesinterfacesdesspcificationsdeRowSetsontcontenuesdansle packagejavax.sql.rowset. L'implmentationfournieavecleJDKestcontenuedanslepackage co su o se e e a spc e pa a S com.sun.rowset :elleatspcifieparlaJSR114.Ellepropose5 e p opose 5 RowSets standards:JdbcRowSet,CachedRowSet,WebRowSet, FilteredRowSetetJoinRowSet LeJdbcRowSet fonctionneenmodeconnectalorsque Le JdbcRowSet fonctionne en mode connect alors que CachedRowSet,WebRowSet,FilteredRowSetetJoinRowSet fonctionneenmodedconnect.

171

Exemple JdbcRowSet
JdbcRowSet 2constructeurs: avecunResultSetenparamtre,pour envelopperunResultSetexistant sansparamtre;ilfaudraensuitedonnerles p ; informationspourlaconnexionlabaseet p pourindiquerlesdonnesrcuprer q p

172

Exemple JdbcRowSet:constructeursansparamtre
importjava.sql.ResultSet; importjavax.sql.rowset.JdbcRowSet; importcom.sun.rowset.JdbcRowSetImpl; p publicclassTestJdbcRowSet{ { publicstaticvoidmain(String[]args)

Stringurl="jdbc:oracle:thin:@localhost:1521:XE"; try{Class.forName(oracle.jdbc.driver.OracleDriver"); y ( j ) Rs=newJdbcRowSetImpl(); rs.setUrl(url); rs.setUsername("APP"); rs.setPassword(""); rs.setCommand("SELECT*FROMPERSONNE"); rs.setConcurrency(ResultSet.CONCUR_READ_ONLY); rs.execute(); while(rs.next()) { System.out.println("nom:"+rs.getString",prenom:"+rs.getString("prenom"));} rs.absolute(2);rs.updateString("nom","nom2modifie"); rs.updateRow(); rs.commit(); rs.close(); } catch(Exceptione) {e.printStackTrace();} } }
173

JdbcRowSetrs;

Exemple JdbcRowSet (EncapsulationduResultSet)


importjava.sql.ResultSet; importjavax.sql.rowset.JdbcRowSet; importcom.sun.rowset.JdbcRowSetImpl; publicclassTestJdbcRowSet{ public class TestJdbcRowSet { publicstaticvoidmain(String[]args) { JdbcRowSetrs; try { Statementst=con.createStatement(); St t t t t St t t() ResultSetresultset=st.executeQuery(Select*frompersonne); rs=newJdbcRowSetImpl(resultset); rs.setConcurrency(ResultSet.CONCUR_UPDATABLE); while(rs.next()) { System.out.println("nom:"+rs.getString",prenom:"+rs.getString("prenom"));} rs.absolute(2);rs.updateString("nom","nom2modifie"); rs.updateRow(); d R () rs.commit(); rs.close(); } catch(Exceptione) {e.printStackTrace();} } }
174

Exemple JdbcRowSet
OutreleResultSet,unrowsetcravecleconstructeursans p paramtreenveloppeaussiunPreparedStatement pp p Lachanepasseenparamtrede? setCommandpeutcomporterdesjoker Lesvaleurscorrespondantessontpassespardesmthodes setXXX Exemple: Exemple: rs.setCommand("selectnome,salaire" + from employe where dept ?"); + "fromemployewheredept=? ); rs.setInt(1,20); rs.execute();
175

RowSetdconnectable
L'interfaceCachedRowSetdfinieunRowSetdconnect :la connexionlabaseedonnesn'estmaintenuequepourrcuprer touteslesdonnes.Toutescesdonnessontstockesdansl objet toutes les donnes Toutes ces donnes sont stockes dans l'objet etlaconnexionestferme.Ilestalorspossibledemanipulerces donnes(consultationetmisejour).Lesmodificationspeuvent alorstrerenduespersistantesenutilisantunenouvelleconnexion ddiecettetche. ddi tt t h Cecipermetderduirelesressourcesrseauxetserveursmais introduitgnralementdesproblmatiquesdesynchronisationdes introduit gnralement des problmatiques de synchronisation des misesjour. L'implmentation standard de l'interface CachedRowSet est L implmentationstandarddel interfaceCachedRowSetest proposeparlaclassecom.sun.rowset.CachedRowSetImpl.Cet objetmaintientl'tatdesdonnesqu'ilencapsuleenmmoire.Ila simplementbesoindelaconnexionpourremplircesdonneset plustardaumomentderendrelesmodificationssurcesdonnes l t d td d l difi ti d persistantes.
176

RowSetdconnectable
RemplirunCachedRowSet UnCachedRowSet peuttrerempliaveclesdonnesd unResultSet parla Un CachedRowSet peut tre rempli avec les donnes dun ResultSet par la mthodepopulate(ResultSet) Cependantleplussimpleestsouventd initialiserleCachedRowSetpour Cependant le plus simple est souvent dinitialiser le CachedRowSet pour quilpuisseseconnecterlabase(mthodessetUsername,setPassword, setUrlousetDataSourceName),etindiquerlacommandepourrcuprerles setUrl ou setDataSourceName) et indiquer la commande pour rcuprer les donnes(setCommand) Onpeutensuitelancercettecommandeparlamthodeexecute O i l d l h d t

177

Exemple
importjava.sql.ResultSet; importjavax.sql.rowset.CachedRowSet; importcom.sun.rowset.CachedRowSetImpl; publicclassDeconnecte{ public class Deconnecte { publicstaticvoidmain(String[]args){ CachedRowSetrs; try{ Class.forName( oracle.jdbc.driver.OracleDriver"); oracle.jdbc.driver.OracleDriver ); rs=newCachedRowSetImpl(); rs.setUrl("jdbc:oracle:thin:@localhost:1521:XE"); rs.setCommand("SELECT*FROMEnseignant"); rs.setUsername( System ); rs.setUsername( System"); rs.setPassword( 12345"); rs.setConcurrency(ResultSet.CONCUR_READ_ONLY); rs.execute(); while(rs.next()) while (rs.next()) {System.out.println("nom:"+rs.getString("nom"));} rs.close();} catch(Exceptione){e.printStackTrace(); } } } }
178

Remplir un CachedRowSet par les donnes dun ResultSet

Lamthodepopulate() permetderemplirlerowSetaveclesdonnesd'un ResultSet,dsqu'ilfautfairedesmisesjoursanstreconnectlabasede donnes Lesmisesjoursontfaitesuniquementdansl'objetCachedRowSet.Pour reportercesmodificationsdanslabasededonnes,ilfaututiliserlamthode reporter ces modifications dans la base de donnes il faut utiliser la mthode acceptChanges(). Lorsdel'appelcettemthode,l'objetCachedRowSetse reconnectelabasededonneseteffectuelesmisesjour. Remarque: Remarque : IlfautprciserenOraclele scale danslesattributsrcuprsavec linterfaceRowSet.

179

Remplir un CachedRowSet par les donnes dun ResultSet


public class Testdeconn{ public static void main(String[]args){ ResultSetres; CachedRowSetrs=null; ; Connectioncon=null; try {Class.forName("oracle.jdbc.driver.OracleDriver"); con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","system","123"); Statementst=con.createStatement(); res=st.executeQuery( select*frompersonne ); res=st executeQuery("select * from personne");

rs=newCachedRowSetImpl(); rs.populate(res);
con.close(); } catch(ClassNotFoundExceptionex){System.out.println(ex.getMessage());} catch(SQLExceptione){System.out.println(e.getMessage());} Try{while(rs.next()){System.out.println(rs.getString(1)+""+rs.getString(2));} rs.absolute(2); rs.updateString(2,"toto"); d t St i (2 "t t ") rs.updateRow(); rs.setTableName("personne"); con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","system","123"); rs.acceptChanges(con);} catch(SQLExceptione){System.out.println("erreur:"+e.getMessage());} }}
180

WebRowSet (crire .Xml)


importjavax.sql.*; importjavax.sql.rowset.CachedRowSet; importcom.sun.rowset.CachedRowSetImpl; import com.sun.rowset.CachedRowSetImpl; importjava.sql.*; publicclassTestWebRowSet{ publicstaticvoidmain(String[]args){ WebRowSetrs;try{Class.forName( oracle.jdbc.driver.OracleDriver ); WebRowSet rs; try {Class.forName("oracle.jdbc.driver.OracleDriver "); rs=newWebRowSetImpl();rs.setUrl("jdbc:oracle:thin:@localhost:1521:XE"); rs.setCommand("SELECT*FROMPERSONNE");rs.setUsername("biblio"); rs.setPassword("12345");rs.setConcurrency(ResultSet.CONCUR_READ_ONLY);rs.execute(); rs.writeXml(System.out); rs.close();} catch(Exceptione){e.printStackTrace();}}} N.B LamthodereadXml()permetderemplirl'objetWebRowSetavecunfichierXMLpar exempleprcdemmentcrgrcelamthodewriteXml(). ()

181

FiltredRowSet
L'interfaceFilteredRowSetquihritedel'interfaceWebRowSetpermetde mettreenoeuvreunfiltreparprogrammationsansutiliserSQL. FilteredRowSetestparticulirementutilecarilpermetdefiltrerunensemble dedonnessansavoireffectuerunerequtesurlabasededonnesavecle filtre. Lefiltreestencapsuldansuneclassequiimplmentel'interfacePredicate. Danscetteclasse,ilfaut redfinirlesmthodesevaluate()quirenvoieun booleenprcisantsil occurrenceestconserveounonparlefiltre. booleen prcisant si l'occurrence est conserve ou non par le filtre Lamthodeevaluate()acceptantenparamtreunobjetdetypeRowSetest utiliseparl'objetFilteredRowSetlorsduparcoursdecesoccurrences.

182

Classe PersonnePredicate
importjavax.sql.RowSet; importjavax.sql.rowset.Predicate; publicclassPersonnePredicateimplementsPredicate{ public class PersonnePredicate implements Predicate { publicbooleanevaluate(Objectvalue,intcolumn)throwsSQLException {//initialisdanscetexemple returnfalse; } publicbooleanevaluate(Objectvalue,StringcolumnName)throwsSQLException{ //initialisdanscetexemple returnfalse; } } publicbooleanevaluate(RowSetrowset){ try{ Stringnom=rowset.getString( libelle"); if(nom.endsWith("P")) ( ( )) {returntrue;} else{returnfalse;} }catch(SQLExceptionsqle){returnfalse;}}}

183

FiltredRowSet
importjava.sql.ResultSet; importjavax.sql.rowset.FilteredRowSet; importcom.sun.rowset.FilteredRowSetImpl; import com.sun.rowset.FilteredRowSetImpl; publicclassTestFilteredRowSet{ publicstaticvoidmain(String[]args){ FilteredRowSetrs; try{Class.forName( oracle.jdbc.driver.OracleDriver ); try { Class.forName("oracle.jdbc.driver.OracleDriver "); rs=newFilteredRowSetImpl(); rs.setUrl("jdbc:oracle:thin:@localhost:1521:XE"); rs.setCommand("SELECT*FROMPRODUIT"); rs.setUsername( buy"); ( y ); rs.setPassword( 12345");rs.setConcurrency(ResultSet.CONCUR_READ_ONLY); rs.setFilter(newPersonnePredicate()); rs.execute(); while(rs.next()){System.out.println("nom:"+rs.getString("nom"));} ( ()) { y p ( g g( )); } rs.close();} catch(Exceptione){e.printStackTrace();}}}

184

JoinRowSet

PourutiliserunJoinRowSet,ilfautencrer uneinstanceetutiliserlamthode addRowSet()pourajouterlesinstancesde l interfaceJoinableutiliserdanslajointure. l'interface Joinable utiliser dans la jointure LamthodeadddRowSet()possdeplusieurs La mthode adddRowSet() possde plusieurs surchargesquipermettentdeprciser l'instancedeJoinableetlaoulesclsutilises lorsdelajointure.

185

JoinRowSet
PourutiliserunJoinRowSet,ilfautencreruneinstanceetutiliserlamthodeaddRowSet() pourajouterlesinstancesdel'interfaceJoinableutiliserdanslajointure. LeJoinRowSetlieetjointleslignesdesobjetsRowSet,quipeuventtredesCachedRowSet, JdbcRowSet,FiltredRowSet,WebRowSet. JdbcRowSet, FiltredRowSet,WebRowSet. LamthodeadddRowSet()possdeplusieurssurchargesquipermettentdeprciser l'instancedeJoinableetlaoulesclsutiliseslorsdelajointure. Exemple: p Pourlesdeuxschemarelationnelsuivants: Produit(idproduit,libelle,quantite,prix,*numf) Fournisseur(num,nom,adresse,tel) IlfautappelerlamthodesaddRowSet()pourlesdeuxobjetsRowSetrs1etrs2,aveclelien entrelesdeuxtablesreprsenteparlacltrangrenumfdansla1re tableetclprimaire danslatablefournisseur. addRowSet(rs1, "numf "); addRowSet(rs2, "num "); LecontenudeJoinRowSetestillustrdansletableausuivant L t d J i R S t t ill t d l t bl i t
idproduit 3 libelle PC Seimens quantite 144 Prix 4670.68 num 1 Nom Maroc info Adresse Casablanca

186

JoinRowSet
import javax.sql.rowset.CachedRowSet;import javax.sql.rowset.JoinRowSet; import com.sun.rowset.CachedRowSetImpl;importcom.sun.rowset.JoinRowSetImpl; public class TestJoinRowSet{ public static void main(String[] args) { main(String[]args){ CachedRowSetrs1;CachedRowSetrs2;JoinRowSetrs; try {Class.forName("oracle.jdbc.driver.OracleDriver"); rs1=new CachedRowSetImpl(); rs1.setUrl("jdbc:oracle:thin:@localhost:1521:XE"); rs1 setUrl("jdbc:oracle:thin:@localhost:1521:XE"); rs1.setCommand("SELECT*FROMproduit"); rs1.setUsername("system");rs1.setPassword("12345");rs1.execute(); rs2=new CachedRowSetImpl(); rs2.setUrl( jdbc:oracle:thin:@localhost:1521:XE ); rs2 setUrl("jdbc:oracle:thin:@localhost:1521:XE"); rs2.setCommand("SELECT*FROMfournisseur"); rs2.setUsername("System");rs2.setPassword("12345");rs2.execute(); rs=newJoinRowSetImpl(); rs.addRowSet(rs1,5); rs addRowSet(rs1 5); rs.addRowSet(rs2,1); while (rs.next()){ System.out.println("idproduit:"+rs.getObject(1)+",libelle:"+rs.getString(2)+",quantite: "+rs.getInt(3)+ ,Prix:"+rs.getDouble(4)+ num fournisseur : "+rs.getInt(5)+ ,Nom:"+ + rs getInt(3)+" Prix : + rs getDouble(4)+" numfournisseur: + rs getInt(5)+" Nom : + rs.getString(6)+",Adresse:"+rs.getString(7)); }catch (Exceptione){e.printStackTrace();}}}
187

Patrond'architectureencouche (layer)
Coucheprsentation Couchecontrle(coordonnateurd'application) Couchedomained'application(oumtier) Couchedeservices. persistance transaction communication scurit etc.

08/06/2011

188 188

Architecturemulticouches

189

Architecturemulticouches
Couchedeprsentation:logiquedelinterface utilisateur Couchemtier:reprsentationdesobjetsmtier modledesentitsmtie modle des entits mtie Coucheservices:traitementsreprsentantlesrgles mtier Couchedaccsaudonnes/Couchedepersistance: Priseenchargedetouteslesinteractionsentre g lapplicationetlabasededonnes.Groupesde classesetdecomposantschargsdustockageetdela rcuprationdesdonnes
190

Traductiondesassociations

191

Traductiondesassociations

192

Traductiondesassociations

193

Traductiondesassociations

194

DTO
DTO LesobjetsDTO (DataTransfertObject)ontpourbutd'assurerla communicationentrelesdonnesdelabase(Bean)etlesformulaires (Form).Cettecommunications'effectuedanslesdeuxsens: Bean>DTO>Form,danslecasoleformulairedoittrealimentparles donnesdelabasededonnes.Danscecasci,laDTOrcupreles informationsd'unouplusieursBean,etleformulaires'alimenteavecles informationsdecettepremire.LaDTOdoitcontenirlesdonnesquelavue abesoind'afficher,cequincssiteparfoisunassemblage d l i b i d' ffi h i it f i bl deplusieurs Bean.EneffetunBeanaunestructurequicorrespondunetable,ouaun ensembledetable(graphesd'objets).Cettephased'assemblageestassure parlacoucheService. par la couche Service Form>DTO>Bean,danslecasolabasededonnesdoittremisejour parlesdonnesprovenantduformulaire.

195

LacoucheDTO LacoucheDTO estunecouchetransversequi h h assurelacommunicationentrelesdiffrentes partiesdel'application. d l' l Danslecadredelacommunicationcouchede prsentationcouchemtier,lesdtos cachentlesentitsrellementpersistesdans labasededonnes

196

Terminologie/abrviations/ dfinitions

197

ArchitectureNtiers

198

ArchitectureNtiers
LesobjetsViewreprsententlescransde l'application.Chaquecranpeutrecourirun l'application Chaque cran peut recourir un ouplusieursBOpourrcupreroumanipuler lesdonnesdel application les donnes de l'application

199

LesBOconstituentlesmodulesdel'application.UnBO peutdialogueravecd autresBOtoutenvitant peut dialoguer avec d'autres BO tout en vitant auttantquepossiblelescycles.ChaqueBOmanipule lesdonnesviaunouplusieursDAO p UnDAOcorrespondtoujoursuneseuleentitde donnes(typiquementuneTable)etnepeuttre adressqueparunseulBO.UnDAOprvoittoutesles oprationslmentairesd'insertion,demisejour,de suppressionetdeslectionpartirdelasourcede i t d l ti ti d l d donnesrelativel'entit(Table).
200

DTO
LebutdunDTOestdmettremoinsdappels etdetransmettredavantagededonnesdans et de transmettre davantage de donnes dans chaqueappel.Lamthodeestlasuivante : Leclientdemandeauserveurdeluiretourner l d d d l unobjetdetypeDTOquicontienttoutesles donnesdontilabesoin, d d l b LeclientinteragitlocalementaveclobjetDTO retourncommesilsagissaitdunobjet ordinaire.
201

DTO
Lafigureprcdentemontrecequilfaut viterdefaire,savoircommentune viter de faire savoir comment une applicationclientemetunesriedappels distantspourrcuprerlesdiverslmentsdu distants pour rcuprer les divers lments du nomdunclient. LademandedecrationdunDTOpermetau d d d d serveurderenvoyerlatotalitdesinformations relativesauclientenunseulappeldistant. l i li l l di

202

Exemple(Rservationdessalles)
Basededones createtable ENSEIGNANT( matriculeinteger, matricule integer nomvarchar(50), prenomvarchar(50), telephone varchar(20), constraintpk_matriculeprimarykey(matricule) ); createtableSALLE( num_salle integer, capacite integer, constraintpk_num_salleprimarykey(num_salle) ); createtableRESERVATION( matriculeinteger, num_salleinteger, num salle integer date_reservationdate, constraintpk_reservationprimarykey(matricule,num_salle,date_reservation) );

203

Exemple(Rservationdessalles)
Package:reservation.business.beans:

204

Exemple(Rservationdessalles)
Package:reservation.business.dto: publicclassEnseignant { privateintmatricule; privateStringnom; privateStringprenom; privateStringtelephone; privateArrayList<Reservation>reservations; publicEnseignant(EnseignantBeanenseignantBean){ this.matricule=enseignantBean.getMatricule(); this.nom=enseignantBean.getNom(); this.prenom=enseignantBean.getPrenom(); this.telephone=enseignantBean.getTelephone(); } publicEnseignant(intmatricule,Stringnom,Stringprenom,Stringtelephone, ArrayList<Reservation>reservations){ this.matricule=matricule; this.nom=nom; this.prenom=prenom; this.telephone=telephone; this.reservations=reservations; }

205

Exemple(Rservationdessalles)
Package:reservation.business.dto: publicArrayList<Reservation>getReservations(){ public ArrayList<Reservation> getReservations() { returnreservations; } publicvoidsetReservations(ArrayList<Reservation>reservations) { this.reservations=reservations; } publicEnseignantBeangetEnseignantBean(){ g ( , ,p , returnnewEnseignantBean(matricule,nom,prenom, telephone); 206 }

Exemple(Rservationdessalles)
publicclassReservation { privateEnseignantenseignant; privateSallesalle; private Salle salle; privateDatedateReservation; publicReservation(){} publicReservation(Enseignantenseignant,Sallesalle){ this.enseignant=enseignant; this.salle=salle; ; } publicReservation(Enseignantenseignant,Sallesalle,DatedateReservation){ this.enseignant=enseignant; this enseignant enseignant; this.salle=salle; this.dateReservation=dateReservation; }

207

Exemple(Rservationdessalles)
publicReservation(ReservationBeanreservationBean){ this.enseignant=newEnseignant(reservationBean.getMatricule()); this enseignant = new Enseignant(reservationBean getMatricule()); this.salle=newSalle(reservationBean.getNumSalle(),0); this.dateReservation=reservationBean.getDateReservation(); } publicReservationBeangetReservationBean(){ returnnewReservationBean( ( enseignant.getMatricule(), salle.getNumSalle(), dateReservation); }

208

Exemple(Rservationdessalles)
publicclassSalle{ privateintnumSalle; privateintcapacite; private int capacite; privateArrayList<Reservation>reservations;

publicSalle(SalleBeansalleBean){ bli S ll (S ll B ll B ){ this.numSalle=salleBean.getNumSalle(); this.capacite=salleBean.getCapacite(); } publicSalle(intnumSalle,intcapacite,ArrayList<Reservation>reservations){ this.numSalle=numSalle; this.capacite=capacite; this capacite capacite; this.reservations=reservations; }

209

Exemple(Rservationdessalles)
publicSalleBeangetSalleBean(){ returnnewSalleBean(numSalle,capacite); ll ( ll ) }

210

Exemple(Rservationdessalles)
Lesexceptionpersonalises: Packagereservation.business.service.exceptions: publicclassAucunEnseignantTrouveExceptionextendsException{ privateStringmessage="Iln'existeaucunenseignantcorrespondantvoscritresde recherche"; privateStringtitre= Aucunedonneafficher ; private String titre = "Aucune donne afficher"; publicStringgetTitre(){ returntitre; } @Override publicStringgetMessage(){ public String getMessage() { returnmessage; } }

211

Exemple(Rservationdessalles)
ClasseMAJEnseignant: publicclassMAJEnseignant{ publicvoidajouterEnseignant(Enseignant ens)throws EnseignantDejaExistantException { g j p if(DAOEnseignant.findEnseignantByMatricule(ens.getMatricule())!=null){ thrownewEnseignantDejaExistantException(); }else{ } else { DAOEnseignant.createEnseignant(ens.getEnseignantBean()); } }

212

Exemple(Rservationdessalles)
publicvoidmodifierEnseignant(Enseignant ens)throws EnseignantIntrouvableException{ g p { if(DAOEnseignant.findEnseignantByMatricule(ens.getMatricule( ))==null){ )) ll) { thrownewEnseignantIntrouvableException(); }else{ } else { DAOEnseignant.updateEnseignant(ens.getEnseignantBean()); } }
213

Exemple(Rservationdessalles)
publicvoidsupprimerEnseignant(Enseignantens)throws EnseignantIntrouvableException{ g p { //TODOverifiersidesreservationsexistentpourl'enseignant if(DAOEnseignant.findEnseignantByMatricule(ens.getMatricule( ))==null){ thrownewEnseignantIntrouvableException(); throw new EnseignantIntrouvableException(); }else{ DAOEnseignant.deleteEnseignant(ens.getEnseignantBean()); } }
214

Exemple(Rservationdessalles)
publicEnseignant rechercherEnseignantParId(intmatricule)throws EnseignantIntrouvableException{ EnseignantBeanensb = DAOEnseignant.findEnseignantByMatricule(matricule); if(ensb==null){ thrownewEnseignantIntrouvableException(); }else{ Enseignantens new Enseignant(ensb); Enseignant ens =newEnseignant(ensb); returnens; } }

215

Exemple(Rservationdessalles)
publicArrayList<Enseignant> rechercherEnseignantParCritere(Enseignantens)throws AucunEnseignantTrouveException{ ArrayList<Enseignant>listeEnseignants=newArrayList<Enseignant>(); ArrayList<Enseignant> listeEnseignants = new ArrayList<Enseignant>(); EnseignantBeanensb1; if(ens==null){ ensb1=null; }else{ ensb1=newEnseignantBean( ens.getMatricule(), ens getMatricule() ens.getNom(), ens.getPrenom(), ens.getTelephone()); } for(EnseignantBeanensb2:DAOEnseignant.findEnseignantsByCriteria(ensb1)){ listeEnseignants.add(newEnseignant(ensb2)); } } if(listeEnseignants.size()==0)thrownewAucunEnseignantTrouveException(); returnlisteEnseignants; }

216

Exemple(Rservationdessalles)
publicclassMAJSalle{ publicSallerechercherSalleParReservation(Reservation reservation){ SalleBeansalleb=newSalleBean(); S ll B ll b S ll B () salleb.setNumSalle(reservation.getSalle().getNumSalle()); ArrayList<SalleBean>liste= DAOSalle.findSallesByCriteria(salleb); }
217

Exemple(Rservationdessalles)

218

Exemple(Rservationdessalles)
Packagedao: publicclassDAOEnseignant { privatestaticCallableStatementinsertEnseignant,updateEnseignant,deleteEnseignant, selectIDEnseignant; l publicstaticintcreateEnseignant(EnseignantBeanenseignant){ try{ if(insertEnseignant==null) { if (i i ll) Stringappel="{callINSERT_ENSEIGNANT(?,?,?,?)}"; insertEnseignant=Connexion.getConnexion().prepareCall(appel); } insertEnseignant.clearParameters(); insertEnseignant.setInt(1,enseignant.getMatricule()); insertEnseignant.setString(2,enseignant.getNom()); insertEnseignant.setString(3,enseignant.getPrenom()); i E i S i (3 i P ()) insertEnseignant.setString(4,enseignant.getTelephone()); returninsertEnseignant.executeUpdate(); }catch(SQLExceptionex){ newControleur().afficherErreur(ex.getMessage(),"Erreurd'accsauxdonnes"); C l () ffi h E ( M () "E d' d ") return0; } }

219

Exemple(Rservationdessalles ):dao
publicstaticintupdateEnseignant(EnseignantBeanenseignant){ try{ if(updateEnseignant null) { if (updateEnseignant ==null){ Stringappel="{callUPDATE_ENSEIGNANT(?,?,?,?)}"; updateEnseignant=Connexion.getConnexion().prepareCall(appel); } updateEnseignant.clearParameters(); d E i l P () updateEnseignant.setString(2,enseignant.getNom()); updateEnseignant.setString(3,enseignant.getPrenom()); p g g( , g g p ()); updateEnseignant.setString(4,enseignant.getTelephone()); updateEnseignant.setInt(1,enseignant.getMatricule()); returnupdateEnseignant.executeUpdate(); }catch(SQLExceptionex){ newControleur().afficherErreur(ex.getMessage(),"Erreurd'accsauxdonnes"); new Controleur() afficherErreur(ex getMessage() "Erreur d'accs aux donnes"); return0; } }

220

Exemple(Rservationdessalles ):dao
publicstaticEnseignantBeanfindEnseignantByMatricule(intmatricule){ try{ if(selectIDEnseignant==null){ Stringappel="{callREAD_ENSEIGNANT(?,?,?,?)}"; selectIDEnseignant Connexion.getConnexion().prepareCall(appel); selectIDEnseignant =Connexion.getConnexion().prepareCall(appel); } selectIDEnseignant.clearParameters(); selectIDEnseignant.setInt(1,matricule); selectIDEnseignant.registerOutParameter(2,Types.VARCHAR); selectIDEnseignant.registerOutParameter(3,Types.VARCHAR); selectIDEnseignant.registerOutParameter(4,Types.VARCHAR); selectIDEnseignant.executeQuery(); //suite

221

Exemple(Rservationdessalles ):dao
ResultSetrs=Connexion.enseignantsRS; if(rs==null){ findEnseignantsByCriteria(null);//affichertouslesenseignants } rs.beforeFirst(); if(rs.next()){ if(Connexion.enseignantsRS!=null){ Connexion.enseignantsRS.beforeFirst(); intligneCourante,id; while(Connexion.enseignantsRS.next()){ id=Connexion.enseignantsRS.getInt("Matricule"); if(id==matricule){ ligneCourante=Connexion.enseignantsRS.getRow(); Connexion.enseignantsRS.absolute(ligneCourante);//pointersurlenseignant recherche h h break; } } }
222

Exemple(Rservationdessalles ):dao
returnnewEnseignantBean( matricule, selectIDEnseignant.getString(2), selectIDEnseignant.getString(3), selectIDEnseignant.getString(4)); }else{ } l { returnnull; }

}catch(SQLExceptionex){ //newControleur().afficherErreur(ex.getMessage(),"Erreurd'accsaux //new Controleur() afficherErreur(ex getMessage() "Erreur d'accs aux donnes"); returnnull; } }
223

Exemple(Rservationdessalles ):dao
Classeconnexion: publicclassConnexion{ privatestaticConnectionconnexion=null;//singleton private static Connection connexion null; // singleton publicstaticStatementst; publicstaticPreparedStatementprst; publicstaticResultSetrs,enseignantsRS,sallesRS,reservationsRS; publicstaticConnectiongetConnexion(){ if(connexion==null) { try{ loadDrivers(); connexion=DriverManager.getConnection(sgbd.getUrlPrefix().concat(sgbd.getHostname()),login,password); connected=true; }catch(SQLExceptione){ afficherErreur("Laconnexionn'apaspuetretablie:\n"+e.getMessage(),"Problmedeconnexion"); \ } } returnconnexion; }
224

Exemple(Rservationdessalles ):dao
publicstaticvoiddisconnect(){ try{ try { if(connexion!=null){ connexion.close(); } connected=false; connexion=null; }catch(SQLExceptione){ afficherErreur("Laconnexionn'apaspuetreferme:\n"+e.getMessage(), "Problmedeconnexion"); } }

225

Exemple(Rservationdessalles ):contrleur
publicclassControleur{ protectedstaticFenetrePrincipalefenetrePrincipale=newFenetrePrincipale(); publicstaticFenetrePrincipalegetFenetrePrincipale(){ returnfenetrePrincipale; } publicvoidafficherMessage(Stringmessage,Stringtitre){ JOptionPane.showMessageDialog(fenetrePrincipale,message,titre, JOptionPane.INFORMATION_MESSAGE); } publicvoidafficherAvertissement(Stringmessage,Stringtitre){ JOptionPane.showMessageDialog(fenetrePrincipale,message,titre, JOptionPane.WARNING_MESSAGE); } publicvoidafficherErreur(Stringmessage,Stringtitre){ JOptionPane.showMessageDialog(fenetrePrincipale,message,titre, JOptionPane.ERROR_MESSAGE); JOptionPane ERROR MESSAGE); } }
226

Exemple(Rservationdessalles ):contrleur
publicclassControleurEnseignant extends Controleur { publicvoidajouterEnseignant(intmatricule,Stringnom, public void ajouterEnseignant(int matricule, String nom, Stringprenom,Stringtelephone) { try{ newMAJEnseignant().ajouterEnseignant( newEnseignant(matricule,nom,prenom,telephone)); afficherListeEnseignants();//voir afficherMessage("L'enseignantatajoutavecsuccs","Ajoutrussi"); }catch(EnseignantDejaExistantExceptionex){afficherErreur(ex.getMessage(), } catch (EnseignantDejaExistantException ex) { afficherErreur(ex getMessage() ex.getTitre()); } }

227

Exemple(Rservationdessalles ):dialogue
privatevoidboutonAjouterActionPerformed(java.awt.event.ActionEventevt){ if(champsValides()){ try{ newControleurEnseignant().ajouterEnseignant( Integer.parseInt(champMatricule.getText()), champNom.getText(), champPrenom.getText(), champTelephone.getText()); }catch(NumberFormatExceptione){ newControleur().afficherErreur( "Lematriculedoittreunevaleurnumrique", "Saisieincorrecte"); } }else{ newControleur().getFenetrePrincipale().afficherErreur( "Certainschampsn'ontpastrenseigns","Erreurdesaisie"); } }
228

Exemple(Rservationdessalles ):contrleur
publicvoidmodifierEnseignant(intmatricule,Stringnom, Stringprenom,Stringtelephone){ try{ newMAJEnseignant().modifierEnseignant( newEnseignant(matricule,nom,prenom,telephone)); E i ( i l l h )) afficherListeEnseignants(); g ( g g , j afficherMessage("L'enseignantatsauvegardavecsuccs","Misejour russie"); }catch(EnseignantIntrouvableExceptionex){ afficherErreur(ex.getMessage(),ex.getTitre()); afficherErreur(ex getMessage() ex getTitre()); } }

229

Exemple(Rservationdessalles):buttonsnavigation
privatevoidboutonFirstActionPerformed(java.awt.event.ActionEventevt){ newControleurEnseignant().firstEnseignant(); }

publicvoidfirstEnseignant(){ try{ { if(Connexion.enseignantsRS.first()){ rechercherEnseignantParId(Connexion.enseignantsRS.getInt("Matricule")); } navigate();//dsactiveetactivelesbuttonsdenavigation }catch(SQLExceptionex){ Logger.getLogger(ControleurEnseignant.class.getName()).log(Level.SEVERE,null, ex); } }

230

Exemple(Rservationdessalles):buttonsnavigation
publicvoidnavigate(){ try{ if(Connexion.enseignantsRS.isLast()||Connexion.enseignantsRS.isAfterLast()){ fenetrePrincipale.getPanneauEnseigant().getPanneauEnseigantDetails().getBoutonNe xt().setEnabled(false); xt() setEnabled(false); fenetrePrincipale.getPanneauEnseigant().getPanneauEnseigantDetails().getBoutonLa st().setEnabled(false); }else{ } else { fenetrePrincipale.getPanneauEnseigant().getPanneauEnseigantDetails().getBoutonNe xt().setEnabled(true); fenetrePrincipale.getPanneauEnseigant().getPanneauEnseigantDetails().getBoutonLa st().setEnabled(true); } //suite // suite
231

Exemple(Rservationdessalles):buttonsnavigation
if(Connexion.enseignantsRS.isFirst()||Connexion.enseignantsRS.isBeforeFirst()){ fenetrePrincipale.getPanneauEnseigant().getPanneauEnseigantDetails().getBoutonFirst().setEna bled(false); fenetrePrincipale.getPanneauEnseigant().getPanneauEnseigantDetails().getBoutonPrevious().set Enabled(false); } }else{ { fenetrePrincipale.getPanneauEnseigant().getPanneauEnseigantDetails().getBoutonFirst().setEna bled(true); fenetrePrincipale.getPanneauEnseigant().getPanneauEnseigantDetails().getBoutonPrevious().set fenetrePrincipale getPanneauEnseigant() getPanneauEnseigantDetails() getBoutonPrevious() set Enabled(true); } }catch(SQLExceptionex){ } catch (SQLException ex) { Logger.getLogger(ControleurEnseignant.class.getName()).log(Level.SEVERE,null,ex); } }

232

Exemple(Rservationdessalles):buttonsnavigation
publicvoidnextEnseignant(){ try{ if(Connexion.enseignantsRS.next()) { rechercherEnseignantParId(Connexion.enseignantsRS.getInt("Matricule")); g ( g g ( )); } navigate(); }catch(SQLExceptionex){ } catch (SQLException ex) { Logger.getLogger(ControleurEnseignant.class.getName()).log(Level.SEVERE, null,ex); null ex); } }

233

Exemple(Rservationdessalles):buttonsnavigation
publicvoidpreviousEnseignant(){ try{ y{ if(Connexion.enseignantsRS.previous()) { rechercherEnseignantParId(Connexion.enseignantsRS.getInt( M rechercherEnseignantParId(Connexion enseignantsRS getInt("M atricule")); } navigate(); }catch(SQLExceptionex){ Logger.getLogger(ControleurEnseignant.class.getName()).log(Le vel.SEVERE,null,ex); }
234

Exemple(Rservationdessalles):buttonsnavigation
publicvoidlastEnseignant(){ try{ if(Connexion.enseignantsRS.last()){ rechercherEnseignantParId(Connexion.enseignantsRS.getInt("Matricule")); g ( g g ( )); } navigate(); }catch(SQLExceptionex){ } catch (SQLException ex) { Logger.getLogger(ControleurEnseignant.class.getName()).log(Level.SEVERE, null,ex); null ex); } }

235

Exemple(Rservationdessalles):buttonsnavigation
publicvoidrechercherEnseignantParId(intmatricule){ try{ Enseignantens new Enseignant ens =new MAJEnseignant().rechercherEnseignantParId(matricule); fenetrePrincipale.getPanneauEnseigant().actualiserFormulaire( ens.getMatricule(), ens getMatricule() ens.getNom(), ens.getPrenom(), ens.getTelephone()); g navigate();
236

Exemple(Rservationdessalles):buttonsnavigation
//etafficherlalistedesresevationsdelenseignantdonne ens.setReservations(newReservationSalles().consulterReservationsEnseignant(ens)); Vectordonnees=newVector(); for(Reservationreservation:ens.getReservations()){ Vectorligne=newVector(); Sallesalle=newMAJSalle().rechercherSalleParReservation(reservation); ligne.add(reservation.getSalle().getNumSalle()); ligne.add(reservation.getSalle().getCapacite()); ligne.add(reservation.getDateReservation()); donnees.add(ligne); } fenetrePrincipale.getPanneauEnseigant().actualiserTableReservations(donnees,null); }catch(EnseignantIntrouvableExceptionex){ fenetrePrincipale.getPanneauEnseigant().viderFormulaire(); afficherErreur(ex.getMessage(),ex.getTitre()); }catch(AucuneReservationTrouveeex){ fenetrePrincipale.getPanneauEnseigant().actualiserTableReservations(null,null); } }
237

Jtable
publicvoidafficherListeEnseignants(){ public void afficherListeEnseignants() { Enseignantens=newEnseignant(); try{ Vectorentetes=newVector(DAOEnseignant.getEnseignantColNames()); Vectordonnees=newVector(); for(Enseignantens2:newMAJEnseignant().rechercherEnseignantParCritere(ens)){ Vectorligne=newVector(); ligne.add(ens2.getMatricule()); ligne.add(ens2.getNom()); ligne.add(ens2.getPrenom()); ligne.add(ens2.getTelephone()); donnees.add(ligne); }

fenetrePrincipale.getPanneauEnseigant().actualiserTableEnseignants(donnees,entetes);
}catch(AucunEnseignantTrouveExceptionex){ } catch (AucunEnseignantTrouveException ex) { fenetrePrincipale.getPanneauEnseigant().actualiserTableEnseignants( null,newVector(DAOEnseignant.getEnseignantColNames())); } } } Jframe: newControleurEnseignant().afficherListeEnseignants();

238

Exemple(Rservationdessalles ):Jtable
publicvoidactualiserTableEnseignants(Vectordonnees,Vector titres){ ){ if(donnees==null||donnees.size()==0) labelAucuneDonneeAffichee.setVisible(true); else labelAucuneDonneeAffichee.setVisible(false); tableEnseignants.setModel(new DefaultTableModel(donnees,titres)); DefaultTableModel(donnees, titres)); listeFiltre.setModel(newDefaultComboBoxModel(titres)); }
239

Exemple(Rservationdessalles ):Jtable
ublicvoidactualiserTableReservations(Vectordonnees,Vectortitres){ if(titres==null){ Vectortitres2=newVector(); titres2.add("N desalle"); titres2.add("Capacit"); titres2.add("Rservepourle:"); titres=titres2; } if(donnees==null||donnees.size()==0) labelAucuneReservation.setVisible(true); else labelAucuneReservation.setVisible(false); tableReservations.setModel(newDefaultTableModel(donnees,titres)); //pourajusterleslargeursdecolonnes tableReservations.getColumnModel().getColumn(0).setPreferredWidth(5); tableReservations.getColumnModel().getColumn(1).setPreferredWidth(5); //pourlesdatesenfranais for(inti=0;i<tableReservations.getRowCount();i++){ Datedate=(Date)tableReservations.getValueAt(i,2); DateFormatdateFormat=DateFormat.getDateInstance( DateFormat.FULL,Locale.FRANCE); DateFormat FULL Locale FRANCE) tableReservations.setValueAt(dateFormat.format(date),i,2); } } 240