background image

Dla początkujących

Relacyjna baza danych HSQLDB

12

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

13

www.lpmagazine.org

   

lin

ux

@

so

ftw

ar

e.

co

m

.p

l

Relacyjna baza 

danych HSQLDB

Świadomie i nieświadomie z bazami danych każdy z nas styka się każdego dnia – robiąc zakupy,  
szukając książki w bibliotece, czy też czytając newsy na stronie internetowej. Warto więc wiedzieć 
cokolwiek więcej na temat jednego z najbardziej powszechnych sposobów użytkowania komputera. 
Warto zainteresować się bazami danych, gdyż z pewnością każdy znajdzie dziedzinę, w której warto 
zastosować uporządkowane zarządzanie danymi w postaci bazy danych.

Grzegorz Madajczak

W

śród  wielu  użytkowników  systemu  Li-
nux panuje przekonanie, że zawsze trze-
ba mieć najlepsze, najnowsze, najbardziej 
rozbudowane programy. Działają zgodnie 

z zasadą – jeśli mam to za darmo, to czemu nie mam mieć 
najlepszego. Nie jest ważne, że później używają jedynie 10% 
możliwości oprogramowania oraz gubią się w gąszczu opcji 
i możliwości.

Podobnie  jest  z  dostępnymi  silnikami  bazodanowy-

mi. Użytkownik, czy też bardziej deweloper innej aplikacji 
używa rozbudowanego serwera, np. MySQL, aby stworzyć 
program do katalogowania płyt z domowej audioteki. Nie 
rozumie, że nie zawsze trzeba stosować rozbudowane roz-
wiązania – serwery bazodanowe, takie jak MySQL, Post-
greSQL, czy Oracle do najprostszych, a nawet tych bardziej 
skomplikowanych  potrzeb.  Nie  rozumie,  że  zamiast  nich 
może posłużyć się dobrymi i prostymi – nie tak rozbudowa-
nymi programami. Proste nie oznacza bowiem, że są pozba-
wione jakiejś funkcjonalności. Dobrym przykładem na pro-
ste narzędzie do gromadzenia i zarządzania danymi jest re-
lacyjna baza danych HSQLDB. Czym są relacyjne bazy da-
nych przedstawia Ramka Relacyjne bazy danych.

Ogólne informacje 

HSQLDB jest relacyjną bazą danych powstałą w oparciu 
o języki JAVA oraz XML. Połączenie tych dwóch technik 
sprawia, że otrzymujemy proste w obsłudze i w miarę wy-
dajne narzędzie do zarządzania danymi. Zwolennicy Wol-
nego Oprogramowania, nie koniecznie użytkownicy sys-
temu  Linux,  z  dużym  prawdopodobieństwem  mieli  oka-
zję nieświadomie zetknąć się z HSQLDB, jako silnikiem 
bazodanowym w pakiecie OpenOffice.org – zwłaszcza w 
programie OOo Base. Choćby to zastosowanie jest wspa-
niałą rekomendacją dla opisywanego projektu...

Baza  danych  HSQLDB  rozpowszechniana  jest  na 

podstawie  licencji  BSD  (Berkeley  Software  Distribu-
tion). Nie wdając się w szczegóły różniące licencje GPL 
i  BSD,  przypominam,  że  licencja  typu  BSD  skupia  się 
na prawach autorskich. Jest bardzo liberalna, zezwala nie 
tylko na modyfikacje kodu i jego rozprowadzanie w ta-
kiej postaci, ale także na rozprowadzanie produktu bez 
postaci  źródłowej  czy  wręcz  włączenia  do  zamknięte-
go  oprogramowania  pod  warunkiem  załączenia  do  pro-
duktu  informacji  o  autorach  oryginalnego  kodu  i  treści 
licencji.

background image

Dla początkujących

Relacyjna baza danych HSQLDB

12

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

13

www.lpmagazine.org

Pakiet dystrybucyjny

Baza danych HSQLDB dystrybuowana jest w 
jednej wersji – niezależnej od platformy syste-
mowej – w postaci zzipowanego pakietu, który 
zawiera następujące foldery:

•   bin,  który  zawiera  skrypty  dla  systemu 

Linux  oraz  plik  wykonywalny  MSDOS 
–  służące  do  uruchomienia  narzędzi 
HSQLDB;

•   build, który zawiera plik build.xml dla me-

chanizmu ANT, a także plik wykonywalny 
MSDOS – obydwa służące do samodziel-
nego  zbudowania  ze  źródeł  HSQLDB 
(więcej  informacji  na  ten  temat  znajduje 
się w pliku readmebuild.txt);

•   classes, zawierający pliki *.class wygene-

rowane za pomocą ANT;

•   demo,  który  zawiera  przykładowe  skryp-

ty  dla  systemu  Linux  oraz  pliki  wykony-
walne  systemu  MSDOS,  służące  do  uru-
chamiania  narzędzi  HSQLDB  oraz  samej 
bazy danych HSQLDB. Znajduje się tam 
również  kilka  przykładów  dokumentów 
HTML,  w  których  HSQLDB  osadzone 
jest w postaci apletu;

•   doc,  zawierającego  zestaw  dokumentów 

HTML,  PDF  oraz  dokumentów  teksto-
wych  (  w  formacie  *.txt)  opisujących  w 
miarę  szczegółowo  różne  aspekty  korzy-
stania z HSQLDB oraz różne narzędzia tej 
bazy;

•   lib,  w  którym  zwarte  są  pakiety  binar-

ne hsqldb.jar oraz severlet.jar służące od-
powiednio  do  uruchomienia  bazy  danych 
oraz serwera sieciowego HSQLDB;

•   src,  w  którym  zgromadzone  są  pliki  źró-

dłowe  *.java  służące  do  samodzielne-
go  zbudowania  pakietów  binarnych 
HSQLDB.

