JDBC.pdf

(208 KB) Pobierz
JDBC - Obsługa baz danych w języku Java
JDBC – opracował Marcin Budziński
Bielsko-Biała, 06-02-2006
1 MUZ, grupa G
JDBC - Obsługa baz danych w języku Java
JDBC (Java Database Conectiviti) jest interfejsem pozwalającym połączyć
aplikację Javy z zewnętrzną bazą danych za pomocą odpowiednich sterowników.
Dużą zaletą JDBC jest łatwość przejścia na inny system bazodanowy, co najczęściej
odbywa się bez zmian w kodzie aplikacji lub ze znikomą ich ilością. Polega to
zazwyczaj na zmianie sterownika JDBC na taki, który współpracuje z systemem
bazodanowym do którego chcemy mieć dostęp w aplikacji.
Samo JDBC jest olbrzymim krokiem naprzód w porównaniu z innymi technologiami
dostępu do baz danych. Mimo to, bardzo często wykorzystuje się ją jako bazę do
tworzenia jeszcze bardziej przyjaznych interfejsów przeznaczonych dla
konkretnych zastosowań. Taka, "zewnętrzna" a warstwa komunikuje się z
użytkownikiem w mniej skomplikowanym języku, tłumaczy zapytania na postać
zrozumiałą dla JDBC, a potem prezentuje otrzymane wyniki.
Typowy scenariusz korzystania z JDBC opiera się na trzech krokach.
1. Nawiązanie połączenia z bazą danych
2. Wysyłanie zapytania, ew. polecenia zmiany, dodania lub usunięcia informacji
z bazy.
3. Opracowanie wyników.
JDBC może stanowić podstawę do tworzenia interfejsów wyższego rzędu. Znane są
prace nad stworzeniem interfejsu mieszającego elementy SQL i Javy (np.
umieszczenie zmiennych Javy w SQL). Określony preprocesor wbudowanego w Javie
języka SQL tłumaczyłby stworzone rozkazy na rozkazy niskiego poziomu zgodnie z
JDBC. Inna wersja interfejsu wysokiego rzędu zakłada odwzorowanie tabel na klasy.
Każdy rekord staje się wówczas obiektem danej klasy. Tworzenie interfejsów
wyższego poziomu jest również istotne z punktu widzenia planowanego modelu
dostępu do bazy danych. Popularna dwu-warstwowa metoda dostępu (twotier) daje
bezpośredni dostęp do bazy danych (aplikacja/applet - baza danych) .
Oznacza to, że musimy znać format danych bazy by móc pobrać lub zmienić
informacje. W przypadku bardziej uniwersalnym dodaje się trzecią warstwę w
modelu dostępu do bazy (aplikacja/applet (GUI) - serwer - baza danych). W modelu
trzy punktowym stosuje się interfejs wyższego poziomu po to aby struktura dostępu
do bazy danych stanowiła pewną abstrakcję, co umożliwia tworzenie różnych
klientów bez potrzeby zagłębiania się w szczegóły protokołów wymiany danych z
bazą. Tak stworzona konstrukcja dostępu do bazy danych uwalnia klienta od
znajomości organizacji bazy danych, co za tym idzie możliwe są prawie dowolne
modyfikacje ustawień bazy danych np. kilka rozproszonych baz zamiast jednej.
Istnieją inne interfejsy dostępu do baz danych jak na przykład popularny Open
DataBase Connectivity firmy Microsoft.
Jednak korzystanie z ODBC przez programy Javy nie stanowi dobrego rozwiązania
ponieważ:
1. występuje różnica języków programowania - ODBC jest stworzony w C, a co
za tym idzie konieczna konwersja porzuca cechy języka Java, a często staje
się nie realizowalna ze względu na inne koncepcje np. problem wskaźników
Strona 1
JDBC – opracował Marcin Budziński
Bielsko-Biała, 06-02-2006
1 MUZ, grupa G
2. korzystanie z ODBC jest znacznie trudniejsze, a nauka pochłania zbyt dużo
czasu,
3. praca z ODBC wymaga ręcznych ustawień na wszystkich platformach
klientów, podczas gdy korzystanie z JDBC umożliwia automatyczne
wykorzystanie kodu JDBC na wszystkich platformach Javy począwszy od
komputerów sieciowych do superkomputerów.
W okresie wprowadzania języka Java oraz sterowników JDBC stworzono (JavaSoft)
mosty JDBC-ODBC, będące rozwiązaniem dla tych, którzy korzystają z baz danych
nie posiadających innych, "czystych" sterowników JDBC
Typy sterowników JDBC
Typ I – Most JDBC-ODBC
– umożliwia połączenie z każdą bazą danych, dla której istnieje
sterownik ODBC
Typ II – Sterownik napisany częściowo w Javie, wykorzystujący biblioteki klienta
bazy danych
– efektywne rozwiązanie
– wymaga preinstalowanego oprogramowania klienta bazy danych
Typ III – Uniwersalny sterownik w czystej Javie, z obsługą specyficznych baz
danych w warstwie pośredniej
– najbardziej elastyczna architektura
Typ IV – Sterownik w czystej Javie, komunikujący się bezpośrednio z serwerem
bazy danych
– nie wymaga bibliotek klienta bazy danych
– odpowiedni dla dostępu do bazy danych z apletów
Sterowniki JDBC Oracle
JDBC Thin (typ IV)
– w 100% napisany w czystej Javie
– może być pobrany przez sieć wraz z apletem Java
JDBC OCI (typ II)
– wykonuje wywołania OCI do “fabrycznego” sterownika,
preinstalowanego po stronie klienta
– wykorzystywany wyłącznie w aplikacjach języka Java
Server-side internal driver
– wykorzystywany przez aplikacje Java uruchamiane wewnątrz serwera
Oracle (np. Java Stored Procedures)
Server-side Thin driver
– wykorzystywany przez aplikacje Java uruchamiane wewnątrz serwera
Oracle do nawiązywania połączeń z innymi serwerami
Strona 2
JDBC – opracował Marcin Budziński
Bielsko-Biała, 06-02-2006
1 MUZ, grupa G
Architektura JDBC
1. Utworzenie połączenia z bazą danych
Stworzenie połączenia z bazą danych polega utworzeniu obiektu Connection. W tym
celu stosuje się jedną ze statycznych metod DriverManager.getConnection(). Każda
metoda getConnection() zawiera jako argument adres URL dostępu do bazy danych.
Adres ten definiowany jest poprzez trzy człony:
jdbc:<subprotocol>:<subname>.
Pierwszy element adresu jest stały i nosi nazwę jdbc. Określa on typ protokołu.
Kolejny element stanowi nazwa sterownika lub mechanizmu połączenia do bazy
danych. Przykładowo mogą to być nazwy: msql - sterownik dla bazy mSQL, odbc -
mechanizm dla sterowników typu ODBC. Ostatna część adresu zawiera opis
konieczny do zlokalizowania bazy danych. Element ten zależy od sterownika czy
mechanizmu połączeń i może zawierać dodatkowe rozszerzenia zgodnie z
koncepcją przyjętą przez twórcę sterownika. Standardowo omawiana część adresu
wygląda następująco:
/ //hostname:port/subsubname.
Przykładowe pełne adresy url mogą wyglądać następująco:
jdbc:odbc:biomed,jdbc:msql://athens.imaginary.com:4333/db_test
Jedna z metod getConnection() umożliwia dodatkowo przesłanie nazwy
użytkownika i hasła dostępu do bazy danych:
Strona 3
511609797.001.png
JDBC – opracował Marcin Budziński
Bielsko-Biała, 06-02-2006
1 MUZ, grupa G
getConnection(String u url,String u user,String p password).
Połączenie byłoby niemożliwe bez istnienia sterowników. Zarządzaniem
sterownikami, które zarejestrowały się za pomocą metody
DriverManager.registerDriver() zajmuje się klasa DriverManager (np. metody
getDriver(), getDrivers()). Klasy sterowników powinny zawierać kod statyczny
(stanic{}), który w wyniku ładowania tych klas stwarza obiekt danej klasy
automatycznie rejestrującej się za pomocą metody DriverManager.registerDriver().
Ładowanie sterownika (a więc jego rejestracja) odbywa się najczęściej poprzez
wykorzystanie metody Class.forName(). Ta metoda ładowania sterownika nie zależy
od ustawień zewnętrznych (konfiguracji sterowników) i ma charakter dynamiczny.
Przykładowe ładowanie sterownika o nazwie "oracle.db.Driver" wykonane jest
poprzez zastosowanie metody Class.forName("oracle.db.Driver"). Fragment kodu
obrazujący etap łączenia się z bazą danych ukazano poniżej:
String url = "jdbc:odbc:kurs";
//przykładowa nazwa drivera - slowo "kurs" jest nazwą zasobów
//definiowaną w ODBC dla bazy np. pliku tekstowego
String username = ""; //brak parametrów dostępu do pliku
tekstowego
String password = "";
try {
}
Connection c = null;
try {
c = DriverManager.getConnection (url, username, password);
//połączenie
} catch (Exception e) {
System.err.println("Wystapil problem z polaczeniem do
"+url);
}
Powyższy przykład zakłada rejestrację w ODBC bazy tekstowej o dostępie "kurs" i
wskazanie odpowiedniego katalogu.
Poniżej przedstawiono zasady tworzenia połączenia i wykorzystywania kodu
zdalnego (sterowniki) dla bazy danych „qabase” pracującej na serwerze Msql:
Class.forName("com.imaginary.sql.msql.MsqlDriver");
}catch (Exception e){
System.out.println("Błąd wczytywania sterowników");
return;
}
String URL = "jdbc:msql://biomed.eti.pg.gda.pl:1114/qabase";
String username ="msql";
Strona 4
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//ładowanie sterownika - most JDBC-ODBC
} catch (Exception e) {
System.out.println("Blad ladowania sterownika
JDBC/ODBC.");
return;
try{
JDBC – opracował Marcin Budziński
Bielsko-Biała, 06-02-2006
1 MUZ, grupa G
con=DriverManager.getConnection(URL,username,password);
s=con.createStatement();
}catch (Exception e) {
System.err.println("Błąd połączenia z "+URL);
}
W przypadku apletu sterowniki (pakiet kodu) musi być zainstalowany na serwerze
WWW tam, skąd pochodzi aplet.
2. Wysłanie polecenia SQL
W celu wysłania polecenia SQL należy stworzyć obiekt Statement. Obiekt ten
stanowi kontener dla wykonywanych poleceń SQL. Wykorzystywane są dodatkowo
dwa kontenery: PreparedStatement oraz CallableStatement. Obiekt Statement jest
wykorzystywany do wysyłania prostych poleceń SQL nie zawierających parametrów,
obiekt PreparedStatement używany jest do wykonywania prekompilowanych
(przygotowanych - prepared) poleceń SQL zawierających jedno lub więcej pól
parametrów (oznaczanych znakiem "?"; tzw. parametry IN), natomiast obiekt
CallableStatement jest wykorzystywany do stworzenia odwołania (call) do
przechowywanych w bazie danych procedur. W celu stworzenia obiektu dla
opisanych wyżej interfejsów wykorzystuje się trzy odpowiednie metody interfejsu
Connection: createStatement() - dla interfejsu Statement, prepareStatement() –
dla interfejsu PreparedStatement oraz prepareCall() dla interfejsu
CallableStatement.
Przykładowy fragment kodu tworzący obiekt wyrażenia Statement może wyglądać
następująco:
c=DriverManager.getConnection(url,username,password);
//połączenie
Statements =c.createStatement();
//tworzymy obiekt wyrażenia
} catch(Exceptionee){
System.err.println("Wystąpił problem z polaczeniem do"+url);
}
Posiadając obiekt Statement można wykorzystać trzy podstawowe metody
umożliwiające wykonanie polecenia SQL. Pierwsza z metod executeQuery() jest
używana do wykonywania poleceń, których efekt daje pojedynczy zbiór rezultatów
ResultSet np. wyrażenie SELECT - wybierz. Drugą metodę executeUpdate()
wykorzystuje się przy wykonywaniu poleceń INSERT, UPDATE oraz DELETE a także
wyrażeń typu SQL DDL (Data Definition Language - język definicji danych) jak
CREATE TABLE i DROP TABLE. Efekt działania pierwszych trzech poleceń daje
modyfikację jednej lub więcej kolumn w zero i więcej wierszach tabeli. Zwracana
Strona 5
String password="";
s=null;
con=null;
try{
Connection c=null;
try{
Zgłoś jeśli naruszono regulamin