Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
IDZ DO
IDZ DO
KATALOG KSI¥¯EK
KATALOG KSI¥¯EK
TWÓJ KOSZYK
TWÓJ KOSZYK
CENNIK I INFORMACJE
CENNIK I INFORMACJE
CZYTELNIA
CZYTELNIA
JDBC. Leksykon
kieszonkowy
Autor: Donald Bales
T³umaczenie: Jaros³aw Gierlicki
ISBN: 83-7361-165-7
Tytu³ orygina³u:
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.
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
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
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):
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):
()
*+
#
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!
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
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
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ść
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
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:
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:
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):
!
()
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
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*+
(
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.
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)#&
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
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
#&
#&
++
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”.