Bases de Donn ´ees : Java DataBase Connectivity
St ´ephane Devismes
Universit ´e Grenoble Alpes
26 ao ˆut 2020
S. Devismes (UGA) JDBC 26 ao ˆut 2020 1 / 30
Plan
1
Introduction
2
JDBC
3
Servlets HTTP
S. Devismes (UGA) JDBC 26 ao ˆut 2020 2 / 30
Introduction JDBC ServletsHTTP
Int ´egration SQL
Aujourd’hui, nous allons ´etudier comment utiliser l’application JDBC et les servlets HTTP pour acc ´eder `a une base de donn ´ees SQL `a partir d’une interface web, afin d’interroger la base de donn ´ees ou de modifier ses donn ´ees.
Introduction JDBC ServletsHTTP
Organisation `a 3 niveaux ( three-tier )
En haut
: niveau pr ´esentation. Typiquement, une interface web : un navigateur (HTML) sur la machine client.
En bas
: niveau donn ´ees. La base de donn ´ees sur le serveur de bases de donn ´ees (SGBD : SQL ).
Au milieu
: niveau logique. Traduction entre les 2 autres niveaux.
Client (navigateur HTML )
requ ˆete
Serveur Web (JDBC)
r ´eponse
OO
requ ˆete
HTTP
servletsJDBC
statementsServeur de donn ´ees ( SQL )
r ´eponse
OO
Niveau logique
Traduction entre les 2 autres niveaux sur un serveur web.
La communication entre le client et le serveur web est assur ´ee par le protocole de transfert HTTP .
Des servlets permettent de cr ´eer dynamiquement des donn ´ees au sein du serveur HTTP . Ces donn ´ees sont g ´en ´eralement pr ´esent ´ees au format HTML, ou XML, ou autre.
Une servlet s’ex ´ecute dynamiquement sur le serveur web et permet l’extension des fonctions de ce dernier : acc `es `a des bases de donn ´ees, transactions d’e-commerce, etc.
S. Devismes (UGA) JDBC 26 ao ˆut 2020 6 / 30
Sch ´ema de programmation
JDBC (Java DataBase Connectivity) est une interface de programmation (API, Application Programming Interface) qui permet `a des programmes Java d’acc ´eder `a une base de donn ´ees SQL .
JDBC fournit des m ´ethodes pour interroger et mettre `a jour les donn ´ees. JDBC proc `ede en quatre temps :
1
Connexion `a la base de donn ´ees : Connection conn = ...;
2
Ouverture d’une
instruction
(statement) : Statement st = ...;
...;
3
Interrogation de la base de donn ´ees : ResultSet rs = ...; ...;
puis utilisation des r ´esultats retourn ´es.
(Pour une modification de la base de donn ´ees cette troisi `eme phase est modifi ´ee.)
4
Fermeture et d ´econnection : st.close(); rs.close();
conn.close();
S. Devismes (UGA) JDBC 26 ao ˆut 2020 8 / 30
Introduction JDBC ServletsHTTP
Pilote
Des pilotes (drivers) JDBC sont disponibles pour tous les syst `emes de bases de donn ´ees relationnelles.
Par exemple oracle.jdbc.OracleDriver pour Oracle.
Le pilote est utilis ´e pour cr ´eer une connexion `a la base de donn ´ees.
L’appel `a Class.forName d ´eclenche un chargement dynamique du pilote et l’enregistre dans la classe DriverManager , qui g `ere la connection `a la base de donn ´ee.
Introduction JDBC ServletsHTTP
Pilote : exemple
impo rt java . sql .*;
publ ic class E x e m p l e J D B C {
publ ic stat ic void main ( Str ing [] Args ) {
try {
Class . f o r N a m e (" or acle . jdbc . O r a c l e D r i v e r ");
}
catch ( E x c e p t i o n e ) {
// a f f i c h a g e dans la c o n s o l e
Syst em . err . p r i n t l n (" Pas de pilo te ! ");
}
... c o n n e x i o n et u t i l i s a t i o n de la base ...
} }
ResultSet
Un objet de la classe ResultSet (ensemble de r ´esultats) permet de r ´ecup ´erer le r ´esultat d’une requ ˆete sous la forme d’une table.
Il y a plusieurs m ´ethodes dans la classe ResultSet pour parcourir un ensemble de r ´esultats, en particulier la m ´ethode next() (un it ´erateur) permet d’acc ´eder `a chaque ligne de la table r ´esultat et retourne
faux
lorsque la fin de la table est atteint.
Pour r ´ecup ´erer les valeurs des attributs on utilise les m ´ethodes getString(p) , getInt(p) , getFloat(p) , etc, de la classe ResultSet , o `u p est la position ( `a partir de 1) de l’attribut dans le SELECT .
S. Devismes (UGA) JDBC 26 ao ˆut 2020 11 / 30
Interrogation : exemple (1/2)
Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";
Stri ng login = " login ", pwd = " mot de passe ";
C o n n e c t i o n conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );
S t a t e m e n t st = conn . c r e a t e S t a t e m e n t ();
R e s u l t S e t rs = st . e x e c u t e Q u e r y (" SE LECT Nom , Prenom , Age FROM p e r s o n n e ORDER BY age ");
while ( rs . next ()) {
Syst em . out . p r i n t l n (" Nom : " + rs . g e t S t r i n g (1));
Syst em . out . p r i n t l n (" Pr ´e nom : " + rs . g e t S t r i n g (2));
Syst em . out . p r i n t l n (" Age : " + rs . g e t S t r i n g (3));
}
rs . close ();
st . close ();
conn . close ();
S. Devismes (UGA) JDBC 26 ao ˆut 2020 12 / 30
Introduction JDBC ServletsHTTP
Interrogation : exemple (2/2)
C o n n e c t i o n conn ;
Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";
Stri ng login = " login ", pwd = " mot de passe ";
Stri ng R e q u e t e = " sele ct noca ge from L e s G a r d i e n s where nome = ’ Sc holl ’";
conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );
S t a t e m e n t st = conn . c r e a t e S t a t e m e n t ();
R e s u l t S e t rs = st . e x e c u t e Q u e r y ( R e q u e t e );
Syst em . out . p r i n t l n (" Cages gard ´e es par Scho ll : ");
while( rs . next ())
Syst em . out . p r i n t l n ( rs . g e t S t r i n g (1));
rs . close ();
st . close ();
conn . close ();
Introduction JDBC ServletsHTTP
Interrogation : avec traitement des exceptions
C o n n e c t i o n conn ;
Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";
Stri ng login = " login ", pwd = " mot de passe ";
Stri ng R e q u e t e = " sele ct noca ge from L e s G a r d i e n s where nome = ’ Sc holl ’";
try{
conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );
S t a t e m e n t st = conn . c r e a t e S t a t e m e n t ();
R e s u l t S e t rs = st . e x e c u t e Q u e r y ( R e q u e t e );
Syst em . out . p r i n t l n (" Cages gard ´e es par Scho ll : ");
while( rs . next ()) {
Syst em . out . p r i n t l n ( rs . g e t S t r i n g (1));
}
rs . close ();
st . close ();
conn . close ();
}
catch( S Q L E x c e p t i o n se ){
Syst em . err . p r i n t l n (" Err eur SQL ");
J D B C T u t o r i a l U t i l i t i e s . p r i n t S Q L E x c e p t i o n ( se );
}
catch( E x c e p t i o n e ){
Syst em . err . p r i n t l n (" M e s s a g e d ’ err eur ");
Modification
Pour les modifications d’une base de donn ´ees ( INSERT, UPDATE, DELETE ), on utilise la fonction executeUpdate de la classe Statement .
Chaque modification des donn ´ees retourne un entier : c’est le nombre de lignes affect ´ees par la modification.
Utiliser les quotes doubles et le + pour manipuler les chaˆınes en Java . Attention aux quotes : doubles pour Java , simples pour SQL .
Lorsque nom vaut Marie et age vaut 25 , o `u Marie et 25 sont des chaˆınes pour Java , alors la chaˆıne Java
"VALUES (’" + nom + "’, " + age + ")"
est form ´ee de la concat ´enation de VALUES (’ puis Marie puis ’, puis 25 puis ) , ce qui donne le morceau de code SQL :
VALUES (’Marie’, 25)
S. Devismes (UGA) JDBC 26 ao ˆut 2020 15 / 30
Ajout : exemple
Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";
Stri ng login = " login ", pwd = " mot de passe ", Nom = " Marie ", Age = " 25 ";
C o n n e c t i o n conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );
S t a t e m e n t st = conn . c r e a t e S t a t e m e n t ();
int nb = st . e x e c u t e U p d a t e (" INSER T INTO p e r s o n n e ( Nom , Age ) "
+ " VAL UES ( ’ " + nom + " ’, " + age + " ) ");
Syst em . out . p r i n t l n ( nb + " ligne ( s ) ins ´e r ´e e ( s ) ");
st . close ();
conn . close ();
S. Devismes (UGA) JDBC 26 ao ˆut 2020 16 / 30
Introduction JDBC ServletsHTTP
JDBC et transactions
Par d ´efaut : auto-commit Sinon
Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";
Stri ng login = " login ", pwd = " mot de passe ", Nom = " Marie ", Age = " 25 ";
C o n n e c t i o n conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );
conn . s e t A u t o C o m m i t (false);
try { ...
conn . com mit ();
}
catch ( S Q L E x c e p t i o n e ) { ...
conn . r o l l b a c k ();
} f i n a l l y {
conn . close ();
}
Introduction JDBC ServletsHTTP
Acc `es `a une base via le Web
Ce qui pr ´ec `ede doit ˆetre utilis ´e avec Java : compilation puis ex ´ecution.
Pour y acc ´eder directement depuis une page web, via des pages HTML, on peut utiliser des servlets HTTP .
Package javax.servlet.http
Les servlets de Java sont utilis ´ees pour le d ´eveloppement de pages
web. Typiquement, elles permettent `a un serveur d’engendrer des
pages HTML en utilisant les r ´eponses `a des requ ˆetes SQL formul ´ees
par un client.
Post et Get
La communication entre le client et le serveur web utilise les requ ˆetes de lecture GET et POST (identique `a GET mais plus s ˆure) de HTTP . HTTP (HyperText Transfer Protocol) est un protocole de
requ ˆete-r ´eponse entre un client et un serveur. Typiquement, le serveur est un serveur web et le client est un navigateur. Le client soumet des requ ˆetes, auxquelles le serveur r ´epond.
S. Devismes (UGA) JDBC 26 ao ˆut 2020 20 / 30
HttpServlet
Une servlet est une classe Java qui traite des requ ˆetes HTTP .
Une servlet est sous-classe de la classe abstraite HttpServlet cr ´e ´ee pour former une servlet HTTP pour un site Web.
Cette sous-classe implante les m ´ethodes :
doGet(HttpServletRequest req, HttpServletResponse res) pour les requ ˆetes GET de HTTP ,
doPost(HttpServletRequest req, HttpServletResponse res) pour les requ ˆetes POST de HTTP .
S. Devismes (UGA) JDBC 26 ao ˆut 2020 21 / 30
Introduction JDBC ServletsHTTP
Protocole sans ´etat
Le protocole HTTP est un protocole non connect ´e ou protocole
sans
´etats
(stateless protocol), cela signifie que chaque requ ˆete est trait ´ee ind ´ependamment des autres et qu’aucun historique des diff ´erentes requ ˆetes n’est conserv ´e.
Cependant, on peut
passer des param `etres d’une page `a une autre ;
on peut sauvegarder des informations durant toute la dur ´ee de la session.
Introduction JDBC ServletsHTTP
Passage de param `etre via la m ´ethode doPost()
Une requ ˆete POST n’est utilisable qu’avec un formulaire HTML.
<FORM ACTION="Resultat"
METHOD="POST">
<INPUT TYPE="TEXT" NAME="NOM">
<INPUT TYPE="TEXT" NAME="PRENOM">
<Input TYPE="SUBMIT" VALUE="Envoyer">
</FORM>
La m ´ethode doPost() doit g ´en ´eralement recueillir les param `etres pour les traiter et g ´en ´erer la r ´eponse.
Pour obtenir la valeur associ ´ee `a chaque param `etre il faut utiliser la
m ´ethode getParameter() de l’objet HttpServletRequest . Cette
R ´ecup ´eration des param `etres dans Resultat.java
impo rt javax . s e r v l e t . http .*;
impo rt java . io .*;
publ ic class R e s u l t a t e x t e n d s H t t p S e r v l e t {
publ ic void doP ost ( H t t p S e r v l e t R e q u e s t req , H t t p S e r v l e t R e s p o n s e res ) thro ws S e r v l e t E x c e p t i o n , I O E x c e p t i o n {
// pour l ’ a f f i c h a g e en HTML P r i n t W r i t e r out = res . g e t W r i t e r ();
Stri ng nom = req . g e t P a r a m e t e r (" NOM ");
Stri ng pre nom = req . g e t P a r a m e t e r (" PR ENOM ");
out . p r i n t l n (" Nom : " + nom + " , pr ´e nom : " + pre nom );
} }
S. Devismes (UGA) JDBC 26 ao ˆut 2020 24 / 30
HttpSession
Un objet de la classe HttpSession permet d’identifier un utilisateur et de m ´emoriser des donn ´ees relatives `a cet utilisateur.
Une servlet HTTP utilise un objet de la classe HttpSession pour cr ´eer une session entre un client HTTP et un serveur HTTP .
La session persiste pendant un temps limit ´e (elle expire), elle permet `a la servlet de voir et manipuler l’information concernant la session (identifiant, date de cr ´eation, date du dernier acc `es, ...).
S. Devismes (UGA) JDBC 26 ao ˆut 2020 25 / 30
Introduction JDBC ServletsHTTP
HttpSession : utilisation (1/2)
Un objet de type HttpSession s’obtient gr ˆace `a la m ´ethode getSession(boolean) de la classe HttpServletRequest . La m ´ethode getSession(boolean) de la classe
HttpServletRequest , avec l’argument true , permet de cr ´eer une session relative `a l’utilisateur.
La m ´ethode getSession(true) doit ˆetre appel ´ee avant tout envoi de donn ´ees au navigateur.
HttpSession session = req.getSession(true);
Introduction JDBC ServletsHTTP
HttpSession : utilisation (1/2)
La m ´ethode setAttribute(String cle,Object valeur) de la classe HttpSession permet de stocker des informations dans la session.
La m ´ethode getAttribute(String cle) de la classe HttpSession permet de r ´ecup ´erer une valeur (type Object ) qui a ´et ´e
pr ´ec ´edemment stock ´ee dans un objet de type HttpSession .
Il faut donc effectuer un surtypage pour obtenir un type ´el ´ementaire
de donn ´ees (par exemple un entier sera renvoy ´e sous forme d’objet
Integer qu’il faudra convertir en int ).
HttpSession : exemple ( Index.java )
impo rt java . sql .*;
impo rt javax . s e r v l e t .*;
impo rt javax . s e r v l e t . http .*;
impo rt java . io .*;
publ ic class Index e x t e n d s H t t p S e r v l e t {
publ ic void doGet ( H t t p S e r v l e t R e q u e s t req , H t t p S e r v l e t R e s p o n s e res ) thro ws S e r v l e t E x c e p t i o n , I O E x c e p t i o n {
P r i n t W r i t e r out = res . g e t W r i t e r ();
out . p r i n t l n (" < FORM METH OD =\" POST \" ACTI ON =\" I n d e x A c t i o n \" > ");
out . p r i n t l n (" Login : ");
out . p r i n t l n (" < INPUT TYPE =\" text \" NAME =\" login \" > ");
out . p r i n t l n (" P a s s w o r d : ");
out . p r i n t l n (" < INPUT TYPE =\" p a s s w o r d \" NAME =\" pwd \" > ");
out . p r i n t l n (" < INPUT TYPE =\" su bmit \" VALUE =\" C o n n e c t i o n \" > ");
out . p r i n t l n (" < input type =\" reset \" value =\" Reset \" > ");
out . p r i n t l n (" </ FORM > ");
} }
S. Devismes (UGA) JDBC 26 ao ˆut 2020 28 / 30
HttpSession : exemple ( IndexAction.java )
publ ic class I n d e x A c t i o n e x t e n d s H t t p S e r v l e t { Stri ng pwd , login ;
publ ic void doP ost ( H t t p S e r v l e t R e q u e s t req , H t t p S e r v l e t R e s p o n s e res ) thro ws S e r v l e t E x c e p t i o n , I O E x c e p t i o n {
login = req . g e t P a r a m e t e r (" login ");
pwd = req . g e t P a r a m e t e r (" pwd ");
H t t p S e s s i o n s e s s i o n = req . g e t S e s s i o n (true);
s e s s i o n . s e t A t t r i b u t e (" login ", login );
s e s s i o n . s e t A t t r i b u t e (" pwd ", pwd );
/* suite du code */
} }
S. Devismes (UGA) JDBC 26 ao ˆut 2020 29 / 30
Introduction JDBC ServletsHTTP
HttpSession : exemple ( Scholl.java )
publ ic class Scho ll e x t e n d s H t t p S e r v l e t {
publ ic void doP ost ( H t t p S e r v l e t R e q u e s t req , H t t p S e r v l e t R e s p o n s e res ) thro ws S e r v l e t E x c e p t i o n , I O E x c e p t i o n {
C o n n e c t i o n conn ;
Stri ng url = " jdbc : orac le : thin : @im2ag - ora cle . e . ujf - g r e n o b l e . fr :1 521: t p t o m c a t ";
H t t p S e s s i o n s e s s i o n = req . g e t S e s s i o n (true);
Stri ng login =( Stri ng ) s e s s i o n . g e t A t t r i b u t e (" login ");
Stri ng pwd =( Stri ng ) s e s s i o n . g e t A t t r i b u t e (" pwd ");
Stri ng R e q u e t e = " sele ct noca ge from L e s G a r d i e n s where nome = ’ Sc holl ’";
// pour l ’ a f f i c h a g e en HTML P r i n t W r i t e r out = res . g e t W r i t e r ();
conn = D r i v e r M a n a g e r . g e t C o n n e c t i o n ( url , login , pwd );
S t a t e m e n t st = conn . c r e a t e S t a t e m e n t ();
R e s u l t S e t rs = st . e x e c u t e Q u e r y ( R e q u e t e );
// l ’ a f f i c h a g e est s i m p l i f i ´e : on peut y i n c l u r e du HTML out . p r i n t l n (" Cages gard ´e es par Scho ll : ");
while( rs . next ())
out . p r i n t l n ( rs . g e t S t r i n g (1));
rs . close ();
st . close ();
conn . close ();
}