Pobrany z internetu pakiet dystrybucyjny (do-
stępny  pod  adresem  http://www.hsqldb.org), 
wystarczy  rozpakować  na  dysku.  Tak  przy-
gotowany pakiet jest gotowy do użycia – nie 
wymaga jakichkolwiek innych czynności in-
stalacyjnych.  Bazą  danych  HSQLDB  mo-
żemy  posługiwać  się  również  w  przestrze-
ni użytkownika – bez konieczności posiada-
nia  uprawnień  administratora  systemu.  Wy-
starczy  rozpakować  pakiet  i  już  można  go 
użytkować.

Uruchomienie 

serwera baz danych

Baza danych HSQLDB może być uruchomiona 
na  kilka  różnych  sposobów.  Generalnie  rzecz 
ujmując,  sposoby  te  można  podzielić  dwoja-
ko: tryb serwera (Server Mode) oraz praca jako 

proces  aplikacji  (In-Process  Mode). Tryb  ser-
wera  oferuje  maksimum  wydajności  i  możli-
wości. Silnik bazodanowy pracuje w przestrze-
ni wirtualnej maszyny JAVA (JVM – JAVA Vir-
tual Machine
), nasłuchując połączeń wywoły-
wanych przez programy uruchomione na tym 
samym  komputerze  lub  na  innych  kompute-
rach w sieci. Różne programy mogą jednocze-
śnie połączyć się z bazą danych w celu uzyska-
nia lub przesłania informacji (danych), łącząc 
się z bazą danych za pomocą sterownika JDBC 
HSQLDB.  W  trybie  tym  serwer  baz  danych 
może obsługiwać jednocześnie do 10 baz da-
nych.Więcej na temat drugiego trybu (In-Pro-
cess
) będzie można dowiedzieć się z rozdziału 

tego artykułu, który został poświęcony zastoso-
waniu HSQLDB w programach JAVA.

Dostępne są trzy różne formy serwera baz 

danych, oferujące różne protokoły komunika-
cji  pomiędzy  klientem,  a  serwerem.  Pierw-
sza  z  form  to  tradycyjna  baza  danych,  któ-
ra zapewnia jednocześnie największą wydaj-
ność. Najprostszą formą jej uruchomienia bę-
dzie  wykonanie  w  terminalu  następującego 
polecenia:

$ java -cp ścieżka_dostępu/hsqldb.jar 
org.hsqldb.Server -database.0 file:
ścieżka_dostępu/moja_baza -dbname.0 
moja_baza

Listing 1. 

Kod przykładowego pliku server.properties

# Przykładowy plik serwera HSQDB
server.database.0 file:ścieżka_dostępu;ifexists=

true

server.dbname.0 nazwa_bazy_danych
server.port 9001

Listing 2. 

Pojedyncza sekcja pliku konfiguracyjnego narzędzia SQLTool – sqltool.rc

urlid test_hsqldbase
    url jdbc:hsqldb:hsql://localhost/ścieżka_dostępu
    username nazwa_użytkownika 
    

password

 hasło_użytkownika

Listing 3. 

Uwierzytelnianie metodą inlineRC podczas łączenia się z serwerem

$ java -jar $HSQLDB_HOME/lib/hsqldb.jar 

--inlineRC

   URL=jdbc:hsqldb:hsql://localhost/ścieżka_dostępu,
   

USER

=nazwa_użytkownika,

   

PASSWORD

=hasło_użytkownika

Listing 4. 

Ogólna składnia definicji kolumny tabeli

nazwa_kolumny typ_danych [

(

wielkość kolumny

)

    [{

DEFAULT

 <wartość_domyślna> | 

    GENERATED BY 

DEFAULT

 

AS

 IDENTITY 

    

(

START 

WITH

 <n>[, INCREMENT BY <m>]

)

}] | 

    [[

NOT

NULL

] [IDENTITY] [

PRIMARY

 

KEY

]

Listing 5. 

Przykładowe polecenie utworzenia tabeli

sql> 

create

 text 

table

 kontrahenci

(

   id int generated by 

default

 

as

 identity

(

start 

with

 0

)

 

not

 

null

 

primary

 

key

,

   imie varchar

(

50

)

 

not

 

null

,

   nazwisko varchar

(

100

)

 

not

 

null

,

   firma varchar

(

200

)

 

not

 

null

)

;

Listing 6. 

Ogólna składnia definicji ograniczeń

[

CONSTRAINT

 <nazwa>] 

    UNIQUE 

(

 <kolumna> [,<kolumna>...] 

)

 | 

    

PRIMARY

 

KEY

 

(

 <kolumna> [,<kolumna>...] 

)

 | 

    

FOREIGN

 

KEY

 

(

 <kolumna> [,<kolumna>...] 

)

REFERENCES

 <tabela 

referencji>    

(

 <kolumna> [,<kolumna>...]

)

 

    [

ON

 {DELETE | 

UPDATE

    {CASCADE | 

SET

 

DEFAULT

 | 

SET

 

NULL

}] | 

    CHECK

(

<warunki wyszukiwania>

)

background image

14

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

15

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

Powyższe polecenie tworzy i uruchamia bazę 
danych o nazwie 

moja_baza

. Należy zwrócić 

uwagą na dwa argumenty tego polecenia. War-
tość pierwszego z nich – 

database.0

 to ścież-

ka  dostępu  do  pliku  tworzonej  bazy  danych. 
Drugi argument – 

dbname.0

 określa alias (na-

zwę) bazy danych. Nazwą tą będziemy posłu-
giwali się późnej wielokrotnie łącząc się z ba-
zą danych.

Zaglądając do folderu, w którym umieści-

liśmy  nowoutworzoną  bazę  danych,  zobaczy-
my, że pojawiły się tam dwa nowe pliki: mo-
ja_baza.properties
  oraz  moja_baza.log.  Są  to 
pliki utworzonej bazy danych. Pierwszy z nich 
–  z  rozszerzeniem  *.properties  zawiera  infor-
macje  o  ogólnych  ustawieniach  bazy  danych. 
Natomiast  plik  z  rozszerzeniem  *.log  zawie-
ra informacje o zmianach wprowadzanych do 
bazy danych.

Zaprezentowane powyżej rozwiązanie wy-

korzystuje  bazę  danych  zapisaną  w  kilku  pli-
kach zapisanych na dysku – według wskazanej 
ścieżki dostępu. Istnieje jednak możliwość uru-
chomienia serwera bazy danych, który będzie 
działał tylko w pamięci operacyjnej kompute-
ra – tymczasowo. Oznacza to, że po zamknię-
ciu serwera dane zgromadzone w takiej bazie 
zostaną bezpowrotnie utracone. W celu urucho-
mienia takiego serwera HSQLDB wykonujemy 
w konsoli następujące polecenie:

$ java -cp ścieżka_dostępu/hsqldb.jar 
org.hsqldb.Server -database.0 mem:
in_memdb -dbname.0 in_memdb

W  stosunku  do  uprzednio  przedstawionego 
rozwiązania,  różnica  polega  na  zastosowaniu 
przedrostka 

mem:

 zamiast 

file

 jako wartości ar-

gumentu 

-database.0

.

Inną  formą  bazy  danych  jest  serwer  sie-

ciowy, który do komunikacji z klientem wy-
korzystuje  protokół  HTTP.  Przykładem  wy-
korzystania tego rozwiązania są sytuacje na-
rzucane przez ograniczenia zapory sieciowej, 
która nie przepuszcza innej komunikacji, jak 
przez port 80. Należy jednak pamiętać, iż ser-
wer sieciowy nie oferuje tej samej wydajno-
ści, co zwykły serwer. Uruchomienie serwera 
sieciowego HSQLDB nie różni się zbytnio od 
opisanych wcześniej metod.

$ java -cp ścieżka_dostępu/hsqldb.jar 
org.hsqldb.WebServer -database.0 
file:ścieżka_dostępu/moja_baza_web -
dbname.0 moja_baza_web

Podobnie,  jak  i  w  poprzednich  przykładach 
możliwe jest uruchomienie serwera sieciowego 
HSQLDB działającego tylko w pamięci opera-
cyjnej komputera:

$ java -cp ścieżka_dostępu/hsqldb.jar 
org.hsqldb.WebServer -database.0 mem:
moja_baza_web -dbname.0 moja_baza_web

Instalacja serwera 

baz danych HSQLDB

Opisane  powyżej  przykłady  pokazują,  w  ja-
ki sposób szybko uruchomić serwer HSQLDB. 
Ich wadą jest to, że przy każdym starcie syste-
mu trzeba powtarzać te same czynności. Moż-
na jednak tak przygotować nasz system, aby ba-
za danych HSQLDB startowała automatycznie 
jako proces działający w tle. W tym celu uprzed-
nio pobrany zzipowany pakiet, zawierający bi-
narne pliki serwera baz danych, należy rozpako-
wać do dowolnego folderu. Kolejnym krokiem 
jest sprawdzenie czy mamy zdefiniowaną w sys-

temie  zmienną 

JAVA_HOME

.  Najlepiej  dokonać 

tego wydając w konsoli następujące polecenie:

$ env | grep JAVA_HOME

Przy  braku  odpowiedzi,  należy  sprawdzić, 
gdzie w naszym systemie znajdują się pliki ma-
szyny wirtualnej JAVA. Wydajemy w tym ce-
lu polecenie, które odnajdzie nam wykonywal-
ny plik java:

$ whereis java

Istnieje  duże  prawdopodobieństwo,  że  pomo-
że to ustalić lokalizację JVM. Posiadając taką 
wiedzę należy zdefiniować zmienną 

JAVA_HO-

ME

, stosując polecenie 

export

:

$ export JAVA_HOME; JAVA_HOME=/usr/
java/j2sdk1.6.0

Następnie  należy  odpowiednio  zmodyfiko-
wać  zmienną 

CLASSPATH

,  tak  aby  wskazywa-

ła  ścieżkę  dostępu  do  folderu  zawierającego 
plik hsqldb.jar:

$ export CLASSPATH; CLASSPATH=ścieżka_
dostępu_do_hsqldb.jar

Ostatnim  zadaniem  będzie  utworzenie  pli-
ku właściwości bazy danych HSQLDB – se-
rver.properties
, który musi znaleźć się w ka-
talogu domowym użytkownika bazy danych. 
Przykładowy  plik  *.properties  znajduje  się 
w pakiecie dystrybucyjnym HSQLDB wśród 
innych  plików  źródłowych  (ścieżka  dostępu: 
src/org/hsqldb/sample/sample-server.proper-
ties
). Nic nie stoi jednak na przeszkodzie, aby 
plik ten utworzyć samodzielnie. Przykładowy 
plik server.properties przedstawiony został na 
Listingu  1,  a  opis  właściwości  pliku  konfi-
guracyjnego,  wraz  z  wartościami  domyślny-
mi przedstawia Tabela 1. Pierwsze dwa wier-
sze Listingu zawierające opcje konfiguracyjne 
serwera HSQLDB nie wymagają komentarza 
– mają taką samą funkcję, jak argumenty po-
dawane w linii poleceń podczas ręcznego uru-
chamiania serwera. Jedyną różnicą jest argu-
ment 

ifexist=true

  w  pierwszej  linii  opcji. 

Argument  ten  oznacza,  że  baza  danych  ma 
być uruchomiona niezależnie od tego, czy plik 
podany w ścieżce dostępu istnieje, czy też nie. 
W przypadku braku pliku zostanie utworzona 
nowy  serwer,  w  nowych  plikach,  o  podanej 
ścieżce dostępu. Wartość 

true

 jest wartością 

domyślą.  Jej  przeciwieństwo  (

ifexist=fal-

se

) oznacza, że przy braku wskazanego pliku 

serwer  nie  zostanie  uruchomiony.  Natomiast 
ostatni wiersz określa port na którym serwer 

Listing 7. 

Tworzenie tabeli z wielokolumnowym kluczem głównym oraz tabeli z kluczem obcym

sql> 

create table

 klient

(

   imie varchar

(

50

)

 

not

 

null

,

   nazwisko varchar

(

100

)

 

not

 

null

,

   adres varchar

(

150

)

,

   pesel varchar

(

11

)

,

   unique

(

pesel

)

,

   

primary

 

key

(

imie, nazwisko

))

;

sql> 

create table

 firmy

(

   id int generated by 

default

 

as

 identity

(

start 

with

 0

)

,

   wlasciciel_imie varchar,
   wlasciciel_nazwisko varchar,
   adres_firmy varchar,
   nip varchar

(

10

)

,

   konto varchar

(

26

)

,

   

foreign

 

key

(

wlasciciel_imie, wlasciciel_nazwisko

)

 

references

 

klient

(

imie, nazwisko

))

;

background image

14

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

15

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

będzie nasłuchiwał – domyślnie jest to 9001 
lub 554 dla połączenia szyfrowanego TLS.

Ostatnią  czynnością  będzie  uruchomie-

nie procesu serwera bazy danych HSQLDB, 
za pomocą polecenia 

nohup

, które sprawi, że 

rozpoczęty w ten sposób wątek będzie dzia-
łał w tle.

$ nohup java org.hsqldb.Server &

Aby przekonać się, że serwer działa w tle można 
wydać polecenie 

ps

, listujące aktywne procesy.

$ ps -A | grep hsqldb.jar

Niemalże  identycznie  należy  postępować 
w  przypadku  uruchamiania  serwera  siecio-
wego HSQLDB. Różnica polega na tym, że 
plik  konfiguracyjny  serwera  sieciowego  to 
oczywiście  webserver.properties  z  właści-
wościami  o  przedrostku  server,  z  dwoma 
dodatkowymi właściwościami: 

server.de-

fault_page

  –  definiującą  domyślną  stronę 

dla  serwera  oraz  server.root  –  określającą 
lokalizację plików serwera. W tym wypadku 
uruchamiany  jest  program  org.hsqldb.We-
bServer.

W  pakiecie  dystrybucyjnym  bazy  da-

nych  HSQLDB  znajduje  się  również  przy-
kładowy skrypt systemu 

init

 – hsqldb, któ-

ry po skopiowaniu do folderu /etc/init.d lub 
/etc/rc.d/init.d
  (różnie  w  zależności  od  dys-
trybucji, wymagane są uprawnienia admini-
stratora systemu), pozwala na automatyczny 
start serwera HSQLDB podczas uruchamia-
nia  systemu.  Skrypt  ten  znajduje  się  w  fol-
derze bin pakietu instalacyjnego. Ponadto w 
folderze src/org/hsqldb/sample/ znajduje się 
opatrzony  bogatymi  i  czytelnymi  komenta-
rzami plik sample-hsqldb.cfg, w którym za-
warta  jest  podstawowa  konfiguracja  syste-
mowa serwera HSQLDB. Obejmuje ona ta-
kie informacje, jak lokalizacja JAVA, czy pa-
kietu HSQLDB. Plik ten należy samodzielnie 
zmodyfikować,  a  następnie  umieścić  w  tym 
samym  miejscu,  co  skrypt  systemu  init.  W 
folderze  domowym  root-a  powinny  znaleźć 
się dwa pliki – plik server.properties, będą-
cy  kompilacją  potencjalnych  plików  *.pro-
perties
  konkretnych  baz  danych  (zawiera  te 
same dane kolejno dla każdego z serwerów) 
oraz plik sqltool.rc, który zostanie omówiony 
w następnym rozdziale artykułu.

Dostęp do bazy 

danych – SQLTool

Silnik  bazodanowy  HSQLDB  dostarcza 
własne  narzędzie  służące  do  zarządzania 
serwerem  i  danymi  bazy  za  pomocą  języ-

ka  SQL  –  SQLTool.  Jest  to  narzędzie  uru-
chamiane i działające z linii poleceń, przez 
co  może  być  używany  na  przykład  zdalnie 
–  poprzez  połączenie  SSH.  Dodatkową  za-
letą  SQLTool  jest  możliwość  używania  nie 
tylko  w  odniesieniu  do  HSQLDB,  lecz  do 
każdej innej bazy danych, która posiada ste-
rownik JDBC.

Narzędzie  SQLTool  wymaga  do  dzia-

łania JVM firmy Sun w wersji 1.4 lub póź-
niejszej. Autorzy projektu sumiennie zazna-
czają, iż program ten nie był testowany na in-
nych wersjach JVM, niż oryginalny produkt 
firmy  Sun,  więc  możliwe  jest,  że  w  przy-
padku innych odmian JVM, jak na przykład 
Blackdown Java, czy IBM Java mogą wystą-
pić trudne do przewidzenia nieprawidłowości 
działania programu.

Przed  rozpoczęciem  pracy  z  SQLTool  w 

katalogu  domowym  użytkownika  musi  zna-
leźć się plik konfiguracyjny sqltool.rc. Przykła-
dową wersję tego pliku można znaleźć w pa-
kiecie  dystrybucyjnym  HSQLDB  w  folderze 
src/org/hsqldb/sample.  W  pliku  tym  znajdują 
się przykładowe konfiguracje zarówno do ob-
sługi serwera HSQLDB, jak i innych serwerów 
bazodanowych.

Plik ten składa się z sekcji, które opisują 

konfiguracje dla poszczególnych serwerów, z 
których  można  korzystać  za  pośrednictwem 
narzędzia SQLTool. Przykładowa sekcja pli-
ku sqltool.rc została przedstawiona na Listin-
gu  2.  Identyfikator  konfiguracji  określony 
jest jako wartość argumentu 

urlid

. W kolej-

nym wierszu znajduje się wartość argumen-
tu 

url

 określająca oczywiście adres serwera 

baz danych. Dla niezaznajomionych z inter-
fejsem JDBC, wyjaśniam, że adres ten skła-
da się z wywołania warstwy pośredniczącej 

JDBC, następnie po dwukropku identyfikato-
ra sterownika JDBC oraz na końcu, także po 
dwukropku, właściwego URL. W przypadku 
sterownika  hsqldb  należy  jeszcze  określić, 
czy mamy do czynienia z bazą danych w pli-
ku  (

file:

),  czy  też  zlokalizowaną  w  pamię-

ci (

mem:

). Następne dwa wiersze sekcji okre-

ślają kolejno nazwę użytkownika oraz hasło 
dostępu do serwera. Inne opcje, które mogą 
znaleźć się w sekcji konfiguracyjnej to:

•  

charset

 – określająca stronę kodową zna-

ków, stosowaną przez narzędzie SQLTool;

•  

driver

  –  określająca  klasę  sterownika 

JDBC dla konfigurowanego serwera;

•  

truststore

 – określająca ścieżkę dostępu 

do pliku zawierającego klucz stosowany w 
szyfrowanym połączeniu z serwerem TLS.

Jak łatwo zauważyć stosowanie pliku konfigu-
racyjnego sqltool.rc ma jedną zasadniczą wa-
dę. Na dysku komputera zostają zapisane nie 
chronione w jakikolwiek sposób poufne dane 
– adresy, loginy i hasła do serwerów baz da-
nych. Jeśli korzystamy z SQLTool dla potrzeb 
lokalnej bazy danych na domowym kompute-
rze, to rozwiązanie takie może nawet ujść. Jest 
ono jednak nie do zaakceptowania w środowi-
skach  produkcyjnych  –  stwarza  zbyt  wysoki 
ryzyko przejęcia kontroli nad zasobami, któ-
re powinny być chronione.

Z  powyższych  względów  SQLTool 

umożliwia łączenie się z serwerem i uwie-
rzytelnianie stosując metodę 

inlineRC

. Me-

toda  ta  polega  na  podaniu  w  linii  poleceń 
wszystkich informacji,niezbędnych do uzy-
skania połączeni z serwerem, już na etapie 
uruchamiania  polecenia 

sqltool

.  Stosuje-

my w tym celu przełącznik 

--inlineRC

. Po-

Tabela 1. 

Właściwości serwera HSQLDB

Właściwość

Wartość domyślna

Opis cechy

Właściwości serwera i serwera sieciowego

server.database

file:ścieżka_do-
stępu

Ścieżka dostępu do plików serwera

mem:baza_danych

Plik serwera zlokalizowany w pamięci komputera

server.dbname

Nazwa (alias) bazy danych

server.port

9001

Port, na którym serwer nasłuchuje połączeń od klienta

554 (TLS)
80 (WebServer)

server.silent

true

Cichy tryb serwera (minimalna ilość komunikatów)

Właściwości tylko serwera

server.no_sys-
tem_exit

true

Nie wywołuje metody 

System.exit()

 przy zamknię-

ciu serwera

Właściwości tylko serwera sieciowego

server.default_page

index.html

Domyślny dokument serwera

server.root

./

Domyślna lokalizacja plików serwera

background image

16

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

17

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

łączenie tą metodą z serwerem opisanym w 
treści pliku sqltool.rc z Listingu 2, przedsta-
wiono na Listingu 3. Oprócz zaprezentowa-
nych na listingu trzech podstawowych wła-
ściwości, dodatkowo, po przecinkach, moż-
na również określić stronę kodową znaków 
(

CHARSET

) oraz plik zawierający klucz TLS 

(

TRUST

).

Metoda uwierzytelniania inlineRC charak-

teryzuje  się  również  interaktywnością.  Ozna-
cza, to, że gdy podamy jedynie URL, program 
podczas logowania zapyta się nas o niezbędne 
brakujące  informacje  –  nazwę  użytkownika  i 
przypisane mu hasło.

Graficzne 

narzędzie do zarządzania bazą

W pakiecie dystrybucyjnym HSQLDB oprócz 
omawianego  powyżej  narzędzia  SQLtool 
znajduje się również program napisany w JA-
VA służący do zarządzania bazą danych. De-
weloperzy dostarczają dwie wersje tego same-
go narzędzi – jedną napisaną z użyciem biblio-
tek AWT, druga zaś wersja wykorzystuje bi-
blioteki Swing. 

Obie wersje nie różnią się niczym w swej 

funkcjonalności.  Różnica  polega  jedynie  na 
wyglądzie interfejsu – odmiennym ze względu 
na rodzaj użytej biblioteki. 

Uruchomienie  obu  wersji  programu  jest 

podobne:

$ java -cp hsqldb.jar cp org.hsqldb.u
til.DatabaseManager

Powyższe  polecenie  uruchamia  narzędzie 
napisane  w  AWT.  Jeśli  chcemy  urucho-
mić  program  napisany  z  użyciem  bibliote-
ki  Swing,  polecenie  będzie  wyglądało  na-
stępująco:

$ java -cp lib/hsqldb.jar org.hsqldb.
util.DatabaseManagerSwing

Program DatabaseManager (Rysunek 1) jest ła-
twym w użyciu, intuicyjnym narzędziem, dzię-
ki któremu możemy łączyć się z różnymi ba-
zami danych, z możliwością zapisywania usta-
wień dla każdej bazy danych.

Zarządzanie 

użytkownikami bazy danych

Nowoutworzona  baza  danych  zawiera  do-
myślnego  użytkownika  sa  z  prawami  admi-
nistratora, który nie ma jednak przypisanego 
hasła.  Dlatego  też  zaraz  po  zalogowaniu  się 
do  serwera,  dobrze  jest  nadać  użytkowniko-
wi  sa  hasło,  stosując  powyższe  polecenie  w 
języku SQL:

sql> set password ”nowe_hasło”;

Należy pamiętać, aby po wprowadzeniu tej 
zmiany  zmodyfikować  odpowiednio  plik 
sqltool.rc.  Jednak  posługiwanie  się  na  co 
dzień  kontem  administratora  nie  jest  do-
brym  rozwiązaniem.  Dlatego  warto  jest 
stworzyć  dodatkowego  użytkownika  bazy 
danych. Dokonujemy tego poleceniem 

CRE-

ATE  USER

, którego ogólna składnia wyglą-

da następująco:

CREATE USER <nazwa_użytkownika> 
PASSWORD <hasło> [ADMIN];

W  miejscach 

<nazwa_użytkownika>

  oraz 

<hasło>

  wprowadzamy  odpowiednie  infor-

macje. Słowo kluczowe 

ADMIN

 na końcu po-

lecenia  oznacza,  że  nowotworzonemu  użyt-
kownikowi  nadajemy  prawa  administrato-
ra bazy danych. Tak więc przykładowe pole-
cenie  tworzące  użytkownika  gmad  z  hasłem 
123456abc, który posiada uprawnienia admi-
nistratora wygląda następująco:

sql> CREATE USER gmad PASSWORD 
123456abc ADMIN;

Raz nadane hasło może być zmienione za po-
mocą polecenia 

ALTER USER

 o następującej bu-

dowie:

ALTER USER <nazwa_użytkownika> SET 
PASSWORD <nowe_hasło>;

Uprawnienia  użytkownika  mogą  być  modyfi-
kowane przez administratora serwera za pomo-
cą  polecenia 

GRANT

,  którego  ogólna  struktura 

wygląda następująco:

GRANT { SELECT | DELETE | INSERT | 
UPDATE | ALL } [,...]
ON { table | CLASS "package.class" } 
TO <nazwa_użytkownika>;

Chcąc  nadać  użytkownikowi  o  nazwie  gmad 
uprawnienia do pobierania danych oraz wsta-
wiania danych do tabeli o nazwie tabela_1 po-
lecenie to przyjmie następujący kształt:

sql> grant select,insert on tabela_1 
to gmad;

Oczywiście  istnieje  możliwość  odebrania 
wcześniej  przyznanych  uprawnień.  Służy  do 
tego polecenie 

REVOKE

, o następującej składni:

REVOKE { SELECT | DELETE | INSERT | 
UPDATE | ALL } [,...] 
ON { table | CLASS "package.class" } 
FROM <nazwa_użytkownika>;

Odebranie  użytkownikowi  gmad  uprzednio 
nadanych  uprawnień  będzie  wyglądało  nastę-
pująco:

sql> revoke select,insert on tabela_1 
from gmad;

Relacyjne bazy danych wyróżniają się wśród innych typów (np. kartotekowe, obiekto-
we, hierarchiczne, …), że tablice w niej zawarte mogą być ze sobą wzajemnie powią-
zane (np. wymieniać się informacjami dzięki kluczom obcym). Bazy takie korzystają z 
języków programowania, zwykle SQL, za pomocą których dana baza jest obsługiwa-
na. W bazach takich dane gromadzone są w postaci dwuwymiarowych tabel (nazywa-
nych relacjami), które obowiązkowo muszą zawierać przynajmniej jedną kolumnę (atry-
but) oraz mogą zawierać zero lub więcej wierszy (inaczej – krotek). Istotne jest to, że 
z braku możliwości identyfikacji wiersza przez jego pozycję, konieczna jest obecności 
przynajmniej jednej niepowtarzalnej w obrębie całej tabeli kolumny, która pozwala od-
naleźć konkretny wiersz. Kolumnę taką określa się jako klucz podstawowy (ang. pri-
mary key
) tabeli.

Relacyjne bazy danych

SQL (Structured Query Language) – strukturalny język zapytań używany do tworzenia, mo-
dyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych. Język 
ten został opracowany na początku lat 70-tych w firmie IBM, z czasem stając się standar-
dem w komunikacji z bazami danych. Obecnie wykorzystywany jest przez wszystkie liczą-
ce się silniki bazodanowe, uzyskując liczne odmiany.

Język SQL

background image

16

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

17

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

Oczywiście można również usunąć użytkowni-
ka bazy danych. Służy do tego polecenie 

DROP

 

USER

 o następującej składni:

DROP USER <nazwa_użytkownika>.

Tak  więc  usunięcie  domyślnego  użytkownika 
sa (czynność, do której gorąco namawiam po 
stworzeniu  własnego  administratora)  wygląda 
następująco:

sql> DROP USER sa;

Tworzenie tabeli

Jakakolwiek baza danych nie może prawidło-
wo funkcjonować bez tabel gromadzących da-
ne.  Utworzenie  nowej  tabeli  w  HSQLDB  nie 
różni się znacząco od sposobów realizacji te-
go zadania w innych silnikach bazodanowych, 
obsługujących  SQL.  Służy  do  tego  polecenie 

CREATE TABLE

, o następującej składni:

CREATE [MEMORY|CACHED|[GLOBAL]TEMPORA
RY|TEMP|TEXT] TABLE <nazwa_tabeli>
( <definicja kolumny> [, ...] [, 
<definicja ograniczeń>...] )
[ON COMMIT {DELETE | PRESERVE} ROWS];

Najważniejszym elementem, który jednocze-
śnie  sprawia  początkującym  użytkownikom 
najwięcej  kłopotu  jest  definicja  kolumny. 
Ogólny schemat tej definicji przedstawia Li-
sting 4. Istotnym elementem definicji kolum-
ny jest prawidłowy dobór typu danych. Oso-
bom zaznajomionym z językiem JAVA typy 
danych nie sprawią kłopotu, gdyż są one bez-
pośrednim  odniesieniem  do  typów  danych 
stosowanych  w  tym  języku.  Najważniejsze 

typy  danych  używane  w  HSQLD  prezentu-
je Tabela 2.

Tworząc tabelę zaraz na samym począt-

ku  należy  zdecydować,  w  jaki  sposób  da-
na  tabela  będzie  przechowywana.  Domyśl-
nym typem są tabele przechowywane w pa-
mięci  (typ 

MEMORY

).  Całość  ich  struktury  i 

danych  przechowywane  są  w  pamięci  kom-
putera,  lecz  wszelkie  zmiany  zachowywa-
ne są na dysku w postaci pliku <nazwa_ta-
bli>.script
.  Przy  kolejnym  otwarciu  tabeli 
wszelkie zmiany wprowadzone do niej są au-
tomatyczne w prowadzane do tabeli otwartej 
w pamięci. Podobne do tabel typu 

MEMEORY

 są 

tabele  typu 

CACHED

,  które  również  przecho-

wywane są w pamięci, lecz jedynie w po czę-
ści – część danych, indeksy. Ten typ tabeli ma 
zastosowanie  w  odniesieniu  do  bardzo  du-
żych tabel, które zajęłyby w pamięci znaczną 
jej przestrzeń. Tabela typu 

TEMP

 jest również 

przechowywana tylko w pamięci, z tą różnicą 
w odniesieniu do tabeli typu 

MEMORY

, że obo-

wiązuje ona jedynie na czas bieżącego połą-
czenia i po jego zamknięciu zostaje automa-
tycznie usunięta. Natomiast tabele typu 

TEXT 

charakteryzują się tym, że zapisywana są na 
dysku w pliku tekstowym CSV.  

Istnieją  pewne  ograniczenia  w  stosun-

ku do wyboru typu tabel. Jeśli utworzona ba-
za danych istnieje tylko w pamięci (typ 

mem

), 

jedyną  dozwolonym  typem  tabeli  jest 

MEMO-

RY

. Tabela typu 

CASHED

 zostanie przekształco-

ne na tabelę typu 

MEMORY

. Polecenie utworze-

nia tabeli typu 

TEXT

 zostanie w tym przypad-

ku odrzucone.

W  sekcji  dotyczącej  definicji  kolum-

ny  wyjaśnienia  wymagają  słowa  kluczowe 

NULL

  / 

NOT  NULL

IDENTITY

  oraz 

PRIMARY 

KEY

. Pojęcia 

NULL 

NOT NULL

 definiują, czy 

możliwe jest przechowywanie wartości pu-
stych. Jeśli chcemy aby kolumna obowiąz-
kowo zawierała dane – należy ustawić war-
tość 

NOT  NULL

.  Próba  wprowadzenia  war-

tości pustej wywoła błąd. Kolumny z usta-
wioną wartością 

IDENTITY 

gromadzą iden-

tyfikatory dla wprowadzonej krotki danych. 
Kolumna  ta  obowiązkowo  musi  mieć  typ 

INT

 lub 

BIGINT

 oraz z zasady jest przecho-

wuje jedynie wartości nie-puste (

NOT NULL

). 

Ponadto  kolumna  z  wartością 

IDENTITY

 

charakteryzuje  się  automatycznym  przyro-
stem za każdą wprowadzaną krotką danych. 
Możliwe jest określenie wartości początko-
wej  tej  kolumny  stosując  polecenie 

START 

WITH <n>

, lecz definicja takiej kolumny wy-

gląda nieco inaczej – tak, jak na przykładzie 
zaprezentowanym  na  Listingu  5.  Zastoso-
wanie  polecenia 

IDENTITY()

  zwraca  ostat-

nią wartość kolumny z wartością 

IDENTITY

 

wprowadzoną  w  bieżącym  połączeniu.  Na-
tomiast pojęcie 

PRIMARY  KEY

 oznacza uni-

kalny klucz główny tabeli – służący indek-
sowaniu  tabeli,  co  przyśpiesza  jej  przeszu-
kiwanie.  Kolumna 

PRIMARY  KEY

  obowiąz-

kowo  musi  być 

NOT  NULL

  oraz  tabela  mo-

że mieć tylko jeden klucz główny, choć mo-
że  być  złożony  z  wielu  kolumn.  Listing  5 
przedstawia  przykładową  definicję  tabeli  z 
czterema  kolumnami,  z  których  jedna  jest 
identyfikatorem.

Analizując  ogólną  składnię  polecenia 

tworzenia  tabeli,  na  samym  jej  końcu  znaj-
duje  się  nieobowiązkowa  sekcja 

<definicja 

ograniczeń>

,  która  pozwala  na  dodawanie 

lub  usuwanie  ograniczeń  w  stosunku  do  ta-
beli. Ogólna składnia tej sekcji została przed-

Tabela 2. 

Typy danych kolumn

Nazwa

Odpowiadający typ JAVA

Opis

INTEGER | INT

java.lang.Integer 

Standardowa liczba całkowita z zakresu od -2147483648 do  2147483647. W 
przypadku liczb bez znaku zakres ten wynosi od 0 do 4294967295.

DOUBLE [PRECISION] | FLOAT

java.lang.Double 

Liczba zmiennoprzecinkowa, gdzie 

PRECISION 

określa dokładność liczby.

VARCHAR

java.lang.String 

Tekst o zmiennej długości o maksymalnej długości  4294967295 znaków.

VARCHAR_IGNORECASE

java.lang.String 

Tekst jak wyżej – tylko małe litery.

CHAR | CHARACTER

java.lang.String 

Łańcuch znaków o maksymalnej długości  4294967295 znaków.

DATE

java.sql.Date 

Data w formacie RRRR-MM-DD

TIME

java.sql.Time 

Czas w formacie GG-MM-SS

TIMESTAMP | DATETIME

java.sql.Timestamp 

Przedział czasowy

BOOLEAN | BIT

boolean | java.lang.Boolean 

Wartość logiczna

SMALLINT

short | java.lang.Short 

Mała liczba całkowita z zakresu od -32768 do 32767

BIGINT

long | java.lang.Long 

Duża liczba całkowita z zakresu od -9223372036854775808 do 
9223372036854775807. Dla liczb bez znaku zakres ten wynosi od 0 do 
18446744073709551615

BINARY

byte[] 

Tablica bitów

OTHER | OBJECT

java.lang.Object

Obiekt

background image

18

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

19

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

stawiona  na  Listingu  6.  Część  z  obecnych 
tam  opcji  została  omówiona  już  wcześniej, 
np.  tworzenie  klucza  głównego  tabeli  przy 
zastosowaniu 

PRIMARY  KEY

. Wewnątrz sek-

cji 

CONSTRAINTS

 możliwe jest nieco odmien-

ne skonstruowanie klucza głównego poprzez 
podanie w nawiasie nazwy kolumny, dla któ-
rej klucz ma być utworzony. Takie rozwiąza-
nie pozwala ponadto na stworzenie wieloko-
lumnowego klucza głównego, co zostało za-
prezentowane w pierwszym poleceniu Listin-
gu 7. Sekcja 

CONSTRAINTS 

pozwala również 

na utworzenie klucza obcego, czyli odwoła-
nia do innej tabeli. Klucz obcy tworzony jest 
przy  użyciu  polecenia 

FOREIGN  KEY

.  Przy-

kład jego zastosowania znajduje się również 
na  Listingu  7  –  w  drugim  poleceniu.  Stwo-
rzono tam odwołanie (klucz obcy) do klucza 
głównego innej tabeli.

Sekcja 

CONSTRAINTS 

pozwala  także  na 

stworzenie  indeksu  kolumny,  poprzez  pole-
cenie 

UNIQUE

.  Oznacza  to,  że  każda  z  war-

tości w tej kolumny jest w jej obrębie niepo-
wtarzalna. Konsekwencją obecności indeksu 
jest to, że kolumna taka musi być obowiąz-
kowo 

NOT  NULL

. Jeśli nie zostanie to zdefi-

niowane  przy  tworzeniu  samej  kolumny  in-
terpreter napotykając polecenie 

UNIQUE 

od-

powiednio  zmodyfikuje  kolumnę,  do  której 
tworzony jest indeks, domyślnie dodając do 
niej ograniczenie 

NOT NULL

.

Tabele tekstowe

Od  wersji  1.7.0  HSQLDB  obsługuje  moż-
liwość  zapisu  danych  w  tabelach  teksto-

wych (typu 

TEXT

), to jest takich, w których 

dane przechowywane są w pliku w forma-
cie CSV. 

Dzięki 

warstwie 

pośredniczącej 

HSQLDB  udostępnia  wobec  takich  pli-
ków wszystkie funkcje wynikające z języka 
SQL  –  indeksowanie,  klucze  główne  i  ob-
ce,  a  także  łączenie  tabel  tekstowych  oraz 
normalnych. Tworzenie tabeli tekstowej nie 
różni się niczym od uprzednio zaprezento-
wanych sposobów:

sql> CREATE TEXT TABLE tabela_tekstowa 
(kolumna_1 VARCHAR, kolumna_2 INT);

W  przypadku  tabeli  typu 

TEXT

,  przed  rozpo-

częciem pracy z tą tabelą należy wykonać kil-
ka dodatkowych czynności. Przede wszystkim 
należy określić plik źródłowy, w którym dane 
będą przechowywane. Służy do tego następu-
jąc polecenie:

SET TABLE <nazwa tabeli> SOURCE <nazwa 
pliku i opcje>

Nazwa pliku, wraz z opcjami musi zostać za-
pisana w cudzysłowiu. Podstawową opcją, któ-
rą  można  zdefiniować  jest  sposób  rozdziela-
nia danych w wierszu. Domyślnie jest to prze-
cinek, lecz nic nie stoi na przeszkodzie, aby był 
to każdy inny znak. Służy do tego argument 

fs

 

(od field separator):

sql> SET TABLE tabela_tekstowa SOURCE 
”plik_tabeli_tekstowej.csv;fs=|”;

Inne  opcje  pliku  tabeli  tekstowej  przedstawia 
Tabela 3.

Modyfikowanie tabeli

Raz utworzoną tabelę można oczywiście zmo-
dyfikować. Służy do tego polecenie 

ALTER TA-

BLE

. Jego konstrukcja jest nieco zróżnicowana, 

w zależności od tego, co chcemy osiągnąć. Jeśli 
chcemy dodać kolumnę, polecenie będzie wy-
glądać następująco:

ALTER TABLE <nazwa tabeli> ADD COLUMN 
<definicja kolumny> [BEFORE <istniejąca 
kolumna>];

Generalnie  składnia  polecenia  nie  wymaga 
większych  komentarzy,  być  może  poza  sło-
wem 

BEFORE

. Oznacza ono, że nowa kolumna 

zostanie wstawiona przed już istniejącą. Pole-
cenie modyfikacji już istniejącej kolumny wy-
gląda podobnie:

ALTER TABLE <nazwa tabeli> ALTER 
COLUMN <definicja kolumny>;

W definicji kolumny definiujemy kolumnę uży-
wając już istniejącej nazwy. Usunięcie kolum-
ny jest jeszcze prostsze:

ALTER TABLE <nazwa tabeli> DROP COLUMN 
<nazwa kolumny>;

Bardzo  podobnie  wygląda  polecenie  zmiany 
nazwy kolumny:

ALTER TABLE <nazwa tabeli> ALTER 
COLUMN <nazwa kolumny> RENAME TO <nowa 
nazwa>

Istnieje również możliwość zmiany nazwy ca-
łej tabeli:

ALTER TABLE <nazwa_tabeli> RENAME TO 
<nowa nazwa>;

Wprowadzanie danych

Mając gotową tabelę nadchodzi czas aby wsta-
wić do niej jakieś dane. W tym celu należy po-
służyć się poleceniem 

INSERT  INTO  TABLES 

VALUES

.  Przykładowo,  wprowadzenie  danych 

do pierwszej tabeli z Listingu 7 będzie wyglą-
dało następująco:

sql> insert into klient values('Grzeg
orz','Madajczak','Kwiatowa 7/15 Warsza
wa','65111501738');

Można także wprowadzić tekst tylko do po-
jedynczych kolumn, przy czym pozostałe ko-

Listing 8. 

Ogólna składnia polecenia SELECT

SELECT

 [{LIMIT <offset> <limit> | TOP <limit>}[2]][

ALL

 | DISTINCT] 

{ selectExpression | 

table

.* | * } [, ...] 

[

INTO

 [CACHED | TEMP  | TEXT][2] newTable] 

FROM

 lista_tabel

[

WHERE

 Wyrażenie] 

[

GROUP BY

 Wyrażenie [, ...]] 

[HAVING Wyrażenie] 
[{ UNION [

ALL

 | DISTINCT] | {MINUS [DISTINCT] | EXCEPT [DISTINCT] } | 

INTERSECT [DISTINCT] } selectStatement] 
[

ORDER BY

 orderExpression [, ...]] 

[LIMIT <limit> [OFFSET <offset>]];

Listing 9. 

Kod nawiązania połączenia z serwerem HSQLDB w języku JAVA

try{
   Class.forName

(

"org.hsqldb.jdbcDriver"

)

.newInstance

()

;

}catch 

(

Exception

 e

)

{

   e.printStackTrace

()

   

return


Connection conn = DriverManager.getConnection

(

"jdbc:hsqldb:hsql://url_

bazy_danych", "użytkownik", "hasło"

)

;

background image

18

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

19

www.lpmagazine.org

Dla początkujących

Relacyjna baza danych HSQLDB

lumny,  do  których  nie  wprowadzamy  da-
nych  muszą  mieć  dozwoloną  wartość 

NULL

Ponownie  za  przykład  posłuży  tabela  z  Li-
stingu 7:

sql> insert into klient(imie,nazwisko
,pesel)    values('Grzegorz','Madajcz
ak','65111501738');

W  powyższym  poleceniu  wprowadzono  dane 
do trzech kolumn z czterech, wyróżniając ich 
nazwy w nawiasie po nazwie tabeli.

Bardzo ciekawą właściwością oferowa-

ną  przez  bazę  danych  HSQLDB  jest  moż-
liwość  zapisu  w  bazie  danych  danych  bi-
narnych, poprzez strumień wchodzący. Ce-
cha  ta  realizowana  jest  przez  kolumnę  ty-
pu 

OTHER

  (lub 

OBJECT

),  która  jak  to  wyni-

ka z Tabeli 2, przechowuje dane będące od-
zwierciedleniem  klasy 

java.lang.Object

 

z  JAVA.  Dla  nie  wtajemniczonych  w  arka-
na tego języka dodam, że w JAVA obiektem 
może być każdy plik, niezależnie czy jest to 
plik  dźwiękowy,  obrazek,  czy  też  inny  do-
wolny plik.

Aby zobrazować, jak się dokonuje tej nie-

zbyt skomplikowanej sztuki, posłużę się przy-
kładem.  Najpierw  należy  utworzyć  tabelę  za-
wierającą  kolumnę  przechowującą  dane  ty-
pu 

OBJECT

:

sql> create table filetable(id int 
generated by default as identity(start 
with 0), nazwa_pliku varchar, plik 
object);

Następnie  należy  załadować  do  bufora  plik 
który chcemy przechowywać w bazie danych. 
Służy do tego polecenie wydane w trybie raw 
mode
 – 

\bl

, po którym podajemy ścieżkę do-

stępu do pliku. Polecenia te w przeciwieństwie 
do poleceń w języku SQL nie kończą się śred-
nikiem.

sql> \bl /tmp/obrazk.jpg

Kolejnym  krokiem  jest  wydanie  polecenia 

\bp

:

sql> \bp

Na sam koniec ładujemy plik do tabeli, zastę-
pując plik w polu kolumny znakiem zapytania:

sql> insert into filetable(nazwa_
pliku,plik) values('przykładowe 
zdjęcie', ?);

Odczyt takiego pliku z tabeli wymaga ponow-
nie użycia trybu raw. Najpierw jednak wyszu-
kujemy plik poleceniem 

SELECT

:

sql> select file from filetable where 
id=0;

W  wyniku  tego  polecenia  plik  zostanie  zała-
dowany do bufora. Teraz zostało zapisać go na 
dysku, stosując polecenie 

\bd 

wraz ze ścież-

ką do pliku

sql> \bd /tmp/plik.jpg

Odczyt danych z tabeli

Dane z tabel odczytuje się za pomocą polece-
nia 

SELECT

, którego ogólną składnię prezentu-

je Listing 8. Chcąc odczytać nazwiska wszyst-
kich klientów zapisanych w tabeli z Listingu 
7, wyrażenie przybierze następujący kształt:

sql> select nazwisko from klient;

Efektem  działania  powyższego  polecenia  bę-
dzie lista nazwisk. Można ją uporządkować al-
fabetycznie – służy do tego polecenie 

ORDER BY 

<nazwa_kolumny> [ASC | DESC]:

sql> select imię,nazwisko from klient 
order by nazwisko desc;

Efektem  działania  powyższego  polecenia 
będzie lista imion i nazwisk klientów, upo-

rządkowana alfabetycznie, malejąco wg na-
zwisk.

Najistotniejszą  możliwością  pobierania 

danych z tabeli jest możliwość ich warunko-
wego  wyszukiwania.  Służy  do  tego  polece-
nie 

WHERE

.

sql> select * from klient where 
nazwisko='Madajczak';

Powyższe polecenie zwróci listę danych klien-
tów o nazwisku Madajczak.

Skrypty SQL

Biblioteka hsqldb.jar daje nam również moż-
liwość tworzenia skryptów powłoki, które wy-
korzystywać  będą  wewnętrzne  polecenia  na-
pisane w języku SQL – zapytania do bazy da-
nych. Posługujemy się w tym celu znanym już 
nam  narzędziem  SQLTool  z  przełącznikiem 

--sql

,  po  którym,  następuje  zapytanie  w 

SQL. Zapytanie to musi być zapisane pomię-
dzy  dwoma  apostrofami  i  obowiązkowo  za-
kończone  średnikiem.  Dla  przykładu  posłuż-
my się jeszcze raz tabelą z Listingu 7.

$ java -jar hsqldb.jar --sql 'select 
* from klient;' urlid

Powyższe  polecenie  zwróci  nam  całą  zawar-
tość tabeli klient z bazy o identyfikatorze urlid. 
Aby to polecenie zadziałało, w pliku konfigu-
racyjnym sqltool.rc musi być prawidłowo zde-
finiowana baza danych. Można również posłu-
żyć się uwierzytelnianiem typu inlineRC. Wte-
dy  to  powyższe  polecenie  będzie  wyglądało 
nieco odmiennie:

$ java -jar hsqldb.jar --sql 'select 
* from klient;' --inlineRC URL=jdbc:
hsqldb:hsql://localhost/ścieżka/do/ba
zy,USER=użytkownik,PASSWORD=hasło

W  powyższym  poleceniu,  dla  jego  prawidło-
wego działania ważne jest, aby przełącznik 

sql

 

Tabela 3. 

Opcje zapisu pliku tabeli tekstowej

Opcja

Opis

Wartość domyślna

quoted

 Jeśli „

false

”, cudzysłów traktowany jako normalny znak (true lub false)

true

all_quoted

Jeśli „

true

”, dodaje podwójne cudzysłowy do wszystkich pól

false

encoding

Strona kodowa znaków

UTF-8

ignore_first

Jeśli „

true

”, ignorowana jest pierwsza linia (zawiera opisy nagłówków)

true

cache_scale

Przelicznik, do wylicznia liczby przechowywanych wierszy w cache (1 / 100 wierszy)

8

cache_size_scale

Przelicznik do obliczania średniego rozmiaru każdego wiersza w cache. 8 odpowiada 256 bitom na wiersz

8

fs

Separator pola danych

,

vs

Separator łańcucha znakowego (

VARCHAR

)

lvs

Separator długiego łańcucha znakowego (

LONGVARCHAR

)

background image

20

luty 2009

Dla początkujących

Relacyjna baza danych HSQLDB

znajdował się zaraz za poleceniem 

java  -jar 

hsqldb.jar

, a przed przełącznikiem 

inlineRC

.

HSQLDB w JAVA

Jak  wspomniałem  na  samym  początku  artyku-
łu, HSQLDB jest bazą danych, której silnik zo-
stał napisany w języku JAVA. Naturalne wyda-
je się więc zastosowanie tego silnika do wszyst-
kich aplikacji napisanych w tym języku. Utwo-
rzenie połączenia z bazą HSQLDB odbywa się 
za pomocą implementacji klasy 

java.sql.Con-

nection

  –  klasy 

org.hsqldb.jdbc.jdbcCon-

nection

.  Kod  nawiązania  połączenia  z  serwe-

rem prezentuje Listing 9. Dalsze postępowanie, 
po uzyskaniu połączenia z bazą, jest takie samo, 
jak w przypadku każdej innej bazy obsługiwanej 
przez JDBC. Tak na przykład wysłanie zapytania 
do, bazy, z którą uzyskano połączenie reprezen-
towane przez Obiekt 

Connection  conn

 (jak na 

Listingu 9) będzie wyglądało następująco:

java.sql.Statement st = 
conn.createStatement(); 
java.sql.ResultSet rs = 
st.executeQuery("select * from tabela_
1");

Uzyskawszy  obiekt 

ResultSet

  można  pobie-

rać na jego podstawie dane z zapytania:

while (rs.next()) { 
   String s = rs.getString("b");
}

Niemal na samym początku ego artykułu pisa-
łem, że możliwe jest uruchomienie serwera w 
trybie In-Process, co oznacza, że działa on ja-
ko część aplikacji działającej w obrębie tej sa-

mej JVM. Takie uruchomienie daje największą 
wydajność bazy danych, ponieważ omijane są 
potencjalne ograniczenia transmisji danych np. 
przez sieć. Uruchomienie bazy danych w trybie 
In-Process również odbywa się z wykorzysta-
niem klasy 

Connection

:

Connection c = DriverManager.getConne
ction("jdbc:hsqldb:file:testdb", "sa", 
"");

Dalej posługujemy się tak uzyskanym połącze-
niem z bazą, jak tym z Listingu 9.

Jak  widać  z  powyższych  przykładów,  baza 

danych z silnikiem HSQLDB jest niemalże ideal-
nym rozwiązaniem dla wszystkich, którzy progra-
mując w języku JAVA zmuszeni są do jakiegokol-
wiek zarządzania danymi. Olbrzymią zaletą bazy 
HSQLDB jest możliwość przechowywania w niej 
obiektów binarnych, takich jak np. pliki. Istnieje 
również  możliwość  korzystania  z  bazy  danych 
HSQDB, której pliki zawarte są w paczce *.jar 
aplikacji. Taka baza danych będzie jednak działa-
ła tylko w trybie do odczytu. W celu przygotowa-
nia takiej bazy, należy się przede wszystkim upew-
nić, że żadna z tabel nie jest typu 

CACHED

 lub 

TEXT

gdyż wymagają one dostępu do ich plików w try-
bie  odczytu  i  zapisu.  Bazie  takiej  należy  nadać 
atrybut tylko do odczytu, a następnie zamknąć.

sql> SET READONLY TRUE;
sql> SHUTDOWN;

Po wykonaniu powyższych czynności, w folde-
rze bazy danych należy odszukać jej pliki, a na-
stępnie  skopiować  do  folderu  aplikacji  pliki  z 
rozszerzeniem *.properties oraz *.scripts. Chcąc 
połączyć się z taką bazą w parametrach połącze-

nia  podajemy  następujący  URL:  jdbc:hsqldb:
res:/folder/baza
, w którym to podajemy nazwę 
folderu, w którym pliki bazy są zlokalizowane 
oraz nazwę (urlid) bazy danych. W adresie tym 
dodatek res mówi sterownikowi, że otwieramy 
bazę danych znajdującą się w pliku *.jar.

Podsumowanie

Przeprowadzone testy porównawcze dostępnych 
baz danych (wolnych, jak i komercyjnych) wyka-
zują, że HSQLDB przoduje wśród nich szybko-
ścią dostępu do przechowywanych danych. Jed-
nak od razu muszę dodać, że testy nie są miaro-
dajne,  gdyż  domyślnie  HSQLDB  przechowu-
je  tabele  w  całości  w  pamięci,  co  w  porówna-
niu do innych baz, przechowujących dane zapi-
sane na dysku, znacznie skraca czas dostępu do 
danych. Szybkość działania HSQLDB osiągnięta 
dzięki przechowywaniu tabel z danymi w pamię-
ci komputera równoważy poważną wadę aplika-
cji napisanych w JAVA, jaką jest pewna ocięża-
łość działania. Z drugiej zaś strony zmusza to pro-
gramistę, czy też użytkownika bazy do pamięta-
nia, że gromadzenie dużej ilości danych w pamię-
ci może doprowadzić do zmniejszenia szybkości 
działania całego systemu, ze względu na brakują-
cą pamięć fizyczną RAM. Pewnym rozwianiem 
tego problemu jest zastosowanie tabel typu 

CA-

CHED

 zamiast domyślnych typu 

MEMEORY

. Jednak 

w pierwszej sytuacji należy liczyć się ze zmniej-
szeniem się prędkości działania bazy danych, po-
przez  potencjalne  wydłużenie  czasu  dostępu  do 
gromadzonych danych.

Pomimo  powyższych,  nieznacznych  wad, 

warto  zainteresować  się  tym  projektem.  Baza 
HSQLDB stanowi bowiem doskonałe rozwiąza-
nie dla małych projektów, gdzie nie ma wymogu 
gromadzenia  danych  w  rozbudowanych  serwe-
rach bazodanowych. Istotne jest zwłaszcza to, że 
HSQLDB może działać z poziomu użytkownika.

Mam pełną świadomość, że artykuł ten nie 

wyczerpał tematyki związanej z posługiwaniem 
się bazą danych HSQLDB, zwłaszcza w odnie-
sieniu do języka SQL. Jednak informacje zawar-
te pozwolą początkującemu użytkownikowi na 
rozpoczęcie pracy z tym projektem. W celu zdo-
bycia  większej  wiedzy  odsyłam  zainteresowa-
nych do dobrze napisanej dokumentacji bazy da-
nych zawartej w pakiecie dystrybucyjnym, czy 
też na stronie internetowej projektu. 

Rysunek 1. 

Program DatabaseManager

Autor artykułu, z wykształcenia lekarz wete-
rynarii, mikrobiolog, pasjonuje się Linuksem 
od ponad pięciu lat. Jego ulubione dystrybu-
cje to Gentoo i Slackware.
Kontakt z autorem: madajczak@gmail.com

O autorze