background image

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63

e-mail: helion@helion.pl

PRZYK£ADOWY ROZDZIA£

PRZYK£ADOWY ROZDZIA£

IDZ DO

IDZ DO

ZAMÓW DRUKOWANY KATALOG

ZAMÓW DRUKOWANY KATALOG

KATALOG KSI¥¯EK

KATALOG KSI¥¯EK

TWÓJ KOSZYK

TWÓJ KOSZYK

CENNIK I INFORMACJE

CENNIK I INFORMACJE

ZAMÓW INFORMACJE

O NOWOCIACH

ZAMÓW INFORMACJE

O NOWOCIACH

ZAMÓW CENNIK

ZAMÓW CENNIK

CZYTELNIA

CZYTELNIA

FRAGMENTY KSI¥¯EK ONLINE

FRAGMENTY KSI¥¯EK ONLINE

SPIS TRECI

SPIS TRECI

DODAJ DO KOSZYKA

DODAJ DO KOSZYKA

KATALOG ONLINE

KATALOG ONLINE

JDBC. Leksykon
kieszonkowy

Autor: Donald Bales
T³umaczenie: Jaros³aw Gierlicki
ISBN: 83-7361-165-7
Tytu³ orygina³u: 

JDBC Pocket Reference

Format: B5, stron: 196

Podrêczny przewodnik dla programistów Javy

JDBC jest jednym z najwszechstronniejszych i najszerzej stosowanych mechanizmów 
umo¿liwiaj¹cych nie tylko dostêp do danych z programów napisanych w Javie, 
ale równie¿ wykonywanie rozmaitych operacji na bazach danych. Kosztem 
wszechstronnoci jest z³o¿onoæ — JDBC implementuje ogromn¹ liczbê klas, interfejsów 
i metod, z którymi trzeba siê gruntownie zapoznaæ. Niemo¿liwoci¹ jest zapamiêtanie 
ich wszystkich.

„JDBC. Leksykon kieszonkowy” jest podrêcznym leksykonem u³atwiaj¹cym szybkie 
odnalezienie opisu ka¿dej z klas, interfejsów czy metod tworz¹cych JDBC API.
Przydaje siê zw³aszcza w sytuacjach, w których wiadomo, co siê chce osi¹gn¹æ 
i potrzebna jest informacja na temat metod JDBC, które mog¹ w tym pomóc.

Oprócz opisu API ksi¹¿ka zawiera tak¿e kilka krótkich rozdzia³ów bêd¹cych swego 
rodzaju instrukcj¹ obs³ugi JDBC, czyli przypomnieniem, w jaki sposób ³¹czyæ ze sob¹ 
ró¿ne elementy API w celu uzyskania rozwi¹zañ konkretnych zadañ. 

Nie pamiêtasz, jak naraz wykonaæ kilka operacji wstawiania lub modyfikacji lub w jaki 
sposób przechowywaæ i pobieraæ wielkie obiekty? Niniejsza ksi¹¿ka na pewno odwie¿y 
Twoj¹ pamiêæ.

Donald Bales jest konsultantem do spraw aplikacji komputerowych specjalizuj¹cym siê 
w analizie, projektowaniu oraz programowaniu systemów rozproszonych. Posiada 
ponad piêcioletnie dowiadczenie w pisaniu aplikacji w Javie operuj¹cych na bazach 
danych za pomoc¹ JDBC.

background image

Spis treści

Wprowadzenie......................................................................... 5

Konstrukcje importowania ................................................... 8

Sterowniki JDBC..................................................................... 9

Typy sterowników......................................................................................9
Adresy URL baz danych ..........................................................................10

Ustanawianie połączenia.................................................... 17

Używanie menedżera sterowników.......................................................17
Używanie JNDI..........................................................................................19

Pzeglądanie metadanych bazy danych............................. 20

Dynamiczne wykonywanie polceń SQL........................... 21

