You are on page 1of 39

Programowanie w Sieci

Internet
dr Piotr Kalita
kalita@ii.uj.edu.pl
semestr zimowy 2012/1
!yk"ad 2
#iteratura
$utoriale %&'( ze stron )racle*
+ttp*//docs.oracle.com/ja,ase/tutorial/jd-c/o,
er,iew/inde..+tml
Redistribution of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistribution in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of Sun Microsystems, Inc. or the names of contributors may be used to endorse or promote products derived from this software without specific
prior written permission.

his software is provided !"S IS,! without a warranty of any #ind. "$$ %&'R%SS (R IM'$I%) *(N)II(NS, R%'R%S%N"I(NS "N) +"RR"NI%S,
IN*$,)IN- "N. IM'$I%) +"RR"N. (/ M%R*0"N"1I$I., /IN%SS /(R " '"RI*,$"R ',R'(S% (R N(N2IN/RIN-%M%N, "R%
0%R%1. %&*$,)%). S,N MI*R(S.S%MS, IN*. 3!S,N!4 "N) IS $I*%NS(RS S0"$$ N( 1% $I"1$% /(R "N. )"M"-%S S,//%R%) 1.
$I*%NS%% "S " R%S,$ (/ ,SIN-, M()I/.IN- (R )ISRI1,IN- 0IS S(/+"R% (R IS )%RI5"I5%S. IN N( %5%N +I$$ S,N (R IS
$I*%NS(RS 1% $I"1$% /(R "N. $(S R%5%N,%, 'R(/I (R )"", (R /(R )IR%*, IN)IR%*, S'%*I"$, *(NS%6,%NI"$, IN*I)%N"$
(R ',NII5% )"M"-%S, 0(+%5%R *",S%) "N) R%-"R)$%SS (/ 0% 0%(R. (/ $I"1I$I., "RISIN- (, (/ 0% ,S% (/ (R
IN"1I$I. ( ,S% 0IS S(/+"R%, %5%N I/ S,N 0"S 1%%N ")5IS%) (/ 0% '(SSI1I$I. (/ S,*0 )"M"-%S.
/a+moud Parsian0 %&'( 1ecipes0 2 Pro-lem3
Solution 2pproac+0 2press 2004 5ksi67ka dotyczy
%&'( 0 o-ecnie mamy %&'( 8.1 wydane w %S9 : w
roku 2011;

%a,a a -azy danyc+
2plikacja %a,a
Serwer z
-az6 danyc+
%&'( < sterowniki
poc+odz6ce
od producenta
5)pcjonalnie;
warstwa
po=rednicz6ca
5)1/;
%akie=
protoko"y
komunikacyjne
S>#
S># 5automatycznie
generowany;
S>#opodo-ne j?zyki o-iektowe 5@>#0
9%'>#; lu- 5ostatnio; 2PI takie jak (riteria

%&'( A %a,a &ata'ase
(onnecti,ity
'i-lioteki s6 cz?=ci6 zestawu %S9.
SpecyBikacje*
+ttp*//www.jcp.org/en/jsr/detailCidD48 %S148
+ttp*//www.jcp.org/en/jsr/detailCidD221 %S1221
+ttp*//onja,a.com/pu-/a/onja,a/200E/0F/02/
jjd-c383en+ancements3in3ja,a3se3E.+tmlCpageD1
+ttp*//docs.oracle.com/ja,ase/:/docs/tec+notes/guides/jd-c/jd-cG81.+tml
2011 %&'( 8.1 %S1 221 %S9:

%&'( A sc+emat dzia"ania

%&'( A sterownik
2-y mHc po"6czyI si? z -az6 danyc+
%&'( wymaga dostarczenia przez
producenta -azy sterownika A zestawu
klas zapewniaj6cyc+ implementacje
zdeBiniowanyc+ w standardzie
interBejsHw.
Standard %&'( deBiniuje 8 typy takic+
sterownikHw.
$yp 1* %&'( A
)&'( -ridge
$yp 2*
wywo"ania
natywne
sterownika

%&'( A typy i 8
$yp $yp 8
$yp A sterownik dla %a,y
implementuje 2PI u7ywane
przez serwer -azy danyc+.
$yp 8 A sterownik
implementuje 2PI u7ywane
przez dodatkow6
5odpowiedni6J; aplikacje
middleware0 ktHra po=redniczy
pomi?dzy nasz6 aplikacj6 a
-az6 danyc+.

Podej=cia 102008 3 dyskusja
7a 'r8eciw
9 Nie wymaga sterowni#a od
producenta ba8y.
+olne 3dodat#owa warstwa4 i wymaga
oprogramowania po stronie #lienta. Nie
wspierane. -:;wnie pod +indows. Nie
mo<na #or8ysta= wielow>t#owo.
? @od natywny 8optymali8owany
3s8ybs8e4
+ymagana dodat#owa bibliote#a nie w
Aavie po stronie #lienta 3np dll pod
+indows4.
B +arstwa i8olacCi, 9DDE Aava +ymagane oprogramowanie middleware,
dodat#owa warstwa
F 9DDE Aava, nie wymaga
<adnego dodat#owego
oprogramowania

!czytanie sterownika
Klasa &ri,er/anager zajmuje si? zarz6dzaniem sterownikami. 2-y "6czyI si? z
-az6 trze-a w niej zarejestrowaI nasz sterownik*
SposH- 1*
DriverManager.registerDriver(Driver driverName);
SposH- 2*
Class.forName(String driverName).newInstance();
lu-
Class.forName(String driverName);
5klasa sterownika ma z regu"y statyczny kod inicjalizuj6cy rejestruj6cy
sterownik w &ri,er/anagerze;
SposH- *
D:>java Djdc.drivers!com.m"s#l.jdc.Driver M"$D%C&rog
I inne ... 5np. System.properties5;0 stworzenie instancji &ri,era ....;
Przyk"ady
1 i 2

!czytanie sterownika c.d.
Kwaga* cz?st6 praktyk6 jest przeniesienie zarz6dzania &ataSource na
middleware0 z ktHrym mo7na po"6czyI si? przez %L&I 5np. z serwerem
aplikacji %990 serwerem !!!;.
Sterownik /yS># dla %a,y A (onnector/%.
Inne cz?sto wykorzystywane i darmowo dost?pne -azy
5S>#ite 3 lokalnie w pliku0 polecam wtyczk? do MireBo.0
MireBo. wykorzystuje do pami?tania ciasteczek0 +istorii etc0
do-ra do testHw0 2pac+e &er-y A w pakiecie %990
PostgreS># ...;.

&ata Source
!ykorzystanie &ataSource i korzystanie z pul
zarz6dzanyc+ przez serwer jest rekomendowane w
aplikacjac+ we-owyc+.
&ataSource typowo reprezentuje pul? po"6czeN do zastosowania w
aplikacjac+ wielow6tkowyc+. $ypowo serwer zarz6dza pul6. %e=li
tworzymy aplikacj? OstandaloneP to musimy sami zaimplementowaI
pul? lu- skorzystaI z dodatkowej -i-lioteki do pul.

(#2SSP2$@
! sposo-ie 1 sterownik musi -yI znany w trakcie kompilacji 5i wykonania pHQniej
te7J;. ! sposo-ac+ 2 i 5odwo"uj6cyc+ si? do reBleksji; sterownik musi -yI znany
tylko w trakcie wykonania. 2-y -y"o to mo7liwe musi -yI widoczny w (#2SSP2$@
5inaczej A stosowny wyj6tek;. Kwaga* %&'( 8 ma mec+anizm automatycznego
wczytywania sterownikHw0 nie trze-a ro-iI (lass.BorLame0 (#2SSP2$@ jest
przeszukiwany automatycznie.
(#2SSP2$@ mo7na ustawiI na sta"e lu- podaI przy startowaniu maszyny
wirtualnej 5java 'c(;.
2 gdy tworzymy paczk? jarCC
! paczce jar w Bolderze /9$23ILM znajduje si? plik /2LIM9S$./M. ! nim
powinien 5mi?dzy innymi; znaleQI si? wpis*
Class'&at): li*m"s#l'connector'java'+.,.-'in.jar li*org'
neteans'mod.les'java'j/se(roject'co("listas0.jar jes1c1e
ja0ie2 jar"...
&la klas z jara -?d6 uwzgl?dnione dodatkowe jary od ktHryc+ wyst?puje zale7no=I.
!i?cej na ten temat* przy okazji /2R9L2 i zarz6dzaniu zale7no=ciami w
aplikacjac+ we-owyc+.

&ri,er/anager
'adamy0 jakie sterowniki s6 za"adowane.
$worzymy po"6czenie za pomoc6 statycznej metody
Ba-rykuj6cej.

&ost?pne sterowniki
+ttp*//de,app.sun.com/product/jd-c/dri,ers

&ost?pne sterowniki c.d.
Kwagi*
&la /yS># A sterownik typu 80 wspiera %&'( .. 5na
stronie (onnector/% podane jest 7e wspierane jest
%&'( 8;0 wspiera pule po"6czeN i umo7liwia "6czenie
si? z -az6 przez &ataSource. Lie wspiera natomiast
rozproszonyc+ tranzakcji i 1owSets.

%&'( a wspH"-ie7no=I
Klasa &ri,er/anager typowo mo7e -yI -ezpiecznie u7ywana
w =rodowisku wielow6tkowym. Latomiast (onnection typowo
ju7 nie 5c+oI zale7y to od implementacji0 (onnection to tylko
interBejs;.
! przypadku u7ycia &ataSource tak7e nie ma gwarancji
-ezpieczeNstwa 5znHw zale7y to od konkretnego sterownika;.
!a7ne0 a-y w =rodowisku wielow6tkowym u7ywaI pul
po"6czeN. $ypowo pule po"6czeN konBigurujemy na poziomie
serwera0 na ktHrym znajduje si? aplikacja. SposH- konBiguracji
puli po"6czeN jest specyBiczny dla serwera 5wrHcimy do tego
przy %ettym;.

!"a=ciwo=ci po"6czenia
Lazwy properties i sposH- konstrukcji
K1#a zale76 od rodzaju -azy 5tu /yS>#;.

K1#e

!"asna implementacja puli
po"6czeN I

!"asna implementacja puli
po"6czeN II
&odatkowo w
przyk"adzie mamy
w6tek S1eaperT0
ktHry sprawdza0 czy
po"6czenia s6
aktywne i usuwa je
z puli je=li nie s6.

'i-lioteki do pul po"6czeN
+ttp*//jol-o..com/
+ttp*//commons.apac+e.org/d-cp/
+ttp*//sourceBorge.net/projects/cp0/

(onnection 3 wykorzystanie
Przyk"adowy wzorzec u7ycia (onnection*
Connection connection ! n.ll;
tr" 3
connection ! ** ... stwor1enie connection
** l. (oranie 1 (.li 1ale1nie od im(l.
** .... 4"0onanie o(eracji a1odanowej
5 catc)(S6789ce(tion e)3
**osl.a w"jat0.
5 finally 3
tr"3
if(connecton:!n.ll ;; :connection.isClosed())
connection.close();**1am"0am" l. 1wracam" do (.li
**1ale<nie od im(lementacji
5 catc) (S6789ce(tion e) 3
**w)at can we do )ere==
5
5
!a7ne0 7e-y zro-iI close0 zale7nie od implementacji
po"6czenie -?dzie zamkni?te lu- zwrHcone do puli.

(onnection
3U Statement
3U Vapytanie S>#
&o-r6 praktyk6 jest krHtkie 5np.
w jednej metodzie; korzystanie
z (onnection0 Statement i
1esultSet
Stworzenie
o-iektu
Statement

Vamykanie (onnection0
Statement i 1esultSet
)czywi=cie mo7na
stworzyI analogiczn6
metod? rzucaj6c6
wyj6tek S>#9.ception

Konstrukcja try3wit+3resources
!prowadzona w %a,ie : 5%&'( 8.1;
close ro-ione jest automatycznie

2utocommit
&omy=lnie o-iekt (onnection jest w try-ie 2utocommit
C>8?@8 @?%78 email
(
ID IN@ NA@ NB77 ?B@ACINC>8M8N@D
email E?>CF?>(G+) NA@ NB77D
&>IM?>H I8H (ID)
)
8NJIN8!InnoD%;
&la /yS># 5c+oI to
zale7y od wersji; wa7ne0
a-y stworzyI ta-ele
typu Inno&'
wspieraj6ce tranzakcje
5domy=lnie /yIS2/ nie
wspiera tranzakcji;

$worzenie ta-eli0 K$M3F
Konwencja zapytaN s"owa kluczowe S># A wielkie litery0
nazwy kolumn0 ma"e litery. Korzystanie z K$M3F A
zale7ne od -azy.

2PI dla interBejsu Statement
,oid executeUpdate5String sWl; t+rows S>#9.ception
1esultSet executeQuery5String sWl; t+rows S>#9.ception
,oid close5; t+rows S>#9.ception
(onnection getConnection5; t+rows S>#9.ception
-oolean isClosed5; t+rows S>#9.ception

1esultSet
!ykonanie metody e.ecute>uery skutkuje stworzeniem i
zwrHceniem o-iektu 1esultSet. Lale7y pami?taI0 7e
1esultSet jest wewn?trznie powi6zany z (onnection i
Statement. Lajlepiej korzystaI z niego tak krHtko jak si? da
5np. przero-iI go na kolekcje o-iektHw;.
/etody przewijaj6ce kursor po 1esultSecie*
-oolean next5; t+rows S>#9.ception
-oolean first5; t+rows S>#9.ception
-oolean last5; t+rows S>#9.ception
,oid beforeFirst5; t+rows S>#9.ception
,oid afterLast5; t+rows S>#9.ception
int getRow5; t+rows S>#9.ception
-oolean absolute5introw; t+rows S>#9.ception
-oolean relative5introws; t+rows S>#9.ception
-oolean previous5; t+rows S>#9.ception

Scrolla-le 1esultSet
Vac+owanie domy=lne A -rak mo7liwo=ci
przewijania

$ypy /yS># a %a,a
+ttp*//de,.mysWl.com/doc/reBman/4.E/
en/connector3j3reBerence3type3con,ersions.+tml
Pe"na dokumentacja*

$ypy /yS># i %a,a A get)-ject5;

2PI 3 1esultSet
int getInt5Stringcolumn#a-el; t+rows S>#9.ception
long getLong5Stringcolumn#a-el; t+rows S>#9.ception
dou-le getDouble5Stringcolumn#a-el; t+rows S>#9.ception
$ime getTime5Stringcolumn#a-el; t+rows S>#9.ception
InputStream getBinarytream5Stringcolumn#a-el; t+rows S>#9.ception
'lo- getBlob5String column#a-el; t+rows S>#9.ception
i inne ...
2nalogiczne wersje z indeksem kolumny jako
argumentem. InputStream reprezentuje pole jako
strumieN -ajtHw 5do odczytu;. '#)' to kontener dla
sekwencji -ajtHw.

InterBejs PreparedStatement

1esultSet/eta&ata
/etoda get/eta&ata dla typu 1esultSet zwraca typ
1esultSet/eta&ata0 ktHry mo7e pos"u7yI do po-rania
metadanyc+ dotycz6cyc+ tego0 co zwraca S9#9($.
String getColumn!ame5intcolumn; t+rows S>#9.ception
String getTable!ame5intcolumn; t+rows S>#9.ception
String getColumnType!ame5intcolumn; t+rows S>#9.ception
int getColumnType5intcolumn; t+rows S>#9.ception
&ata-ase/eta&ata d-md D con.get/eta&ata5;Y
/etoda get/eta&ata dla typu (onnection zwraca typ
&ata-ase/eta&ata pozwalaj6cy mieI dost?p do
metadanyc+ dla -azy 5np. jakie s6 ta-ele;

&2)
&ata 2ccess )-ject A
przydatny wzorzec
projektowy0 jest to
Basada dla do=I
skomplikowanego 2PI
jakim jest %&'(.
$ypowo tworzy si? po
klasie &2) dla ka7dej z
ta-el.

/etoda &2) 3 I

/etoda &2) 3 II
#epsze* zapytania
z parametrami.

&2) 3 wykorzystanie

You might also like