Upload
dinhque
View
223
Download
2
Embed Size (px)
Citation preview
JDBC
JDBC
JDBC
JDBC
Ja
va
Da
taB
ase
Co
nn
ectiv
ity
© P
hilip
pe G
EN
OU
DU
JF
1©
Philip
pe G
EN
OU
DU
JF
130/0
1/2
013
Ja
va
Da
taB
ase
Co
nn
ectiv
ity
JDBC
JDBC
Mach
ine
Virtu
elle
Jav
a Intro
ductio
nIn
troductio
n
�J
DB
C J
ava
Da
ta B
as
e C
on
ne
ctiv
ity
�A
PI ja
va
sta
nd
ard
qu
i pe
rme
t un
accè
s h
om
og
èn
e à
de
s b
ase
s d
e
do
nn
ée
s d
ep
uis
un
pro
gra
mm
e J
ava
au
trave
rs d
u la
ng
ag
e S
QL
.
Pro
gra
mm
e J
ava
AP
I JD
BC
© P
hilip
pe G
EN
OU
DU
JF
230/0
1/2
013
Serv
eu
rO
racle
Serv
eu
r M
yS
QL
Serv
eu
r P
ostg
reS
QL
�L
'AP
I JD
BC
est in
dé
pe
nd
an
ted
es S
GB
D.
�U
n c
hangem
ent d
e S
GB
D n
e d
oit p
as im
pacte
r le c
ode a
pplic
atif.
http
://do
cs.o
racle
.co
m/ja
vase/6
/do
cs/te
ch
no
tes/g
uid
es/jd
bc/
JDBC
JDBC
inte
rfaces d
e l'A
PI J
DBC
inte
rfaces d
e l'A
PI J
DBC
�L
'AP
I JD
BC
dé
finit u
n e
nse
mb
le d
'inte
rface
s (p
acka
ge
java.sql
)
qu
i dé
finis
se
nt u
n p
roto
co
le d
e c
om
mu
nic
atio
n e
ntre
le p
rog
ram
me
java
clie
nt e
t le s
erv
eu
r de
ba
se
de
do
nn
ée
s p
ou
r
�o
uve
rture
/ferm
etu
re d
e c
on
ne
xio
ns à
un
e b
ase
de
do
nn
ée
s
�e
xé
cu
tion
de
req
uê
tes S
QL
�e
xp
loita
tion
de
s ré
su
ltats
–co
rresp
on
da
nce
typ
es S
QL
-typ
es J
AV
A
�a
ccè
s a
u m
éta
-mo
dè
le
© P
hilip
pe G
EN
OU
DU
JF
330/0
1/2
013
�a
ccè
s a
u m
éta
-mo
dè
le–
de
scrip
tion
de
s o
bje
ts d
u S
GB
D
principales interfaces de j
ava.sql
Driv
er
Sta
tem
en
t
Pre
pare
dS
tate
men
t
Calla
ble
Sta
tem
en
t
Co
nn
ectio
nR
esu
ltSet
Resu
ltSetM
eta
Data
Data
baseM
eta
Data
Co
nn
exio
n e
t au
then
tificatio
n
au
prè
s d
u S
GB
D
Req
uète
s S
QL
Résu
ltats
des
req
uête
s
JDBC
JDBC
Pilo
tes J
DBC
Pilo
tes J
DBC
�Le c
ode a
pplic
atif e
st b
asé s
ur le
s in
terfa
ces d
u J
DB
C
�P
ou
r accé
de
r à u
n S
GB
D il e
st n
éce
ssa
ire d
e d
ipo
se
r de
cla
sse
s
imp
lém
en
tan
tce
s in
terfa
ce
s.
�E
lles d
ép
en
de
nt
du
SG
BD
ad
ressé
.
�L
'en
se
mb
le d
e c
es c
lasse
s p
ou
r un
SG
BD
do
nn
é e
st a
pp
elé
pilo
te (d
rive
r) JD
BC
© P
hilip
pe G
EN
OU
DU
JF
430/0
1/2
013
Serv
eu
rO
racle
Serv
eu
r M
yS
QL
Serv
eu
r P
ostg
reS
QL
•Il ex
iste des pilotes
pour tous les SGBD im
portants du m
arché (O
racle, MyS
QL, PostgreS
QL, D
B2, …
)
•JDBC spécifie uniquem
ent l’API que ces pilotes
doivent respecter. Ils sont réalisés par une tierce
partie (fournisseur d
u SGBD, «
éditeur d
e logiciel…)
•l’im
plémentation d
es drivers est totalem
ent libre
Pro
gra
mm
e J
ava
AP
I JD
BC
Pro
gra
mm
e J
ava
AP
I JD
BC
Serv
eu
rO
racle
Serv
eu
r P
ostg
reS
QL
JDBC
JDBC
Pilo
tes J
DBC
Pilo
tes J
DBC
inte
rfaces
Driv
er
Sta
tem
en
t
Pre
pare
dS
tate
men
t
Calla
ble
Sta
tem
en
t
Co
nn
ectio
nR
esu
ltSet
Resu
ltSetM
eta
Data
Data
baseM
eta
Data
Co
nn
exio
n e
t au
then
tifica
tion
au
prè
s d
u S
GB
D
Req
uète
s S
QL
Résu
ltats
des
req
uète
s
Les in
terfa
ces d
éfin
issent u
ne
ab
stra
ctio
ndu p
ilote
(driv
er) d
e la
base d
e d
onnées.
Chaque fo
urn
isseur p
ropose s
a
pro
pre
imp
lém
en
tatio
n d
e c
es
inte
rfaces.
Driv
er O
racle
8i
Driv
er M
yS
ql
© P
hilip
pe G
EN
OU
DU
JF
530/0
1/2
013
Au n
iveau d
u p
rogra
mm
e
d’a
pplic
atio
n o
n n
e tra
vaille
qu
’avec
les a
bstra
ctio
ns
(inte
rfaces) s
ans c
e
soucie
r des c
lasses e
ffectiv
es
d’im
plé
menta
tion
Les c
lasses d
’implé
menta
tion d
u
driv
er jd
bc s
ont d
ans u
ne a
rchiv
e
(fichie
r jar o
u z
ip) q
u’il fa
ut in
tégre
r (s
ans la
décom
pre
sser) a
u n
iveau d
u
classpath
de l’a
pplic
atio
n a
u
mom
ent d
e l’e
xécutio
n
inte
rfaces.
JDBC
JDBC
Driv
ers
JDBC
Driv
ers
JDBC
�il e
xis
te 4
typ
es d
e p
ilote
s J
DB
C
�ty
pe
1 : p
on
t JD
BC
–O
DB
C
�ty
pe
2 : p
ilote
qu
i fait a
pp
el à
de
s fo
nctio
ns n
ativ
es (c
od
e
no
n J
ava
, le p
lus s
ou
ve
nt e
n C
ou
C+
+) d
e l'A
PI d
u S
GB
D
© P
hilip
pe G
EN
OU
DU
JF
630/0
1/2
013
no
n J
ava
, le p
lus s
ou
ve
nt e
n C
ou
C+
+) d
e l'A
PI d
u S
GB
D
�ty
pe
3 : p
ilote
qu
i pe
rme
t l'utilis
atio
n d
'un
se
rve
ur m
idd
lew
are
�ty
pe
4 : p
ilote
en
tièe
me
nt e
n J
ava
qu
i utilis
e d
irecte
me
nt le
p
roto
co
le ré
se
au
du
SG
BD
JDBC
JDBC
Driv
ers
JDBC
Driv
ers
JDBC
�Lis
te d
es d
rivers
dis
ponib
les à
:http://java.sun.com/products/jdbc/jdbc.drivers.html
�séle
ctio
n d
’un
driv
er :
�choix
entre
vite
sse, fia
bilité
et p
orta
bilité
.
© P
hilip
pe G
EN
OU
DU
JF
730/0
1/2
013
�P
rogra
mm
e «
sta
ndalo
ne
», a
vec u
ne in
terfa
ce g
raphiq
ue q
ui
s’e
xécute
toujo
urs
sur u
n s
ystè
me W
indow
s p
eut tire
r bénéfic
e d
e
perfo
rmances d
’un d
river ty
pe 2
(driv
er c
ode-n
atif).
�U
ne a
pple
t peut n
écessite
r un d
river d
e ty
pe 3
(pour p
asser u
n
firew
all).
�U
ne s
erv
let d
éplo
yée s
ur d
e m
ultip
les p
late
form
es p
eut n
écessite
r la
souple
sse o
fferte
par d
es d
rivers
de ty
pe 4
.
�...
JDBC
JDBC
Driv
ers
JDBC
Driv
ers
JDBC
�4 c
até
gorie
s d
e d
rivers
JD
BC
�ty
pe 1
: Pont J
DB
C-O
DB
C (O
pen D
ata
Base C
onnectiv
ity)
Ap
plic
atio
n J
ava
JD
BC
(java.s
ql) D
riverM
an
ag
er
imp
ose c
harg
em
en
t dan
s la
mém
oire
viv
e d
e la
Driv
er ty
pe 1
(JD
BC
/OD
BC
Brid
ge
)
Driv
er m
an
ag
er
OD
BC
Driv
er O
DB
C
OD
BC
•
inte
rface d
’accès (C
) au
x S
GB
D d
éfin
ie p
ar
Mic
roso
ft •
sta
nd
ard
de fa
it, très g
ran
d n
om
bre
de S
GB
D
accessib
les
© P
hilip
pe G
EN
OU
DU
JF
830/0
1/2
013
Inte
rface s
erv
eu
r S
GB
D
pla
tefo
rme d
’exécu
tion
de lib
rairie
s d
yn
am
iqu
es
Driv
er O
DB
C
Inte
rface c
lien
t SG
BD
co
de
bin
aire
OD
BC
su
r le c
lien
t•
alo
urd
it pro
ce
ss
us
d’in
sta
llatio
n e
t de
ma
inte
na
nc
e•
pro
blè
me
de
sé
cu
rité p
ou
r les
ap
ple
ts•
ap
ple
ts «
un
trus
ted
» n
’on
t pa
s l
’au
toris
atio
n d
e c
ha
rge
r e
n m
ém
oire
du
co
de
na
tif
JDBC
JDBC
Driv
ers
JDBC
Driv
ers
JDBC
�T
ype 2
: AP
I nativ
e
Ap
plic
atio
n J
ava
JD
BC
(java.s
ql) D
riverM
an
ag
er
imp
ose c
harg
em
en
t dan
s la
mém
oire
viv
e d
e la
p
late
form
e d
’exécu
tion
de lib
rairie
s d
yn
am
iqu
es
Driv
er ty
pe 2
inte
rface d
’accès e
ntre
le d
river m
an
ag
er
JD
BC
et l
’inte
rface c
lien
te d
u S
GB
D
Inte
rface c
lien
t SG
BD
© P
hilip
pe G
EN
OU
DU
JF
930/0
1/2
013
Inte
rface s
erv
eu
r S
GB
D
pla
tefo
rme d
’exécu
tion
de lib
rairie
s d
yn
am
iqu
es
(co
de
bin
aire
de
l’in
terfa
ce
clie
nt s
pé
cifiq
ue
au
SG
BD
p
ar e
xe
mp
le lib
rairie
s O
CI, O
racle
Ca
ll Inte
rface
, co
nçu
es
initia
lem
ent p
ou
r pro
gra
mm
eu
rs C
/C+
+)
Driv
er d
éd
ié à
un
SG
BD
pa
rticu
lier
•m
oin
s o
uve
rt qu
e p
on
t JD
BC
/OD
BC
•p
ote
ntie
llem
en
t plu
s p
erfo
rma
nt (m
oin
s d
e c
ou
ch
es
log
icie
lles
)
mê
me
s p
rob
lèm
es
qu
’ave
c p
on
t JD
BC
-OD
BC
•c
od
e n
atif s
ur p
late
form
e d
’ex
éc
utio
n
JDBC
JDBC
Driv
ers
JDBC
Driv
ers
JDBC
�T
ype 3
: JD
BC
-Net
Ap
plic
atio
n J
ava
JD
BC
(java.s
ql) D
riverM
an
ag
er
Driv
er ty
pe 3
trad
uit a
pp
els
JD
BC
su
ivan
t un
pro
toco
le ré
seau
à v
ocatio
n u
niv
ers
elle
ind
ép
en
dan
t des
fou
rnis
seu
rs d
e S
GB
D (S
ql*n
et, N
ET
8)
req
uête
s ré
seau
do
iven
t être
en
su
ite tra
du
ites p
ar
un
serv
eu
r déd
ié a
ux re
qu
ête
s s
pécifiq
ues à
un
S
GB
D (p
ar e
xem
ple
WebLogic
de B
EA
)In
terfa
ce c
lien
t SG
BD
Inte
rface s
erv
eu
r mid
dle
ware
© P
hilip
pe G
EN
OU
DU
JF
10
30/0
1/2
013
Inte
rface s
erv
eu
r S
GB
D
driv
ers
100%
Java
pe
uve
nt ê
tre u
tilisé
s d
ep
uis
un
e a
pp
let (le
s d
rive
rs n
e s
on
t plu
s
du
co
de
na
tif et p
eu
ve
nt ê
tre c
ha
rgé
s c
om
me
n’im
po
rte q
ue
l c
om
po
sa
nt J
ava
)
SG
BD
(par e
xem
ple
WebLogic
de B
EA
)
si l
’ap
plic
atio
n e
st u
ne a
pp
let, le
mo
dèle
cla
ssiq
ue d
e
sécu
ritép
eu
t po
ser d
es p
rob
lèm
e d
e c
on
nexio
n ré
seau
•u
ne
ap
ple
t «u
ntru
ste
d»
ne
pe
ut o
uvrir u
ne
co
nn
ex
ion
qu
’ave
c la
m
ac
hin
e s
ur la
qu
elle
elle
es
t hé
be
rgé
e•
il su
ffit d’in
sta
ller le
se
rve
ur W
eb
et le
se
rve
ur m
idd
lew
are
su
r la
mê
me
pla
tefo
rme
. Po
ss
ibilité
d’a
cc
éd
er a
lors
à u
n S
GB
D s
itué
n
’imp
orte
où
su
r le ré
se
au
.
mid
dle
ware
JDBC
JDBC
Driv
ers
JDBC
Driv
ers
JDBC
�T
ype 4
: Thin
(pro
tocole
natif)
Ap
plic
atio
n J
ava
JD
BC
(java.s
ql) D
riverM
an
ag
er
Driv
er ty
pe 4
le d
river in
tera
git d
irecte
men
t avec le
g
estio
nn
aire
du
SG
BD
utilis
e d
irec
tem
en
t pro
toc
ole
rés
ea
u d
u S
GB
D
(sp
éc
ifiqu
e à
un
fou
rnis
se
ur d
e S
GB
D)
© P
hilip
pe G
EN
OU
DU
JF
11
30/0
1/2
013
Inte
rface s
erv
eu
r S
GB
D
Driv
er 1
00%
Java (c
on
nexio
n v
ia s
ockets
Jav
a)
So
lutio
n la
plu
s la
plu
s é
lég
an
te e
t la p
lus s
ou
ple
si l
’ap
plic
atio
n e
st u
ne a
pp
let, le
mo
dèle
cla
ssiq
ue d
e s
écu
ritéd
es a
pp
lets
imp
ose q
ue le
S
GB
D s
oit h
éb
erg
é s
ur le
serv
eu
r Web
Du
ran
t le p
roje
t le d
river u
tilisé p
ou
r accéd
er à
Ora
cle
sera
de c
e ty
pe
JDBC
JDBC
vers
ions d
e J
DBC
vers
ions d
e J
DBC
�D
iffére
nte
s v
ers
ion
s
�JD
BC
1.0
Co
re A
PI (J
DK
1.1
) : pa
cka
ge
java.sql
�su
pp
orte
le s
tan
da
rd S
QL
-2 e
ntry
leve
l
�JD
BC
2.0
(Ja
va
2 J
DK
1.2
) : pa
cka
ge
s java.sql javax.sql
�su
pp
ort d
e c
erta
ine
s fo
nctio
nn
alité
de
SQ
L-3
© P
hilip
pe G
EN
OU
DU
JF
12
30/0
1/2
013
�JD
BC
3.0
(JD
K 1
.4) : p
acka
ge
s java.sql javax.sql
javax.sql.rowset
�su
pp
ort d
'au
tres fo
nctio
nn
alité
s d
e S
QL
-3
�n
ou
ve
au
su
pp
ort p
ou
r la g
estio
n d
es R
esu
ltSe
t
�JD
BC
4.0
(JD
K 1
.6)
�fa
cilité
d'é
critu
re a
u tra
ve
rs d
'an
no
tatio
ns
JDBC
JDBC
Cla
sses e
t inte
rfaces d
e J
DBC
Cla
sses e
t inte
rfaces d
e J
DBC
principales inte
rface
sde ja
va.sql
Driv
er
Sta
tem
en
t
Pre
pare
dS
tate
men
t
Calla
ble
Sta
tem
en
t
Co
nn
ectio
nR
esu
ltSet
Resu
ltSetM
eta
Data
Data
baseM
eta
Data
Co
nn
exio
n e
t au
then
tificatio
n
au
prè
s d
u S
GB
D
Req
uète
s S
QL
Résu
ltats
des
req
uête
s
© P
hilip
pe G
EN
OU
DU
JF
13
30/0
1/2
013
principales cla
sses d
e ja
va.sql
Java.la
ng
.Ob
ject
Java.u
til.Date
Th
row
ab
le
Excep
tion
Driv
erM
an
ag
er
Driv
erP
rop
erty
Info
Typ
es
Date
Tim
eT
imeS
tam
p
SQ
LE
xcep
tion
Batc
hU
pd
ate
Excep
tion
SQ
LW
arn
ing
Data
Tru
ncatio
n
Ch
arg
e e
t co
nfig
ure
le
driv
er c
lien
t du
SG
BD
JDBC
JDBC
Ap
plic
atio
n J
ava
Mach
ine V
irtuelle
Jav
a
Driv
er M
anager
Driv
er M
anager
Driv
erM
an
ag
er
Driv
er J
DB
Cfo
urn
isseu
r 1
�D
riverM
anager : c
lasse ja
va à
laquelle
s’a
dre
sse le
code d
e l’a
pplic
atio
n
clie
nte
.
Driv
er J
DB
Cfo
urn
isseu
r 2
AP
I JD
BC
java
.sq
lL
e d
river m
an
ag
er
perm
et d
e c
harg
er e
tco
nfig
ure
r les p
ilote
s
JD
BC
nécessaire
s à
l'a
pp
licatio
n
© P
hilip
pe G
EN
OU
DU
JF
14
30/0
1/2
013
SG
BD
fou
rnis
seu
r 1S
GB
Dfo
urn
isseu
r 2
fou
rnis
seu
r 1fo
urn
isseu
r 2l'a
pp
licatio
n
JDBC
JDBC
Cla
sses e
t inte
rfaces d
e J
DBC
Cla
sses e
t inte
rfaces d
e J
DBC
Driv
erM
an
ag
er
Co
nn
ectio
nC
on
nectio
nC
on
nectio
n
�O
bje
ts in
sta
ncié
s à
partir d
es ty
pes J
ava d
éfin
is d
ans java.sql
DriverManager
perm
et d
e c
réer
des o
bje
ts Connection
© P
hilip
pe G
EN
OU
DU
JF
15
30/0
1/2
013
Sta
tem
en
tP
rep
are
dS
tate
men
tC
alla
ble
Sta
tem
en
t
Resu
ltSet
Resu
ltSet
Resu
ltSet
Un
ob
jetConnection
perm
et d
e c
réer
des o
bje
ts e
ncap
su
lan
t des re
qu
ête
s S
QL
Les o
bje
ts e
ncap
su
lan
t les re
qu
ête
s
SQ
L p
erm
ette
nt d
e c
réer d
es o
bje
ts
ResultSet
en
cap
su
lan
t le ré
su
ltat
d’u
ne re
qu
ête
JDBC
JDBC
1) C
harg
em
ent d
u d
river
1) C
harg
em
ent d
u d
river
�A
vant d
e p
ouvoir ê
tre u
tilisé, le
driv
er d
oit ê
tre e
nre
gis
tré a
uprè
s d
u
DriverManager
de jd
bc.
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
�M
ais
si o
n re
gard
e m
ieux la
doc d
e J
DB
C...
�Il e
st d
onc p
réfé
rable
d’e
xplo
iter le
s p
ossib
ilités d
e c
harg
em
ent d
ynam
ique d
e
cla
sses d
e J
AV
A
Wh
en a D
river class is lo
aded
, it sho
uld
create an in
stance o
f itself and
register it w
ith th
e Driv
erMan
ager.
© P
hilip
pe G
EN
OU
DU
JF
16
30/0
1/2
013
cla
sses d
e J
AV
A
�U
tiliser la
méth
ode forName
de la
cla
sse Class
avec e
n p
ara
mètre
le n
om
com
ple
t de la
cla
sse d
u d
river.
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Class.forName("oracle.jdbc.OracleDriver");
}catch (ClassNotFoundException e) {
...
}
�P
erm
et d
e p
ara
métre
r le d
river s
ans m
odifie
r l’applic
atio
n (p
ar e
xem
ple
nom
du d
river s
tocké d
ans u
n fic
hie
r de c
onfig
ura
tion (p
rop
ertie
s file
))
Ch
arg
em
en
t d'u
n p
ilote
OB
DC
Ch
arg
em
en
t d'u
n p
ilote
Ora
cle
.newInstance();
JDBC
JDBC
2) C
onnexio
n à
la b
ase
2) C
onnexio
n à
la b
ase
�O
uve
rture
de
la c
on
ne
xio
n :
Connectionconn = DriverManager.getConnection(url,
user, password);
Connectionconn = DriverManager.getConnection(url,
user, password);
�Id
en
tifica
tion
de
la B
D v
ia u
n U
RL (U
nifo
rm R
esso
urc
e L
oca
tor)
de
la fo
rme
gé
né
rale
identific
atio
n
de la
base
base
le d
river o
u le
type
du S
GB
DR
driver:
l'utilis
atio
n
de J
DB
C
jdbc:
© P
hilip
pe G
EN
OU
DU
JF
17
30/0
1/2
013
oracle:thin:
jdbc:
@serveur:
nom
IP d
userv
eur
�E
xe
mp
le :
Connection
conn
= DriverManager.getConnection(
"jdbc:oracle:thin:@im2ag-oracle.e.ujf-grenoble.fr:1521:ufrima",
user, password);
Connection
conn
= DriverManager.getConnection(
"jdbc:oracle:thin:@im2ag-oracle.e.ujf-grenoble.fr:1521:ufrima",
user, password);
de la
base
du S
GB
DR
de J
DB
C
La fo
rme e
xacte
dépend d
e la
BD
, chaque B
D n
écessita
nt d
es in
form
atio
ns s
pécifiq
ues
pour é
tablir la
connexio
n. P
ar e
xem
ple
pour le
driv
er O
racle
JD
BC
-Thin
:
:base
nom
de la
base
num
éro
de p
ort
socket à
utilis
er
port
JDBC
JDBC
Exem
ple
s d
e c
onnexio
ns
Exem
ple
s d
e c
onnexio
ns
�T
rouver u
n d
river J
DB
C :
�sur le
s s
ites d
es fo
urn
isseurs
de B
D
�Lis
te d
es d
rivers
dis
ponib
les à
:http://www.oracle.com/technetwork/java/index-136695.html
Class.forName("oracle.jdbc.OracleDriver");
Connectionconnect= DriverManager.getConnection(
"jdbc:oracle:thin:@im2ag-oracle.e.ujf-grenoble.fr:1521:ufrima",
user, password);
Ora
cle
11g
su
r im2ag-oracle.e.ujf-grenoble.fr
:
ojd
bc6.ja
r
Quand getConnection
est in
voquée le
DriverManager
inte
rroge c
haque d
river e
nre
gis
tré, s
i un d
river re
connaît
l’url il c
rée e
t reto
urn
e u
n o
bje
t Connection
.try{
© P
hilip
pe G
EN
OU
DU
JF
18
30/0
1/2
013
user, password);
... // utilisation connexion pour accéder à la base
try{
Class.forName("com.mysql.jdbc.Driver");
Connectionconnect= DriverManager.getConnection(
"jdbc:mysql://localhost/test",
user, password);
...
}catch (ClassNotFoundExceptione) {
...
}catch (SQLExceptione) {
...
}
un
e b
ase M
yS
QL
4.1
locale
:
mysq
l-co
nn
ecto
r-java-3
.1.6
-bin
.jar
catch (SQLExceptionsqle) {
...
} }catch (ClassNotFoundExceptione) {
...
}
JDBC
JDBC
Connexio
ns
Connexio
ns
�U
ne a
pplic
atio
n p
eut m
ain
tenir d
es c
onnexio
ns m
ultip
les
�le
nom
bre
limite
de c
onnexio
ns e
st fix
é p
ar le
SG
BD
lui m
êm
e (d
e q
uelq
ues
diza
ines à
des m
illiers
).
�Q
uand u
ne Connection
n’a
plu
s d
’utilité
pre
ndre
soin
de la
ferm
er e
xp
licite
men
t.
�Lib
éra
tion d
e m
ém
oire
et s
urto
ut d
es re
ssourc
es d
e la
base d
e d
onnées
déte
nues p
ar la
connexio
n
try {
Connection conn = DriverManager.getConnection("jdbc:odbc:companydb",
© P
hilip
pe G
EN
OU
DU
JF
19
30/0
1/2
013
Connection conn = DriverManager.getConnection("jdbc:odbc:companydb",
user, passwd);
...
// utilisation de la connexion pour dialoguer avec la BD
...
// fermeture de la connexion
conn.close();
}catch (SQLException e) {
...
}
Erre
ur S
QL
lors
du
dia
logue
avec la
BD
L'in
stru
ctio
n close
n'e
st p
as
ex
éc
uté
e.
La
co
nn
ex
ion
res
te o
uve
rte !
Co
mm
en
t gara
ntir la
ferm
etu
re d
es c
on
nexio
ns ?
JDBC
JDBC
Ferm
etu
re d
'une c
onnexio
nFerm
etu
re d
'une c
onnexio
n
�P
our g
ara
ntir fe
rmetu
re d
e la
connexio
n : U
tilisatio
n d
'une c
lause finally
try {
Connection conn = DriverManager.getConnection("jdbc:odbc:companydb",
user, passwd);
...
// utilisation de la connexion pour dialoguer avec la BD
...
// fermeture de la connexion
conn = DriverManager.getConnection("jdbc:odbc:companydb",
Connection conn; = null;
Po
ur q
ueconn
so
it co
nn
ue
da
ns
le b
loc
finally
Le
co
mp
ilate
ur im
po
se
d'in
itialis
erconn
© P
hilip
pe G
EN
OU
DU
JF
20
30/0
1/2
013
finally {
conn.close();
}
// fermeture de la connexion
conn.close();
}catch (SQLException e) {
...
}
conn
ne
pe
ut ê
tre ré
so
lu
close
pe
ut p
rovo
qu
er u
ne
SQ
LE
xc
ep
tion
try {
}catch (SQLException e){
e.printStackTrace();
}
conn
pe
ut n
e p
as
avo
ir été
initia
lisé
e
if (conn != null)
JDBC
JDBC
Ferm
etu
re d
'une c
onnexio
nFerm
etu
re d
'une c
onnexio
n
�P
our g
ara
ntir fe
rmetu
re d
e la
connexio
n : u
tilisatio
n d
'un try
avec re
ssourc
es
(Java7) a
u lie
u d
e la
cla
use finally
try
{
conn= DriverManager.getConnection("jdbc:odbc:companydb",
user, passwd);
...
// utilisation de la connexion pour dialoguer avec la BD
...
}catch (SQLException
e) {
...
Connection conn = null;
© P
hilip
pe G
EN
OU
DU
JF
21
30/0
1/2
013
...
}finally{
try
{
if (conn
!= null)
conn.close();
}catch (SQLExceptione){
e.printStackTrace();
}
}
try
( Connection
conn
=
DriverManager.getConnection("jdbc:odbc:companydb",
user, passwd) ) {
...
// utilisation de la connexion pour dialoguer avec la BD
...
}catch (SQLException
e) {
...
}
Les re
sso
urc
es
so
nt
au
tom
atiq
uem
en
tfe
rmées
à la
fin d
e l'in
stru
ctio
ntry
JDBC
JDBC
3) P
répare
r/exécute
r une re
quête
3) P
répare
r/exécute
r une re
quête
�U
ne
fois
un
e Connection
cré
ée
on
pe
ut l’u
tilise
r po
ur c
rée
r et e
xé
cu
ter
de
s re
qu
ête
s (s
tate
me
nts
) SQ
L.
�3
typ
es
(inte
rfac
es) d
'ob
jets
sta
tem
ent
:
�Statement
: req
uê
tes s
imp
les (S
QL
sta
tiqu
e)
�PreparedStatement
: req
uê
tes p
réco
mp
ilée
s (S
QL
dyn
am
iqu
e s
i
su
pp
orté
pa
r SG
BD
) qu
i pe
uve
nt a
mé
liore
r les p
erfo
rma
nce
s
Sta
tem
en
t
Pre
pare
dS
tate
men
t
Calla
ble
Sta
tem
en
t
© P
hilip
pe G
EN
OU
DU
JF
22
30/0
1/2
013
�CallableStatement
: en
ca
psu
le p
rocé
du
res S
QL
sto
cké
es d
an
s le
SG
BD
�3
form
es
(mé
tho
de
s) d
'ex
éc
utio
ns
:
�executeQuery
: po
ur le
s re
qu
ête
s q
ui re
tou
rne
nt u
n ré
su
ltat (SELECT
)
�ré
su
ltat a
cce
ssib
le a
u tra
ve
rs d
’un
ob
jetResultSet
�executeUpdate
: po
ur le
s re
qu
ête
s q
ui n
e re
tou
rne
nt p
as d
e ré
su
ltat
(INSERT, U
PDATE, D
ELETE, C
REATE TABLE
et D
ROP TABLE
)
�execute
: qu
an
d o
n n
e s
ait p
as s
i la re
qu
ête
reto
urn
e o
u n
on
un
ré
su
ltat, p
rocé
du
res s
tocké
es
JDBC
JDBC
Pré
pare
r / exécute
r une
requête
sim
ple
Pré
pare
r / exécute
r une
requête
sim
ple
String myQuery = "SELECT prenom, nom, email "
+
�C
réa
tion
d'u
n s
tate
me
nt:
Statement stmt = conn.createStatement();
�E
xé
cu
tion
de
la re
qu
ête
:
© P
hilip
pe G
EN
OU
DU
JF
23
30/0
1/2
013
String myQuery = "SELECT prenom, nom, email "
+
"FROM employe "
+
"WHERE (nom='Dupont') AND (email IS NOT NULL) "
+
"ORDER BY nom";
ResultSet rs = stmt.executeQuery(myQuery);
�executeQuery(String q)
renvoie
un o
bje
t de ty
pe ResultSet
�perm
et d
e d
écrire
la ta
ble
des ré
sulta
ts
JDBC
JDBC
Lectu
re d
es ré
sulta
tsLectu
re d
es ré
sulta
ts
�executeQuery()
renvoie
un o
bje
t de c
lasse ResultSet
�perm
et d
e d
écrire
la ta
ble
des ré
sulta
ts
java.sql.Statement stmt = conn.createStatement();
ResultSetrs= stmt.executeQuery("SELECT nom, code_client FROM Clients");
Nom
Prénom
Code_client
Adresse
DUPONT
Jean
12345
135 rue du Lac
DUROND
Louise
12545
13 avenue de la Mer
...
...
Nom
Code_client
DUPONT
12345
DUROND
12545
...
...
© P
hilip
pe G
EN
OU
DU
JF
24
30/0
1/2
013
while (rs.next())
{
... Exploiter les données
}
�Les ra
ngées d
u ResultSet
se p
arc
oure
nt ité
rativ
em
ent lig
ne (ro
w)
par lig
ne
�boolean next()
perm
et d
’avancer à
la lig
ne s
uiv
ante
, �false
si p
as d
e
ligne s
uiv
ante
�P
lacé a
vant la
pre
miè
re lig
ne à
la c
réatio
n d
u ResultSet
...
ZORG
Albert
45677
8 Blvd De la Montagne
...
ZORG
45677
JDBC
JDBC
Lectu
re d
es ré
sulta
tsLectu
re d
es ré
sulta
ts
�Les c
olo
nnes s
ont ré
fére
ncées p
ar le
ur n
um
éro
ou p
ar le
ur n
om
�L'a
ccès a
ux v
ale
urs
des c
olo
nnes s
e fa
it par d
es m
éth
odes getXXX(String nomCol)
ou getXXX(int numCol)
où XXX
dépend d
u ty
pe d
e la
colo
nne d
ans la
table
SQ
L
�P
ou
r les trè
s g
ros ro
w, o
n p
eu
t utilis
er d
es s
trea
ms.
java.sql.Statement stmt = conn.createStatement();
ResultSetrs= stmt.executeQuery("SELECT a, b, c FROM Table1");
© P
hilip
pe G
EN
OU
DU
JF
25
30/0
1/2
013
ResultSetrs= stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next())
{
int i = rs.getInt("a"); // rs.getInt(1);
String s = rs.getString("b"); // rs.getString(2);
byte b[] = rs.getBytes("c"); // rs.getBytes(3);
System.out.println("ROW = " + i + " " + s + " " + b[0]);
}
Atte
ntio
n ! E
n S
QL
les
n
um
éro
s d
e c
olo
nn
es
d
éb
ute
nt à
1
JDBC
JDBC
Equiv
ale
nces d
es
types J
ava-S
QL
Equiv
ale
nces d
es
types J
ava-S
QL
�P
our c
haque m
éth
ode getXXX
le d
river J
DB
C d
oit e
ffectu
er u
ne c
onvers
ion
entre
le ty
pe d
e d
onnées d
e la
base d
e d
onnées e
t le ty
pe J
ava c
orre
spondant
getObject
peu
t reto
urn
er
getBigDecimal
getString
getString
DE
CIM
AL
VA
RC
HA
R
CH
AR
NU
ME
RIC
getBigDecimal
java.Math.BigDecimal
String
String
java.Math.BigDecimal
Typ
e S
QL
Méth
od
eTyp
e J
ava
Peu
t être
ap
pelé
e s
ur
n’im
po
rte q
uel ty
pe d
e v
ale
ur
© P
hilip
pe G
EN
OU
DU
JF
26
30/0
1/2
013
getObject
peu
t reto
urn
er
n’im
po
rte q
uel ty
pe d
e d
on
née
«p
ackag
é» d
an
s u
n o
bje
t java
(wra
pp
er o
bje
ct )
getInt
getFloat
getDouble
getBoolean
getDate
getTime
getTimestamp
getObject
INT
EG
ER
RE
AL
FL
OA
T
BIT
DA
TE
TIM
E
TIM
E S
TA
MP
DO
UB
LE
TIN
YIN
T
SM
AL
LIN
T
BIG
INT
getShort
getByte
getLong
getDouble
int
float
double
boolean
java.sql.Date
java.sql.Time
java.sql.Timestamp
short
byte
long
double
Si u
ne c
on
vers
ion
de d
on
nées
invalid
e e
st e
ffectu
ée (p
ar e
x
DA
TE
-> in
t), un
e SQLException
est la
ncée
Boolean
Integer
Integer
Integer
Long
Float
Double
Double
JDBC
JDBC
Tra
item
ent d
es v
ale
urs
nulle
sTra
item
ent d
es v
ale
urs
nulle
s
�Q
ue s
e p
asse-t-il s
i une m
éth
ode getXXX()
de R
esultS
et e
st a
ppliq
uée à
une
vale
ur N
ULL
SQ
L ?
PERSONNES
Vale
urs
nu
lles a
ccep
tées
© P
hilip
pe G
EN
OU
DU
JF
27
30/0
1/2
013
�C
onvers
ion a
uto
matiq
ue v
ers
une v
ale
ur "a
ccepta
ble
" selo
n le
type re
tourn
é p
ar
getXXX()
�null
si getXXX()
reto
urn
e u
n ty
pe o
bje
t (ex : g
etString(),getDate(),…
)
�0
si getXXX()
reto
urn
e u
n ty
pe n
um
ériq
ue (e
x : g
etInt(),getDouble(),…
)
�false
pour g
etBoolean()
ResultSet rs = stmt.executeQuery("SELECT * FROM PERSONNES");
...
... rs.getString("ADRESSE")
... rs.getDate("DATE_NAISS")
��� �?
JDBC
JDBC
Tra
item
ent d
es v
ale
urs
nulle
sTra
item
ent d
es v
ale
urs
nulle
s
�C
om
ment d
istin
guer v
ale
urs
NU
LL d
es a
utre
s ?
PERSONNES
while (rs.next()) {
System.out.print(rs.getString("NOM"));
System.out.print(" " + rs.getString("PRENOM") + " ");
System.out.println(rs.getBoolean("MARIE")?"Marié":"Non Marié");
}
ResultSet rs = stmt.executeQuery("SELECT NOM,PRENOM,MARIE FROM PERSONNES ORDER BY NOM");
TITI Fifi Marié
TOTO Riri
Non Marié
TUTU Mimi Non Marié
...
© P
hilip
pe G
EN
OU
DU
JF
28
30/0
1/2
013
}
while (rs.next()) {
System.out.print(rs.getString("NOM"));
System.out.print(" " + rs.getString("PRENOM") + " ");
boolean marié = rs.getBoolean("MARIE");
if (rs.wasNull())
System.out.println("?");
else
System.out.println(marié?"Marié":"Non Marié");
}
�M
éth
ode wasNull()
de ResultSet
�R
envoie
true
si o
n v
ient d
e lire
une v
ale
ur N
ULL, false
sin
on
...
TITI Fifi Marié
TOTO Riri ?
TUTU Mimi Non Marié
...
JDBC
JDBC
Pré
pare
r/exécute
r une
requête
sim
ple
Pré
pare
r/exécute
r une
requête
sim
ple
Statement stmt = conn.createStatement();
�U
n o
bje
t Statement
rep
rése
nte
un
e s
imp
le (s
eu
le) re
qu
ête
SQ
L.
�U
n a
ppel à
executeQuery()
, executeUpdate()
ou execute()
ferm
e
implic
item
ent to
ut ResultSet
actif a
ssocié
avec l’o
bje
t Statement
.
Statement stmt = conn.createStatement();
�A
vant d
’exécute
r une a
utre
requête
avec u
n o
bje
t Statement
il faut ê
tre
sûr d
’avoir e
xplo
ité le
s ré
sulta
ts d
e la
requête
pré
cédente
.
© P
hilip
pe G
EN
OU
DU
JF
29
30/0
1/2
013
Statement stmt = conn.createStatement();
ResultSet rs1 = stmt.executeQuery(myQuery1);
ResultSet rs2 = stmt.executeQuery(myQuery2);
//exploitation des résultats de myQuery1
while (rs1.next() {
...
}//exploitation des résultats de myQuery2
while (rs2.next() {
...
}
Statement stmt = conn.createStatement();
ResultSet rs1 = stmt.executeQuery(myQuery1);
//exploitation des résultats de myQuery1
while (rs1.next() {
...
}ResultSet rs2 = stmt.executeQuery(myQuery2);
//exploitation des résultats de myQuery2
while (rs2.next() {
...
}
�S
i applic
atio
n n
écessite
d’e
ffectu
er p
lus d
’une re
quête
sim
ulta
ném
ent,
nécessaire
de c
réer e
t utilis
er a
uta
nt d
'obje
ts Statement
.
JDBC
JDBC
Un e
xem
ple
«com
ple
t»
Un e
xem
ple
«com
ple
t»
import java.sql.*;
public class TestJDBC {
public static void main(String[] args) throws Exception {
Class.forName("postgres95.pgDriver");
Connection conn= DriverManager.getConnection("jdbc:pg95:mabase",
"dedieu", "");
Statement stmt= conn.createStatement();
© P
hilip
pe G
EN
OU
DU
JF
30
30/0
1/2
013
ResultSet rs= stmt.executeQuery("SELECT * from employe");
while (rs.next()) {
String nom = rs.getString("nom");
String prenom = rs.getString("prenom");
String email = rs.getString("email");
}rs.close();
stmt.close();
conn.close();
}
}
JDBC
JDBC
Pré
pare
r/exécute
r une
requête
pré
com
pilé
ePré
pare
r/exécute
r une
requête
pré
com
pilé
e�
Cré
atio
n d
'un
pre
pa
red
Sta
tem
en
t(re
qu
ête
SQ
L d
yn
am
iqu
e):
�p
ara
mè
tres fo
rme
ls s
pé
cifié
s à
l’a
ide
de
?
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM ? WHERE NAME = ? "
);
�P
assa
ge
de
s p
ara
mè
tres e
ffectifs
�à
l’a
ide
de
mé
tho
de
s a
u fo
rma
t se
tXX
X(in
dic
e,v
ale
ur) o
ù X
XX
rep
rése
nte
le ty
pe
du
pa
ram
ètre
Dè
s q
ue
l’o
bje
t es
t ins
tan
cié
, la
pro
cé
du
re S
QL
es
t tran
sm
ise
au
S
GB
D q
ui la
pré
-co
mp
ile
© P
hilip
pe G
EN
OU
DU
JF
31
30/0
1/2
013
ps.setString(1, "Person" );
for (int i=0; i < names.length; i++) {
ps.setString(2, names[i]) ;
ResultSet rs = ps.executeQuery();
// ... Exploitation des résultats
}
�In
vo
ca
tion
et e
xp
loita
tion
de
s ré
su
ltats
�p
ha
se
ide
ntiq
ue
à c
elle
utilis
ée
po
ur S
QL s
tatiq
ue
JDBC
JDBC
Pro
cédure
s s
tockées
Pro
cédure
s s
tockées
�La p
lupart d
es S
GB
D in
clu
ent u
n la
ngage d
e p
rogra
mm
atio
n in
tern
e (e
x:
PL/S
QL d
’Ora
cle
) perm
etta
nt a
ux d
évelo
ppeurs
d’in
clu
re d
u c
ode p
rocédura
l
dans la
BD
, code p
ouvant ê
tre e
nsuite
invoqué d
epuis
d’a
utre
s a
pplic
atio
ns.
�le
code e
st é
crit u
ne s
eule
fois
est p
eut ê
tre u
tilisé p
ar d
iffére
nte
s
applic
atio
ns.
�perm
et d
e s
épare
r le c
ode d
es a
pplic
atio
ns d
e la
stru
ctu
re in
tern
e d
es
table
s. (c
as id
éal : e
n c
as d
e m
odific
atio
n d
e la
stru
ctu
re d
es ta
ble
s s
eul le
s
pro
cédure
s s
tockées o
nt b
esoin
d’ê
tre m
odifié
es)
© P
hilip
pe G
EN
OU
DU
JF
32
30/0
1/2
013
pro
cédure
s s
tockées o
nt b
esoin
d’ê
tre m
odifié
es)
�U
tilisatio
n d
es p
rocédure
s s
tockées d
epuis
JD
BC
via
inte
rface
CallableStatement
�S
ynta
xe u
nifié
e in
dépendante
de la
maniè
re d
ont c
elle
s-c
i sont g
éré
es p
ar
le S
GB
D (c
haque S
GB
D a
sa p
ropre
synta
xe)
�U
tilisatio
n p
ossib
le d
e la
vale
ur d
e re
tour
�G
estio
n d
es p
ara
mètre
s IN
, OU
T, IN
OU
T
JDBC
JDBC
Pro
cédure
s s
tockées
Pro
cédure
s s
tockées
CallableStatement proc = conn.callableStatement(
"{? = call maProcedure(?,?)}");
CallableStatement proc = conn. callableStatement(
"{call maProcedure(?,?)}");
Ap
pel a
vec v
ale
ur d
e re
tou
r et p
ara
mètre
s
Ap
pel s
an
s v
ale
ur d
e re
tou
r et a
vec p
ara
mètre
s
�P
répara
tion d
e l
’appel
�P
répara
tion d
es p
ara
mètre
s
proc.registerOUTParameter(2,Types.DECIMAL,3);
© P
hilip
pe G
EN
OU
DU
JF
33
30/0
1/2
013
No
mb
re d
e c
hiffre
s a
prè
s d
écim
ale
2èm
e p
ara
mètre
de ty
pe O
UT
�P
assage d
es p
ara
mètre
s IN
proc.setByte(1,25);
1er p
ara
mètre
(typ
e IN
)v
ale
ur
�A
ppel
ResultSet rs = proc.executeQuery();
�E
xplo
itatio
n d
u ResultSet
(idem
que p
our S
tatement
et PreparedStatement
)
�R
écupéra
tion d
es p
ara
mètre
s O
UT
java.Math.BigDecimal bigd = proc.getBigDecimal(2,3);
JDBC
JDBC
Accès a
ux m
éta
-données
Accès a
ux m
éta
-données
�P
erm
et d
e d
écouvrir d
ynam
iquem
ent (a
u m
om
ent d
e l’e
xécutio
n) d
es p
roprié
tés
concern
ant la
base d
e d
onnées o
u le
s ré
sulta
ts d
e re
quête
s
�E
xem
ple
: lors
de l’e
xécutio
n d
’une re
quête
non c
onnue à
l’avance.
execute
Update
??
execute
Query
??
Strin
g c
onte
nant u
ne
requête
quelc
onque
Accès a
u ResultSet
pro
duit p
ar la
requête
Renvoie
true
si re
quête
de ty
pe Query
false
sin
on (Update)
© P
hilip
pe G
EN
OU
DU
JF
34
30/0
1/2
013
cmd
stmt.execute(cmd)
pro
duit p
ar la
requête
if (stmt.execute(cmd)) {
ResultSet rs = stmt.getResultSet();
...
//Exploitation du ResultSet
...
rs.close();
}elseSystem.out.println("nombre de lignes modifiées " + stmt.getUpdateCount());
}
Besoin
d’a
ccès a
ux m
éta
-données d
u R
esultS
et
JDBC
JDBC
Accès a
ux m
éta
-données
Accès a
ux m
éta
-données
�P
erm
et d
e d
écouvrir d
ynam
iquem
ent (a
u m
om
ent d
e l’e
xécutio
n) d
es p
roprié
tés
concern
ant la
base d
e d
onnées o
u le
s ré
sulta
ts d
e re
quête
s
�La m
éth
ode getMetaData()
de la
cla
sse Connection
perm
et d
'obte
nir le
s
méta
-données c
oncern
ant la
base d
e d
onnée.
�E
lle re
nvoie
un DataBaseSetMetaData.
�O
n p
eut c
onnaître
:
�le
s é
lém
ents
SQ
L s
upporté
s p
ar la
base
�la
stru
ctu
re d
es d
onnées d
e c
elle
-ci (g
etCatalog, getTables…
)
© P
hilip
pe G
EN
OU
DU
JF
35
30/0
1/2
013
�la
stru
ctu
re d
es d
onnées d
e c
elle
-ci (g
etCatalog, getTables…
)
�La m
éth
ode getMetaData()
de la
cla
sse ResultSet
perm
et d
'obte
nir le
s
méta
-données d
'un ResultSet.
�E
lle re
nvoie
un ResultSetMetaData.
�O
n p
eut c
onnaître
:
�Le n
om
bre
de c
olo
nnes : g
etColumnCount()
�Le n
om
d'u
ne c
olo
nne : g
etColumnName(int col)
�Le ty
pe d
'une c
olo
nne : g
etColumnType(int col)
�…
JDBC
JDBC
Gestio
n d
es tra
nsactio
ns
Gestio
n d
es tra
nsactio
ns
�T
ransactio
n : p
erm
et d
e n
e v
alid
er u
n e
nsem
ble
de tra
item
ents
sur u
ne B
D q
ue
si ils
se s
ont to
us e
ffectu
és c
orre
cte
ment
�E
xem
ple
: transfe
rt de fo
nd =
débite
r un c
om
pte
+ c
rédite
r un a
utre
com
pte
�L’in
terfa
ce Connection
offre
des s
erv
ices d
e g
estio
n d
es tra
nsactio
ns
�setAutoCommit(boolean autoCommit)
défin
it le m
ode d
e la
connexio
n
(auto
-com
mit p
ar d
éfa
ut)
�commit()
décle
nche v
alid
atio
n d
e la
transactio
n
rollback()
annule
la tra
nsactio
n
© P
hilip
pe G
EN
OU
DU
JF
36
30/0
1/2
013
�rollback()
annule
la tra
nsactio
n
try {
con.setAutoCommit(false);
// exécuter les instructions qui constituent la transaction
stmt.executeUpdate("UPDATE INVENTORY SET ONHAND = 10 WHERE ID = 5");
stmt.executeUpdate("INSERT INTO SHIPPING (QTY) VALUES (5)");
...
// valide la transaction
con.commit()
}catch (SQLException e) {
con.rollback();
// annule les opérations de la transaction
}
JDBC
JDBC
Gestio
n d
es tra
nsactio
ns
Gestio
n d
es tra
nsactio
ns
�int getTransactionIsolation()
(de l'in
terfa
ce Connection
) pour
savoir q
uel s
upport le
SG
BD
et le
pilo
te J
DB
C o
ffrent p
our le
s tra
nsactio
ns
�Connection.TRANSACTION_NONE
�p
as d
e s
up
po
rt
�Connection.TRANSACTION_READ_UNCOMMITTED
�"d
irty-re
ad
s" u
n ro
w m
od
ifié p
ar u
ne
tran
sa
ctio
n p
eu
t être
lu p
ar u
ne
au
tre
tran
sa
ctio
n a
va
nt q
ue
les m
od
ifica
tion
s n
'aie
nt é
té v
alid
ée
s p
ar u
n c
om
mit
�"n
on
-rep
ea
tab
le re
ad
s" u
ne
tran
sa
ctio
n lit u
n ro
w, u
ne
se
co
nd
e tra
nsa
ctio
n
mo
difie
le ro
w, la
pre
miè
re tra
nsa
ctio
n re
lit le ro
w e
t ob
tien
t de
s v
ale
urs
diffé
ren
tes
© P
hilip
pe G
EN
OU
DU
JF
37
30/0
1/2
013
diffé
ren
tes
�"p
ha
nto
m-re
ad
s" u
ne
tran
sa
ctio
n lit to
us le
s ro
w s
atis
fais
an
t un
e c
on
ditio
n
(cla
use
WH
ER
E), u
ne
se
co
nd
e tra
nsa
ctio
n in
sè
re u
n ro
w q
ui s
atis
fait c
ette
co
nd
ition
, la p
rem
ière
tran
sa
ctio
n re
lit les ro
w a
ve
c la
mê
me
co
nd
ition
et e
lle
ob
tien
t les ro
w s
up
plé
me
nta
ires in
sé
rés p
ar la
se
co
nd
e.
�Connection.TRANSACTION_READ_COMMITTED
�p
as d
e d
irty-re
ad
s
�Connection.TRANSACTION_REPEATABLE_READ,
�p
as d
e d
irty-re
ad
s e
t no
n-re
pe
ata
ble
-rea
ds
�Connection.TRANSACTION_SERIALIZABLE
�p
as d
e d
irty-re
ad
s,n
on
-rep
ea
tab
le-re
ad
s e
t ph
an
tom
-rea
ds
Niv
eau
po
ur O
racle
9i s
ur h
op
per a
vec ojdbc14
JDBC
JDBC
Gestio
n d
es tra
nsactio
ns
Gestio
n d
es tra
nsactio
ns
�A
PI J
DB
C 3
.0 a
ajo
uté
possib
ilité d
e d
éfin
ir des p
oin
ts d
e s
auvegard
e d
ans u
ne
transactio
n
Statement stmt = conn.createStatement();
conn.setAutocommit(false);
...
int rows = stmt.executeUpdate("INSERT INTO TAB1 ... ");
// set savepoint
Savepoint svpt1 = conn.setSavepoint("SAVEPOINT_1");
rows = stmt.executeUpdate("INSERT INTO TAB1 ... ");
© P
hilip
pe G
EN
OU
DU
JF
38
30/0
1/2
013
rows = stmt.executeUpdate("INSERT INTO TAB1 ... ");
...
conn.rollback(svpt1);
...
conn.commit();
conn.releaseSavePoint("SAVEPOINT_1")
Po
ur re
tirer u
n p
oin
t de s
au
veg
ard
e
SAVEPOINT_1
ne p
eu
t plu
s ê
tre u
tilisé d
an
s u
n ro
llback p
ar la
su
ite
An
nu
le to
ute
s le
s o
péra
tion
s e
ffectu
ées d
ep
uis
le
po
int d
e s
au
veg
ard
e
JDBC
JDBC
A p
ropos d
e S
QLExceptio
nA p
ropos d
e S
QLExceptio
n
�S
QLE
xceptio
n d
éfin
it les m
éth
odes s
uiv
ante
s :
�getS
QLS
tate
() : --> u
n c
ode d
’éta
t de la
norm
e S
QL A
NS
I-92
�getE
rrorC
ode() : -->
un c
ode d
’erre
ur s
pecifiq
ue («
vendor-s
pécific
»)
�getN
extE
xceptio
n() : -->
perm
et a
ux c
lasses d
u J
DB
C d
e c
haîn
er u
ne
suite
de SQLExceptions
// du code très consciencieux
try {
...
© P
hilip
pe G
EN
OU
DU
JF
39
30/0
1/2
013
...
}catch (SQLException e) {
while(e != null) {
System.out.println("SQL Exception");
System.out.println(e.getMessage());
System.out.println("ANSI-92 SQL State : "+e.getSQLState());
System.out.println("Vendor error code : "+e.getErrorCode());
e = e.getNextException();
}
}
JDBC
JDBC
SQ
LW
arn
ing
SQ
LW
arn
ing
�Les c
lasses d
u J
DB
C o
nt la
possib
ilité d
e g
énére
r sans le
s la
ncer
des e
xceptio
ns
quand u
n p
roblè
me e
st in
terv
enu m
ais
qu’il n
’est p
as s
uffis
am
ment g
rave p
our
inte
rrom
pre
le p
rogra
mm
e
�E
xem
ple
: fixer u
ne m
ode d
e tra
nsactio
n q
ui n
’est p
as s
upporté
la b
ase d
e
données c
ible
(un m
ode p
ar d
éfa
ut s
era
utilis
é)
�SQLWarning
encapsule
mêm
e in
form
atio
n q
ue SQLException
�P
our le
s ré
cupére
r pas d
e b
loc trycatch
mais
à l’a
ide d
e m
éth
ode
getWarnings
des in
terfa
ces Connection
, Statement
, ResultSet
,
PreparedSatement
, CallableStatement
© P
hilip
pe G
EN
OU
DU
JF
40
30/0
1/2
013
PreparedSatement
, CallableStatement
void printWarninsg(SQLWarning warn) {
while
(warn != null) {
System.out.println("\nSQL Warning");
System.out.println(warn.getMessage());
System.out.println("ANSI-92 SQL State : "+warn.getSQLState());
System.out.println("Vendor error code : "+warn.getErrorCode());
warn = warn.getNextException();
}
}...
ResultSet rs = stmt.executeQuery("SELECT * FROM CLIENTS");
printWarnings( stmt.getWarnings()
);
printWarnings( rs.getWarnings()
);
...
JDBC
JDBC
Api J
DBC 2
.0Api J
DBC 2
.0
�JD
BC
1.0
�package s
upplé
menta
ire (a
dd-o
n) p
our J
DK
1.0
�in
tégré
à l’A
PI d
e b
ase (c
ore
AP
I) du J
DK
1.1
�JD
BC
2.0
�spécific
atio
n p
ar S
UN
en m
ai 1
998
�e
xte
nsio
ns p
ou
r «m
eille
ure
» g
estio
n d
es ré
su
ltats
(ResultSets
«scro
llab
les
», «
mo
difia
ble
s»
)
© P
hilip
pe G
EN
OU
DU
JF
41
30/0
1/2
013
«scro
llab
les
», «
mo
difia
ble
s»
)
�m
ise
s à
jou
r gro
up
ée
s (b
atc
h u
pd
ate
s)
�su
pp
ort p
ou
r BL
OB
s (B
ina
ry L
arg
e O
bje
cts
) et C
LO
Bs (C
ha
racte
r La
rge
Ob
jects
)
�…
�in
tégré
à l
’AP
I de J
ava 2
(JD
K 1
.2)
�com
patib
ilité a
vec la
vers
ion 1
.0
�co
de
écrit p
ou
r JD
BC
1.0
co
mp
ile e
t fon
ctio
nn
e a
ve
c v
ers
ion
2.0
de
l’A
PI
JDBC
JDBC
ResultS
et J
DBC 2
.0ResultS
et J
DBC 2
.0
�P
ar d
éfa
ut lo
rsque l’o
n c
rée u
n S
tate
ment le
s o
bje
ts R
esultS
et s
ont e
n le
ctu
re
seule
(read o
nly
) et à
accès s
équentie
l (forw
ard
only
)
�A
vec J
DB
C 2
.0 p
ossib
ilité d
e c
réer d
es R
esultS
et
�« S
cro
llable
»
�plu
s d
e lim
itatio
n à
un p
arc
ours
séquentie
l
« U
pdata
ble
»
Statement stmt = conn.createStatement();
public Statement createStatement() throws SQLException
© P
hilip
pe G
EN
OU
DU
JF
42
30/0
1/2
013
�« U
pdata
ble
»
�possib
ilité d
e m
odifie
r les d
onnées d
ans la
BD
ResultSet.TYPE_FORWARD_ONLY
ResultSet.TYPE_SCROLL_INSENSITIVE
ResultSet.TYPE_SCROLL_SENSITIVE
public Statement createStatement(intresultSetType, intresultSetConcurrency)
ResultSet.CONCUR_READ_ONLY
ResultSet.CONCUR_UPDATABLE
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE ,
ResultSet.CONCUR_UPDATABLE);
On
pe
ut m
od
ifier le
s d
on
né
es
d
e la
ba
se
via
le ResultSet
le ResultSet
es
t se
ns
ible
au
x
mo
dific
atio
ns
de
s v
ale
urs
da
ns
la
ba
se
de
do
nn
ée
s
JDBC
JDBC
ResultS
et J
DBC 2
.0ResultS
et J
DBC 2
.0
�M
éth
odes d
e p
arc
ours
first()
last()
next()
previous()
beforeFirst()
Po
sitio
nn
e s
ur la
pre
miè
re lig
ne (1
er e
nre
gis
trem
en
t)
Po
sitio
nn
e s
ur la
dern
ière
lign
e (d
ern
ier e
nre
gis
trem
en
t)
Passe à
la lig
ne s
uiv
an
te
Passe à
la lig
ne p
récéd
an
te
Po
sitio
nn
e a
van
t la p
rem
ière
lign
e
© P
hilip
pe G
EN
OU
DU
JF
43
30/0
1/2
013
afterLast()
absolute(int)
relative(int)
Po
sitio
nn
e a
prè
s la
dern
ière
lign
e
Po
sitio
nn
e à
un
e lig
ne d
on
née
Dép
lacem
en
t d’u
n n
om
bre
de lig
nes d
on
né p
ar ra
pp
ort à
lign
e c
ou
ran
te
boolean isFirst()
boolean isBeforeFirst()
boolean isLast()
boolean isAfterLast()
Tru
e s
i cu
rseu
r po
sitio
nn
é s
ur la
pre
miè
re lig
ne
Tru
e s
i cu
rseu
r po
sitio
nn
é a
van
t la p
rem
ière
lign
e
Tru
e s
i cu
rseu
r po
sitio
nn
é s
ur la
dern
ière
lign
e
Tru
e s
i cu
rseu
r po
sitio
nn
é a
prè
s la
dern
ière
lign
e
�M
éth
odes d
e te
st d
e la
positio
n d
u c
urs
eur
JDBC
JDBC
ResultS
et J
DBC 2
.0ResultS
et J
DBC 2
.0
�M
odific
atio
n d
u R
esultS
et
�S
e p
lacer s
ur le
rang c
oncern
é
�M
éth
odes updateXXX(…)
�P
uis
updateRow()
�le
faire
avant d
e d
épla
cer le
curs
eur s
ur u
ne a
utre
ligne
© P
hilip
pe G
EN
OU
DU
JF
44
30/0
1/2
013
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.TYPE_CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT NOM,ID_CLIENT FROM CLIENTS);
rs.first();
rs.updateInt(2,151970);
rs.updateRow();
JDBC
JDBC
ResultS
et J
DBC 2
.0ResultS
et J
DBC 2
.0
�In
sertio
n d
’une lig
ne
�moveToInsertRow()
�M
éth
odes M
éth
odes updateXXX(…)
�P
uis
insertRow()
ResultSet rs = stmt.executeQuery("SELECT NOM,ID_CLIENT FROM CLIENTS);
rs.moveToInsertRow();
rs.updateString(1,"Jacques OUILLE");
rs.updateInt(2,151970);
rs.updateRow();
© P
hilip
pe G
EN
OU
DU
JF
45
30/0
1/2
013
�S
uppre
ssio
n d
’une lig
ne
�S
e p
lacer s
ur la
ligne
�deleteRow()
rs.updateRow();
�S
i aucune v
ale
ur n
’est s
pécifié
e p
our u
ne c
olo
nne n
’accepta
nt p
as la
vale
ur n
ul
, une SQLException
est la
ncée.
�moveToCurrentRow()
perm
et d
e s
e re
positio
nner s
ur la
ligne
coura
nte
avant l’a
ppel à
moveToInsertRow()
rs.last();
rs.deleteRow();
JDBC
JDBC
ResultS
et J
DBC 2
.0ResultS
et J
DBC 2
.0
�T
ous le
s ResultSet
ne s
ont p
as n
écessaire
ment m
odifia
ble
s
�E
n g
énéra
l la re
quête
ne d
oit ré
fére
ncer q
u’u
ne s
eule
table
sans jo
intu
re
�T
ous le
s d
rivers
JD
BC
ne s
upporte
nt p
as n
écessaire
ment e
t entiè
rem
ent le
s
ResultSet
« s
cro
llable
» e
t « u
pdata
ble
»
�l’o
bje
t DataBaseMetaData
fourn
it de l’in
form
atio
n q
uant a
u s
upport
pro
posé p
our le
s ResultSet
© P
hilip
pe G
EN
OU
DU
JF
46
30/0
1/2
013
pro
posé p
our le
s ResultSet
�Il fa
ut ê
trepru
dent s
i le lo
gic
iel q
ue l’o
n é
crit d
oit in
tera
gir a
vec u
ne
gra
nde v
arié
té d
e d
rivers
JD
BC
JDBC
JDBC
JDBC 2
.0 B
atc
h u
pdate
sJDBC 2
.0 B
atc
h u
pdate
s
�F
onctio
nnalité
s a
jouté
es l'in
terfa
ce Statement
pour p
erm
ettre
de re
gro
uper
des tra
item
ents
qui s
ero
nt e
nvoyés e
n u
ne s
eule
fois
au S
GB
��
am
élio
ratio
n d
es p
erfo
rmances s
i nom
bre
de tra
item
ents
importa
nt
�P
as o
blig
ato
irem
ent s
upporté
es p
ar le
pilo
te
�m
éth
ode supportsBatchUpdates()
de DatabaseMetaData
void addBatch(String)
Ajo
ute
r au "lo
t" une c
haîn
e c
onte
nant u
ne re
quête
SQ
L.
Requête
de ty
pe INSERT
, UPDATE
, DELETE
ou D
DL (C
REATETABLE
, DROP TABLE
)
© P
hilip
pe G
EN
OU
DU
JF
47
30/0
1/2
013
ou D
DL (C
REATETABLE
, DROP TABLE
)
int[] executeBatch()
Exécute
toute
s le
s re
quête
s d
u lo
t. R
envoie
un ta
ble
au d
'entie
rs q
ui p
our c
haque re
quête
contie
nt s
oit :
•le
nom
bre
de m
ises à
jour e
ffectu
ées (e
ntie
r >=
0)
•SUCCESS_NO_INFO
si la
com
mande a
été
exécuté
e m
ais
on n
e
connaît p
as le
nom
re d
e ra
ng a
ffecté
s•EXECUTE_FAILED
si la
com
mande a
échoué
void clearBatch()
Supprim
e to
ute
s le
s re
quête
s s
tockées
En c
as d
'echec s
ur l'u
ne d
es re
quête
s u
ne BatchUpdateException
est la
ncée. S
elo
n le
s p
ilote
s le
s
requête
s q
ui s
uiv
ent d
ans le
lot p
euvent ê
tre o
u n
e p
as ê
tre e
xécuté
es.
JDBC
JDBC
JDBC 2
.0 B
atc
h u
pdate
sJDBC 2
.0 B
atc
h u
pdate
s
�E
xem
ple
s (T
he
JD
BC
Tu
toria
l: Ch
ap
ter 3
-A
dva
nce
d T
uto
rial -
Ma
yd
en
e F
ish
er
http
://java
.su
n.c
om
/de
ve
lop
er/B
oo
ks/J
DB
CT
uto
rial/in
de
x.h
tml)
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Amaretto', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Hazelnut', 49, 9.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Amaretto_decaf', 49,
con.setAutoCommit(false);
PreparedStatement pstmt = con.prepareStatement(
"INSERT INTO COFFEES VALUES(
Ba
tch
up
da
te s
tatiq
ue
Ba
tch
up
da
te p
ara
mé
tré
© P
hilip
pe G
EN
OU
DU
JF
48
30/0
1/2
013
"VALUES('Amaretto_decaf', 49,
10.99, 0, 0)");
stmt.addBatch("INSERT INTO COFFEES " +
"VALUES('Hazelnut_decaf', 49,
10.99, 0, 0)");
int [] updateCounts = stmt.executeBatch();
con.commit();
con.setAutoCommit(true);
"INSERT INTO COFFEES VALUES(
?, ?, ?, ?, ?)");
pstmt.setString(1, "Amaretto");
pstmt.setInt(2, 49);
pstmt.setFloat(3, 9.99);
pstmt.setInt(4, 0);
pstmt.setInt(5, 0);
pstmt.addBatch();
pstmt.setString(1, "Hazelnut");
pstmt.setInt(2, 49);
pstmt.setFloat(3, 9.99);
pstmt.setInt(4, 0);
pstmt.setInt(5, 0);
pstmt.addBatch();
// ... and so on for each new type of coffee
int [] updateCounts = pstmt.executeBatch();
con.commit();
JDBC
JDBC
javax.s
ql
javax.s
ql
�javax.sql
package d
’exte
nsio
n s
tandard
de J
DB
C
�P
our le
s a
pplic
atio
ns J
EE
(Java E
ntre
pris
e E
ditio
n)
�In
clu
s e
n s
tandard
dans J
SE
(Java S
tandard
Editio
n) d
epuis
vers
ion 1
.4
�DataSource
: Obte
ntio
n d
u n
om
de la
base à
partir d
e s
erv
eurs
de n
om
s
plu
tôt q
ue d
’avoir le
nom
de la
base d
e d
onnées c
odé «
en d
ur »
dans
l’applic
atio
n.
Utilis
atio
n d
e J
ND
I (Java N
am
ing a
nd D
irecto
ry In
terfa
ce) p
our c
onnexio
n
© P
hilip
pe G
EN
OU
DU
JF
49
30/0
1/2
013
�U
tilisatio
n d
e J
ND
I (Java N
am
ing a
nd D
irecto
ry In
terfa
ce) p
our c
onnexio
n
à u
ne b
ase d
e d
onnée
�PooledConnection
: support p
our g
estio
n d
’un «
pool »
de c
onnexio
n
�gestio
n d
’un c
ache d
es c
onnexio
n o
uverte
s
�évite
la c
réatio
n d
e n
ouvelle
s c
onnexio
ns (c
e q
ui e
st c
oûte
ux)
�RowSet
: perm
et d
e tra
iter le
s ré
sulta
ts d
es re
quête
s c
om
me d
es
com
posants
JavaB
eans
�S
upport p
our le
s tra
nsactio
ns d
istrib
uées
JDBC
JDBC
javax.s
ql.D
ata
Sourc
eja
vax.s
ql.D
ata
Sourc
e
�L'o
bje
t DataSource
avec p
oolin
g d
e c
onnexio
ns m
ain
tient u
n e
nsem
ble
de
connexio
ns à
la B
D p
rête
s à
l'em
plo
i(p
oo
l ou
cach
e d
e c
on
nexio
ns).
Data
So
urc
e
Connection
En
fait P
ooledConnection
© P
hilip
pe G
EN
OU
DU
JF
50
30/0
1/2
013
En
fait P
ooledConnection
�Q
uand u
n c
ode a
besoin
d'a
ccéder à
la b
ase d
e d
onnées, il o
btie
nt u
ne
connexio
n e
n s
'adre
ssant à
la DataSource
DataSource ds;
...
Connection c = ds.getConnnection();
...
JDBC
JDBC
javax.s
ql.D
ata
Sourc
eja
vax.s
ql.D
ata
Sourc
e
�L'o
bje
t DataSource
avec p
oolin
g d
e c
onnexio
ns m
ain
tient u
n e
nsem
ble
de
connexio
ns à
la B
D p
rête
s à
l'em
plo
i(p
oo
l ou
cach
e d
e c
on
nexio
ns).
Data
So
urc
e
Connection
En
fait P
ooledConnection
© P
hilip
pe G
EN
OU
DU
JF
51
30/0
1/2
013
En
fait P
ooledConnection
�Q
uand u
n c
ode a
besoin
d'a
ccéder à
la b
ase d
e d
onnées, il o
btie
nt u
ne
connexio
n e
n s
'adre
ssant à
la DataSource.
DataSource ds;
...
Connection c = ds.getConnnection();
...
c = c.close();
�Il c
onserv
e la
connexio
n ju
squ'à
sa fe
rmetu
re e
xplic
ite.
JDBC
JDBC
javax.s
ql.D
ata
Sourc
eja
vax.s
ql.D
ata
Sourc
e
�L'o
bje
t DataSource
avec p
oolin
g d
e c
onnexio
ns m
ain
tient u
n e
nsem
ble
de
connexio
ns à
la B
D p
rête
s à
l'em
plo
i(p
oo
l ou
cach
e d
e c
on
nexio
ns).
Data
So
urc
e
Connection
En
fait P
ooledConnection
© P
hilip
pe G
EN
OU
DU
JF
52
30/0
1/2
013
En
fait P
ooledConnection
�Q
uand u
n c
ode a
besoin
d'a
ccéder à
la b
ase d
e d
onnées, il o
btie
nt u
ne
connexio
n e
n s
'adre
ssant à
la DataSource.
DataSource ds;
...
Connection c = ds.getConnnection();
...
c = c.close();
�Il c
onserv
e la
connexio
n ju
squ'à
sa fe
rmetu
re e
xplic
ite.
�Lors
qu'u
ne c
onnexio
n e
st "fe
rmée", e
lle e
st e
n fa
it relâ
chée e
t rem
ise d
ans le
pool.
JDBC
JDBC
�JD
BC
AP
I de b
as n
iveau
�P
arfo
is d
ifficile
à p
endre
en m
ain
�D
em
ande d
es c
onnais
sances "p
oin
tues" e
n B
D
�D
épendances p
ar ra
pport a
u S
GB
D c
ible
�N
om
bre
uses A
PI c
onstru
ites a
u d
essus d
e J
DB
C
�Jakarta
Com
mons D
bU
tils(s
implifie
utilis
atio
n d
e J
DB
C)
http
://jakarta
.ap
ach
e.o
rg/c
om
mo
ns/d
bu
tils/
© P
hilip
pe G
EN
OU
DU
JF
53
30/0
1/2
013
http
://jakarta
.ap
ach
e.o
rg/c
om
mo
ns/d
bu
tils/
�F
am
ew
ork
sde p
ers
ista
nce o
u d
e m
appin
gO
/R
�Ib
atis
, http
://ibatis
.ap
ach
e.o
rg/
�H
ibern
ate
, http
://ww
w.h
ibern
ate
.org
�JP
A –
Java P
ers
iste
nce
AP
IE, J
EE
5
–m
od
èle
de
pe
rsis
tan
ce
EJB
(En
trep
rise
Ja
va
Be
an
s) 3
.0 is
su
d'H
ibe
rna
te
�JD
O –
Java D
ata
Obje
cts