Wykonywanie konstrukcji DDL .............................................................21
Wykonywanie konstrukcji INSERT, UPDATE oraz DELETE ...........22
Wykonywanie konstrukcji SELECT.......................................................23

Wykonywanie prekompilowanych poleceń SQL............ 25

Wykonywanie procedur osadzonych................................. 27

Otrzymywanie wyników zapytań..................................... 29

Przeglądanie zbioru wynikowego .........................................................31
Pobieranie wartości z kolumn ................................................................32
Wstawianie, modyfikowanie i usuwanie wierszy
za pomocą zbioru wynikowego .............................................................33
Dynamiczne określanie charakterystyki zbioru wynikowego ..........35

Mapowanie typów danych SQL i Javy............................ 38

background image

Obsługa wartości NULL ..................................................... 38

Wykrywanie wartości NULL za pomocą metody wasNull().............40
Wykrywanie wartości NULL za pomocą obiektu BigDecimal..........41
Ustawianie wartości w kolumnie jako NULL......................................42

Wstawianie i modyfikowanie grupowe ........................... 42

Praca z wielkimi obiektami ............................................... 44

Wstawienie obiektu BLOB ......................................................................45
Pobranie obiektu BLOB ...........................................................................46

Typy danych definiowane przez użytkownika............... 47

Tworzenie klas Javy dla typów UDT.....................................................48
Aktualizowanie mapy typów .................................................................50
Wstawianie typów UDT...........................................................................51
Pobieranie typów UDT.............................................................................52

Zestawy wierszy................................................................... 53

Składnia wyrażeń przenośnych.......................................... 54

Zarządzanie transakcjami .................................................. 57

JDBC API ............................................................................... 57

background image

Dynamiczne wykonywanie poleceń SQL

21

Dynamiczne wykonywanie
poleceń SQL

Za pomocą obiektu 

 można  dynamicznie  wykonać  kon-

strukcje DDL SQL lub DML SQL. Obiekt 

 otzymujemy na

podstawie obiektu połączenia, wywołując jego metodę 

 w następujący sposób:

Obiekt 

 posiada trzy metody służące do wykonywania

SQL-a: 

  oraz 

.  Wybór

odpowiedniej metody zależy od typu konstrukcji SQL, która ma
zostać wykonana.

Wykonywanie konstrukcji DDL

Metoda 

 jest najodpowiedniejsza dla poleceń  DDL  czy

całkowicie dynamicznych poleceń SQL. Zwraca ona wartość 

,

jeżeli wykonanie konstrukcji SQL spowodowało wygenerowanie
zbioru wynikowego. Zbiór wynikowy można otrzymać wywołując
dla obiektu konstrukcji metodę 

 !

. Jeżeli metoda 

 zwróci wartość 

"

, można za pomocą metody 

 

#

 obiektu 

 określić  liczbę  wierszy  objętych  dzia-

łaniem konstrukcji DML. Jeśli natomiast w trakcie  wykonywania
polecenia DDL wystąpi błąd, zostanie zgłoszony wyjątek 

. Oto przykład, w którym zostaje utworzona tabela o  nazwie

$!%&

 (przy założeniu, że połączenie — 

 — istnieje):

background image

22

JDBC. Leksykon kieszonkowy

 !"!#

$%&'#

($%&'#

%#

 $%)

"

"'

Wykonywanie konstrukcji INSERT,
UPDATE oraz DELETE

Metoda 

 nadaje się do wykonywania  konstrukcji

DML  innych  niż  konstrukcja  SELECT  i  zwraca  liczbę  wierszy
objętych działaniem danej konstrukcji SQL. Poniżej przedstawiono
przykład, w którym do tabeli 

$!%&

 utworzonej w poprzednim

przykładzie zostaje wstawiony nowy wiersz (przy założeniu, że
połączenie — 

 — istnieje):

()

*+

#

background image

Dynamiczne wykonywanie poleceń SQL

23

#

(#

%#

 

$

)#

,-,#

,./,#

