Академический Документы
Профессиональный Документы
Культура Документы
KamalMOUMMADI
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
11
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
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
19
JSF
MarocTelecom
20
Architectureduneapplication multitiers
CLIENT Lger Applet Java Oracle 8i
HTTP
SQL SQ PL/SQL
Net8 N t8
CLIENT LOURD Application J D B C
Procdures Java
Net8 N 8
Java
22
23
24
DiffrentstypesdeC/S
ModledeGartnerpourlessystmesdeuxniveaux(2tiers):
Prsentation
Donnes
Traitement T it t
client
serveur
Prsentation rhabillage g donnes transaction Systme rpartie y p
25
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
28
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
Serveur
Application serveur
I2 I1
I3
Middleware OS
I2 I1
Carte rseau C
Carte rseau C
33
34
3: communication
ODBC,CORBA,RPC
35
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.
JDBCetlesarchitecturesclientsserveursmultitiers
2 tiers 2tiers
3tiers
41
JDBC-Net driver
Proprietary protocol
JDBC protocol
Oracle
Sybase
Oracle
Sybase
42
43
44
LestypesdepilotesJDBC
Type2: unpilotecritenJavaappellel'APInativedelabasede
donnes.CetypedepiloteconvertitlesordresJDBCpourappeler directementlesAPIsdelabasededonnes.Ilestdecefaitncessairede fournirauclientlAPInativedelabasededonnes.Ellessont gnralementenCouenC++.
45
46
47
48
ResultSet
50
51
Vuedensembledupaquetage j java.sql q
52
53
54
SQLException
SQLWarning
55
Prsentationdesclassesdel'APIJDBC
Remarque : Chacune de ces classes dpend de l'instanciation d'un objet de la prcdente classe.
56
57
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
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
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
61
Il suffit de slectionner le pilote et de cliquer sur "Terminer". Dans l'exemple ci dessous, le pilote slectionn concerne une base Oracle
62
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
Un clic sur le bouton Terminer cre la source de donnes qui pourra alors t i l s tre utilise.
64
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
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
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:
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
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
105
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
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)
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
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
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
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
ANNEXE(JTable)
Utilit Reprsenterdesdonnessousformetabulaire:
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);
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(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());
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
167
168
InterfacesFillesduRowSet
169
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
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
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
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
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(); }
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