0,)12'3')3'),4#

,5,

"('*

+,-.(//01+2

+((+2(2++

"

"'

Wykonywanie konstrukcji SELECT

Metoda 

 zwraca obiekt 

!

, co świetnie nadaje

się do wykonywania  konstrukcji  SQL  SELECT.  Poniżej  przedsta-
wiono  przykład  zapytania  wykonanego  dla  tabeli 

$!%&

  (przy

założeniu, że połączenie — 

 — istnieje):

!

()

6!

background image

24

JDBC. Leksykon kieszonkowy

#

#

(#

%#

 

(

*%)

(

(22

%3 4*

5  6

"5  7

 89

   :

%32+;+2

52+;+2

"52+;+2

2+;+2

 

"

"'

"'

Warto zwrócić uwagę, że w trzech ostatnich przykładach obiekt

 był zawsze zamykany.  Zamykanie  obiektu 

background image

Wykonywanie prekompilowanych poleceń SQL

25

zaraz po tym, gdy przestaje on być potrzebny, zmniejsza zużycie
zasobów zarówno w programie klienta, jak i w bazie danych.

Wykonywanie
prekompilowanych poleceń SQL

Wykonywanie konstrukcji SQL przy użyciu  obiektów 

$

 może być bardziej efektywne (z punktu widzenia pro-

gramu  klienta oraz bazy danych)  oraz  łatwiejsze  w  programowa-
niu. Obiekt 

$

 można otrzymać z obiektu 

#

,

wywołując w następujący sposób jego metodę 

:

$

#

#

(#

%#

 

$

7#

7#

7#

7#

7

Gotowa konstrukcja  jest  bardziej efektywna,  jeżeli  można  przygo-
tować ją raz, a potem wykorzystywać wiele razy. A  łatwiejsza
w programowaniu jest dlatego, że w trakcie tworzenia konstrukcji
SQL  uwalnia  od  obowiązku  tworzenia  złożonych  konkatenacji

background image

26

JDBC. Leksykon kieszonkowy

(sklejeń) łańcuchów znaków oraz od konieczności używania odpo-
wiednich  metod  formatujących  daty.  Zamiast  tego  można  jako
oznaczenia miejsc występowania  parametrów  użyć  znaków zapy-
tania (

<

), a następnie przed wykonaniem konstrukcji SQL wartości

tych parametrów ustalić programowo.

Ponieważ klasa 

$

  jest  rozszerzeniem  klasy 

, posiada jej wszystkie trzy metody uruchomieniowe. Oprócz

tego posiada także zestaw metod  typu 

===

,  które  służą  do

umieszczania w konstrukcji przed jej wykonaniem konkretnych
wartości w miejscach oznaczonych znakami zapytania — sposób
ich stosowania przedstawiono w  poniższym  przykładzie.  Zało-
żono, że istnieją utworzone w poprzednim przykładzie  obiekty
połączenia — 

 oraz obiekty gotowej konstrukcji — 

.

8)#9

 9#-

 &#./

-:#;$<-$()12'3')3')

 =#>

*+

"('*

+,-.( (0//01+2

+((+2(2++

Do znaczników parametrów (

<

) występujących w konstrukcji  SQL

metody odwołują się począwszy od numeru 1, a potem kolejno
od lewej do prawej. Tak więc w powyższym przykładzie polu 

5

 zajmującemu pierwszą pozycję zostaje przypisana wartość

background image

Wykonywanie procedur osadzonych

27

liczbowa 2 (typu 

), polu 

5

,  zajmującemu pozycję  drugą,

zostaje przypisana wartość łańcucha znaków 

+8%+

 itd. Po ustaleniu

wartości wszystkich parametrów konstrukcja zostaje uruchomiona
poprzez wywołanie  metody 

 obiektu 

$

.  Ponieważ  treść  konstrukcji  SQL  została  przygotowana

wcześniej, nie jest ona przekazywana jako parametr do  żadnej
z metod uruchomieniowych obiektu 

$

.

Wykonywanie
procedur osadzonych

Jeżeli pobranie lub zachowanie pewnej jednostkowej ilości danych
w programie wymaga wykonania  wielu konstrukcji  SQL, wyko-
rzystanie procedury osadzonej jest bardziej efektywne niż kolejne
uruchamianie  przez klienta  wszystkich  koniecznych  konstrukcji.
Do uruchomienia procedury osadzonej można  użyć  obiektu 

#

3

. Uzyskuje się go z  obiektu 

#

,  wywołując

w następujący sposób metodę 

#

:

#3

?

077#74

Szczegóły  dotyczące  składni  wywoływania  procedur  osadzo-
nych opisano w rozdziale „Składnia wyrażeń przenośnych”. Klasa

#3

 jest  rozszerzeniem  klasy 

$

,  stąd

w  identyczny  sposób  ustala  się  dla  niej  miejsca  występowania
parametrów  —  za  pomocą  znaków  zapytania  (

<

).  Jednak  tym

razem parametry te mogą  być  typu  wejściowego,  wyjściowego

background image

28

JDBC. Leksykon kieszonkowy

lub wejściowo-wyjściowego. Po przygotowaniu wywołania  proce-
dury osadzonej, a przed  jej  uruchomieniem,  należy wykonać  jesz-
cze następujące czynności:

•  Wszystkie parametry wyjściowe muszą zostać zarejestrowane

za  pomocą  metody 

 %$

,  która  pobiera

dwa argumenty. Pierwszy z nich jest pozycją odpowiedniego
znacznika  parametru  (

<

)  w  przygotowanym  wywołaniu

(1 dla pierwszego znacznika, a następnie kolejno od  lewej
do prawej). Drugi parametr jest jedną ze stałych zdefiniowa-
nych w 

0>?@

 oznaczającą typ, co umożliwia sterow-

nikowi rozpoznanie, jaki rodzaj danych jest zwracany przez
procedurę osadzoną.

•  Wartość każdego parametru wejściowego i wejściowo-wyj-

ściowego musi być ustalona za pomocą jednej z funkcji 

===

odpowiedniej dla typu danych występujących w bazie.

Na przykład:

#

+<<A<+

 )#@!+58?

-9#)'

-&#)'

Do  uruchomienia  procedury osadzonej  należy  wykorzystać  me-
todę 

. Aby pobrać wartość któregoś z parametrów wyj-

ściowych procedury osadzonej,  należy w  przedstawiony  poniżej
sposób użyć jednej z metod 

 ===

 obiektu 

#3

 —

odpowiedniej dla danego typu danych SQL:

background image

Otrzymywanie wyników zapytań

29

3())

#+<<A<+

 %$*A@&B!4#

836A*)

837A*)

* -)

"

"'

Otrzymywanie wyników zapytań

Wyniki wykonania konstrukcji SELECT są zwracane przez metodę

 w postaci zbioru wynikowego (

!

). Obiekt

!

 prezentuje zbiór wynikowy w postaci tabeli zawierają-

cej wiersze i kolumny. Może on być przeglądany i modyfikowany,
może także być wrażliwy na zmiany w bazie danych (jeżeli ste-
rownik  i  baza  danych  oferują  taką  możliwość  dla  zapytań).
Domyślnie zbiór wynikowy można przeglądać jedynie w przód,
po  jednym  rekordzie,  wartości  w  kolumnach  nie  można  mo-
dyfikować, a sterownik  nie  jest w stanie wykryć zmian zacho-
dzących w bazie danych. Aby stworzyć zbiór  wynikowy,  który
można przeglądać, modyfikować i który będzie wykrywać zmia-
ny w bazie, należy użyć alternatywnej wersji jednej z metod 

#

  lub 

#

  obiektu 

#

. Metody te pobierają dwa dodatkowe argumenty:

background image

30

JDBC. Leksykon kieszonkowy

(stała współbieżności obiektu 

!

)

Określa, czy zbiór wynikowy może być tylko przeglądany,
czy  możliwe  będzie  także  dokonywanie  za  jego  pomocą
modyfikacji. Dostępne są dwie wartości stałej tego typu:

#%&#!5!C85%&D

#%&#!5$8C@C,

(stała typu obiektu 

!

)

Określa, w jaki sposób można przeglądać zbiór wynikowy
powstały w efekcie wykonania zapytania oraz ustala, czy
sterownik  ma  wykrywać  zmiany  w  bazie  danych  doty-
czące rekordów objętych zbiorem wynikowym. Oto dostępne
wartości tej stałej:

@D$5E%!FC!85%&D

Dla zbioru wynikowego przeglądanego tylko w przód,
niewrażliwego na modyfikacje.

@D$5#!%54&&4@4G

Dla  zbioru  wynikowego  przeglądanego  dwukierun-
kowo, niewrażliwego na modyfikacje.

@D$5#!%5&4@4G

Dla  zbioru  wynikowego  przeglądanego  dwukierun-
kowo, wrażliwego na modyfikacje.

Poniżej przedstawiono przykład utworzenia zbioru wynikowego,
który może być przeglądany, za pomocą którego można mody-
fikować  rekordy  w  bazie  i  który  jest  w  stanie  wykryć  zmiany
dokonywane w bazie (przy założeniu,  że  połączenie  — 

  —

istnieje):

!

()

background image

Otrzymywanie wyników zapytań

31

??++-A@ABC#

@D?CC8@8E

+5A+2

+5A+2

+"5A+2

+35A+2

+ +2

+"$!%&+2

+(5*+

Przeglądanie zbioru wynikowego

Jeżeli zbiór wynikowy został  ustalony  jako  możliwy  do  przeglą-
dania tylko w przód, do przesuwania się co jeden wiersz należy
używać metody 

. Zazwyczaj ta operacja wykonywana jest

w pętli o na przykład takiej strukturze (przy założeniu, że połą-
czenie — 

 — istnieje):

!

()

++

*%0

4

background image

32

JDBC. Leksykon kieszonkowy

Jeżeli zbiór może być przeglądany dwukierunkowo,  do  ustawia-
nia pozycji kursora można używać jednej z następujących metod:

3

"

>

  oraz 

>

.   Nie-

zależnie od tego, czy zbiór można przeglądać jedno- czy dwukie-
runkowo, bieżącą pozycję  kursora  można  określić  za pomocą  jed-
nej z metod: 

C"

,"E

E

 lub

 !(

.

Pobieranie wartości z kolumn

Bez względu na rodzaj zbioru wynikowego,  do pobrania wartości
z określonej kolumny służy jedna z metod 

 ===

 odpowiednia

dla typu danych SQL przechowywanych w  kolumnie. Pierwszym
argumentem metody  jest  indeks  kolumny,  który  jest  względną
pozycją kolumny w konstrukcji SQL (1 dla pierwszej, a następnie
kolejno od lewej do prawej). Poniżej przedstawiono przykład (przy
założeniu, że połączenie — 

 — istnieje):

4)

 &

 "&

0>?838

 

()

!

+5A+2

+5A+2

+"5A+2

+35A+2

+ +2

+"$!%&+2

+(5*+

(

background image

Otrzymywanie wyników zapytań

33

(22

8 8)

  9

(  &

%- -:

   =

"

"'

"'

W powyższym przykładzie zmiennej 

4

 typu 

  zostaje

przypisana wartość znajdująca się w kolumnie 

5

  zbioru

wynikowego. Kolumna ta występuje w zbiorze wynikowym jako
pierwsza, stąd w wywołaniu metody 

 4

podanym indeksem

jest liczba 1. Zmiennej 

&

 typu 

 

 przypisana jest wartość

z kolumny 

5

, pobrana ze zbioru wynikowego za pomocą

metody 

  

, do której jako argument przekazano wartość 2.

Wstawianie, modyfikowanie i usuwanie
wierszy za pomocą zbioru wynikowego

Jeżeli utworzony zbiór wynikowy umożliwia modyfikację, można
za jego pomocą wstawiać nowe wiersze, modyfikować wartości
w istniejących wierszach, a także usuwać wiersze.

background image

34

JDBC. Leksykon kieszonkowy

Wstawienie  nowego  wiersza  do  modyfikowalnego  zbioru wyni-
kowego  wymaga  najpierw  przeniesienia  kursora  do  roboczego
obszaru  zwanego 

 

  (tam  tworzy  się  nowy  wiersz)  za

pomocą metody 

>@4!(

. Następnie, za pomocą metod

z rodziny 

===

, należy ustalić wartości w poszczególnych

kolumnach. Właściwego wstawienia wiersza do tabeli dokonuje
się przy użyciu metody 

!(

. Na końcu trzeba z powrotem

ustawić kursor na rekordzie, na który wskazywał  przed  rozpo-
częciem wstawiania — służy do tego metoda 

>@#!(

.

Aby  zmodyfikować  wiersz  istniejący  w  zbiorze  wynikowym,
trzeba najpierw ustawić kursor na  żądanym  rekordzie,  a  następ-
nie za pomocą metod 

===

 wpisać do niego nowe wartości.

Modyfikacji wiersza w tabeli dokonuje metoda 

!(

.

Przed usunięciem istniejącego wiersza poprzez zbiór wynikowy
trzeba ustawić na wybranym wierszu kursor, a następnie wywołać
metodę 

!(

.

Poniższy przykład obrazuje wykonanie tych trzech operacji (przy
założeniu, że połączenie — 

 — istnieje):

!

!#%&#!5$8C@C,A

!@D$5#!%5&4@4G

+5A+2

+5A+2

+"5A+2

+35A+2

+ +2

+"$!%&+

HHF((I

$@8*

8)#&

background image

Otrzymywanie wyników zapytań

35

 9#-+F/

 &#CAD

:

=

*

$@?*

HHJ"/((I

)

 9#-+F/

*

HHK(I

)

*

"

"'

"'

Dynamiczne określanie
charakterystyki zbioru wynikowego

Do określania charakterystyki zbioru  wynikowego  w  trakcie
wykonywania  programu  służy  klasa 

!B8

.  Istnieje

wiele sytuacji, w których może pojawić się  konieczność  określenia

background image

36

JDBC. Leksykon kieszonkowy

cech otrzymanego zbioru. Na przykład, po wykonaniu dynamicz-
nej konstrukcji 

#@

, za pomocą obiektu 

!B8

 można

ustalić, co tak naprawdę ta konstrukcja zwróciła.

Poniżej przedstawiono  sposób uzyskiwania  obiektu 

!B

8

 dla bieżącego zbioru wynikowego za pomocą metody 

 

B8

 (przy założeniu, że połączenie — 

 — istnieje):

)

!

5-

+5A+2

+5A+2

+"5A+2

+35A+2

+ +2

+"$!%&+2

+(5*+

(

(22

"(*

 5-

 ##

"L)

"*M22

"L*

+;+2

 #&

 #&

++

background image

Otrzymywanie wyników zapytań

37

"L)

"*M22

"L*

+;+2

 

 

++

Korzystając  z  obiektu 

!B8

,  program  najpierw  okre-

śla liczbę kolumn ujętych w zapytaniu SQL. Następnie, podczas
przetwarzania  pierwszego  wiersza  zbioru  wynikowego,  wypi-
suje  nagłówki  kolumn,  używając  nazw  występujących  w  bazie
danych. Potem program wyświetla  kolejno  wartości  z  poszcze-
gólnych  wierszy.  Informacje  na  temat  wszystkich  możliwości
obiektu 

!B8

  znajdziesz  w  podrozdziale  „ResultSet-

MetaData” w rozdziale „JDBC API”.