JDBC_java.pdf

(388 KB) Pobierz
JDBC_java
ODBC
Obsługa baz danych przy
u Ŝ yciu JDBC
• ODBC (Open DataBase Connectivity - otwarte
łącze baz danych) - interfejs programowania baz
danych opracowany w firmie Microsoft, który
pozwala wszystkim aplikacjom Windows
korzystającym z baz danych za pośrednictwem sieci
posługiwać się tym samym zbiorem wywołań
• W skład ODBC wchodzą wywołania wbudowane
w aplikacje oraz sterowniki ODBC
Beata Pańczyk - Java (Wykład 11)
2
JDBC
Programowanie bazodanowe
w Javie
• JDBC (Java DataBase Connectivity) - łącze do baz
danych w języku Java
• interfejs programowania opracowany w 1996 r. przez
Sun Microsystems, umoŜliwiający niezaleŜnym od
platformy aplikacjom napisanym w języku Java
porozumiewać się z bazami danych za pomocą
języka SQL
• interfejs ten jest odpowiednikiem zaprojektowanego
przez Microsoft łącza ODBC
• aplikacje bazodanowe programowane w tradycyjnych
językach - zaleŜne od architektury konkretnej bazy danych
• w Javie - niezaleŜność dzięki wprowadzeniu interfejsu
JDBC, który
– operuje na poziomie języka SQL
– ukrywa przed programistą specyficzne własności i
ustawienia bazy danych
• program napisany w Javie – działa z dowolną bazą danych
– obsługującą ten sam standard SQL-a
– wspierającą technologię JDBC
• klasy i interfejsy JDBC – dostępne w pakiecie java.sql
3
4
Praca z baz ą danych poprzez
JDBC
Sterowniki
• załadowanie sterownika JDBC
• zdefiniowanie adresu URL połączenia
• nawiązanie połączenia
• utworzenie obiektu Statement
• wykonanie zapytania lub aktualizacja danych
• przetworzenie wyników
• zamknięcie połączenia
• sterownik JDBC - zestaw klas implementujących
interfejsy JDBC dla określonej bazy danych
• zazwyczaj pisane przez producentów baz danych
• z jednej strony przyjmują połączenia JDBC
i instrukcje, a z drugiej wysyłają wywołania do
bazy danych
5
6
1
297326543.030.png 297326543.031.png 297326543.032.png 297326543.033.png 297326543.001.png 297326543.002.png
Kategorie sterowników
Kategorie sterowników
1. JDBC-ODBC bridge driver
(technologia pomostowa między JDBC a ODBC
Microsoftu)
2. Native API partly–Java driver
(biblioteki napisane w innych językach)
3. JDBC-Net pure Java driver
(standardowe interfejsy sieciowe)
4. Native–protocol pure Java driver
(protokoły sieciowe wbudowane w maszyny
bazodanowe)
• Sterowniki typu 1 i 2
– często rozpowszechniane za darmo (np. w SDK)
– wymagają instalacji dodatkowego oprogramowania po
stronie klienta
• Sterowniki typu 3 i 4
– zwykle odpłatne
– nie wymagają Ŝadnych dodatkowych instalacji
• Aktualna lista dostępnych na rynku sterowników - na
stronie java.sun.com
7
8
Klasa DriverManager
Droga od kodu Javy do bazy danych
• w celu nawiązania połączenia z bazą danych środowisko
wykonawcze Javy musi załadować odpowiedni sterownik
dla danej bazy
• za ładowanie i usuwanie z pamięci sterowników
odpowiedzialna jest klasa DriverManager ( zarządca
sterowników), która:
– dynamicznie zarządza obiektami sterowników
zachowując kontekst zabezpieczeń kaŜdego sterownika
– kontekst zabezpieczeń definiuje środowisko, w jakim
aplikacja jest uruchamiana
– porównuje kontekst zabezpieczeń sterownika
z kontekstem programu (sprawdza czy są takie same)
Program Java
DriverManager
utrzymuje
struktur ę danych
zawieraj ą c ą
obiekty Driver
oraz informacje
o nich
Mened Ŝ er sterowników
Sterownik
JDBC
Baza
danych
Wewn ę trzny sterownik
Baza danych
9
10
Ładowanie sterownika
Rejestracja sterownika
• wywołanie metody Class.forName()
• argument metody (typu String ) określa sterownik, np. dla
technologii pomostowej JDBC-ODBC jest to:
"sun.jdbc.odbc.JdbcOdbcDriver"
• załadowanie sterownika – aby zapewnić elastyczność kodu
naleŜy unikać podawania na stałe nazwy uŜywanej klasy
sterownika, np.
try{
Class,forName("connect.microsoft.MicrosoftDriver");
Class.forName("oracle.jdbc.driver.OracleDriver");
Class.forName("com.sybase.jdbc.SybDriver");
}
catch (ClassNotFoundException exp)
{System.out.println("Błądładowaniasterownika:"+exp);}
Przy pomocy wiersza poleceń:
• Ŝeby wykorzystać sterownik JDBC trzeba go załadować
• naleŜy określić sterownik do załadowania przy uŜyciu
zmiennej systemowej jdbc.drivers
• pomost JDBC-ODBC załaduje polecenie:
java –Djdbc.drivers=sun.jdbc.JdbcOdbcDriver nazw_apl
W programach (mniej elastyczne):
• uŜytkownik końcowy nie moŜe w prosty sposób zmienić
wersji bazy danych
• łatwiejsze w codziennym uŜytkowaniu
11
12
2
297326543.003.png 297326543.004.png 297326543.005.png 297326543.006.png 297326543.007.png 297326543.008.png 297326543.009.png
Okre ś lenie adresu URL poł ą czenia
Nawi ą zanie poł ą czenia - klasa
Connection
• adresy URL odwołujące się do baz danych wykorzystują protokół
jdbc: i zawierają informacje o nazwie komputera na którym działa
serwer bazy danych, numer uŜywanego portu oraz nazwę bazy
danych
• format zapisu adresu URL – podany w dokumentacji dostarczonej
z konkretnym sterownikiem JDBC
• np.:
Stringhost="dbhost.firma.com.pl";
Stringdb="nazwaBazy";
intport=1234;
StringoracleURL ="jdbc:oracle:thin:@"+host +":"+port+":"+db;
StringsybaseURL ="jdbc:sybase:Tds:"+host +":"+port+":"+
"?SERVICENAME"+db;
StringmsaccessURL ="jdbc:odbc"+db;
• po zarejestrowaniu sterownika program łączy się za jego pomocą
z bazą danych
• nawiązanie połączenia realizuje metoda getConnection klasy
DriverManager:
DriverManager.getConnection("url","user","pass");
• wywołanie metody moŜe zgłosić wyjątek SQLException
• metoda zwraca obiekt klasy Connection
• np.:
String user="beatap";
String haslo="tajne";
Connection polaczenie = DriverManager.getConnection(
oracleURL, user, haslo);
13
14
Interfejs Connection
• prepareStatement – tworzy prekompilowane zapytania do
przesłania do bazy danych
• prepareCall – metoda odwołuje się do procedur
zachowanych, przechowywanych na serwerze BD
• rollback,commit – metody do obsługi transakcji; commit -
zatwierdza zmiany, rollback - odrzuca wszystkie zmiany
dokonane od ostatniego wywołania commit
• setAutoSubmit() - wyłącza opcję automatycznego
dokonywania zmian
• close – zamyka otwarte połączenie z bazą danych
• isClosed – sprawdza czy nie skończył się okres waŜności
połączenia lub czy nie zostało ono jawnie zamknięte
• getMetaData – zwraca obiekt DataBaseMetaData
Informacje o bazie danych
• Metody obiektu DatabaseMetaData :
– getDatabaseProductName – nazwa BD
– getDatabaseProductversion – numer wersji BD
– getDriverName – nazwa sterownika JDBC
– getDriverVersion – numer versji sterownika
• Np.:
DatabaseMetaDatadbmeta = polaczenie.getMetaData();
StringnazwaBazy = dbmeta.getDatabaseProductName();
System.out.println("Bazadanych:"+nazwaBazy );
Stringnumerwersji = dbmeta.getDatabaseProductversion();
System.out.println("Numerwersjibazy:"+numerwersji);
15
16
Utworzenie polecenia - obiekt
Statement
Wykonanie zapytania
• do przesyłania zapytań i poleceń do BD są
wykorzystywane obiekty Statement
• metoda createStatement() utworzonego obiektu
klasy Connection zwraca obiekt Statement
• np.
Statementpolecenie=polaczenie.createStatement();
• większość sterowników JDBC pozwala na
jednoczesne tworzenie i uŜywanie większej liczby
obiektów Statement korzystających z tego samego
połączenia z BD
• dysponując obiektem Statement moŜna juŜ
przesłać zapytanie SQL
• executeQuery – przesyła zapytanie i w wyniku
zwraca obiekt ResultSet przechowujący wiersze
tabeli wyników
• np.
Stringzapytanie="SELECT*FROM books";
ResultSet wynik=polecenie.executeQuery(zapytanie);
17
18
3
297326543.010.png 297326543.011.png 297326543.012.png 297326543.013.png 297326543.014.png 297326543.015.png
Interfejs Statement – przesyłanie i
wykonywanie dowolnych polece ń SQL
• executeQuery – wykonuje polecenie SQL i zwraca dane w postaci
obiektu ResultSet (obiekt moŜe być pusty ale metoda nie zwraca null)
• executeUpdate – realizuje polecenia SQL UPDATE, INSERT,
DELETE i zwraca liczbę rekordów objętych działaniem
poszczególnych poleceń (równieŜ 0); obsługuje takŜe polecenia
CREATE TABLE, DROP TABLE, ALTER TABLE
• executeBatch – wykonuje grupę poleceń SQL jako jedną całość i
zwraca tablicę wierszy objętych działaniem poszczególnych poleceń;
dodawanie poleceń do grupy – metoda addBatch
• setQueryTimeout – określa czas przez jaki sterownik będzie czekał na
odebranie wyników zanim zgłosi wyjątek SQLException
• getMaxRows,setMaxRows – max liczba wierszy jaką moŜe zawierać
obiekt ResultSet (domyślnie 0 – nie ograniczona)
Obiekty Statement i ResultSet
program Java
JDBC & Driver
baza danych
Statement(SQL)
czas
ResultSet
Baza
danych
Statement(SQL)
ResultSet
19
20
Interfejs ResultSet -
przetworzenie wyników
Przykład – wy ś wietlenie
wyników
Stringhost="dbhost.firma.com.pl";Stringdb="nazwaBazy";int port=1234;
StringURL="jdbc:odbc"+db ;
Stringuser="beatap"; Stringhaslo="tajne";
Connectionpolaczenie = DriverManager.getConnection(URL, user, haslo);
Statement polecenie=polaczenie.createStatement();
String zapytanie="SELECT*FROMznajomi";
ResultSet wynik=polecenie.executeQuery(zapytanie);
while (wynik.next())
{ int id=wynik.getInt("id");
String n=wynik.getString("nazwisko");
String i=wynik.getString("imie");
String e=wynik.getString("email");
System.out.println(id+""+n+""+i+""+e); }
polaczenie.close();
• metoda next() zwraca kolejny wiersz lub false jeśli
osiągnięto koniec zbioru wynikowego
• getXxx – metody zwracające wartości niemal wszystkich
podstawowych typów danych (np. getString(), getInt() )
UWAGA! Kolumny zbioru wynikowego są indeksowane
(zgodnie z konwencją przyjętą
w SQL) od 1 a nie od 0.
• odczytując dane przechowywane w obiekcie ResultSet,
lepiej jest uŜywać nazw kolumn (nie ich indeksów) – w
przypadku zmiany struktury tabeli niebezpieczeństwo
awarii kodu obsługującego wyniki jest mniejsze
21
22
Interfejs ResultSet
Interfejs ResultSetMetaData
• next(), previous()
• relative(int) – przesuwa kursor o podaną liczbę wierszy do
przodu lub do tyłu (wartość ujemna)
• absolute(int) – przesuwa kursor do wiersza o wskazanym
numerze
• getXxx – zwraca wartość odczytaną z wiersza o podanej
nazwie lub indeksie
• wasNull – sprawdza czy wartość odczytana przez ostatnie
wywołanie metody getXxx jest Null
• findColumn – zwraca indeks kolumny o podanej nazwie
• getRow – zwraca numer bieŜącego wiersza (numerowane
od 1)
• getMetaData – zwraca obiekt typu ResultSetMetaData
opisujący zawartość ResultSet
• getColumnCount
• getColumnName(int)
• getColumnType – zwraca wartość int do
porównania ze stałymi klasy java.sql.Types
• isReadOnly – czy wskazana kolumna tylko do
odczytu
• isSearchable – czy wskazana kolumna moŜe być
zastosowana w klauzuli WHERE
• isNullable - czy wskazana kolumna moŜe
zawierać NULL
23
24
4
297326543.016.png 297326543.017.png 297326543.018.png 297326543.019.png 297326543.020.png 297326543.021.png 297326543.022.png 297326543.023.png
Zamkni ę cie poł ą czenia
Instalacja i konfiguracja
serwera MySQL
• polaczenie.close();
• Zamknięcie połączenia powoduje równieŜ zamknięcie
uŜywających go obiektów Statement i ResultSet
• JeŜeli planowane jest przeprowadzenie innych operacji na
BD – nie naleŜy zamykać połączenia przed ich
wykonaniem (koszt otwarcia nowego połączenia jest dość
wysoki)
• W praktyce stosowanie juŜ otwartych połączeń jest bardzo
waŜnym aspektem optymalizacji korzystania z baz danych
• API JDBC – definiuje specjalny interfejs
ConnectionPoolDataSource do korzystania z pul
połączeń
• pobranie MySQL ze strony
http://dev.mysql.com/downloads/ i zainstalowanie
jako usługi systemowej (w Windows) –
sczególowe informacje na stronie
http://dev.mysql.com/doc/
• utworzenie bazy danych
• utworzenie uŜytkownika
• instalacja sterownika JDBC
25
26
Instalacja sterownika JDBC
Sterownik MySQL Connector/J
• najczęściej stosowane sterowniki do połączenia
z MySQL (dostępne w plikach JAR):
MySQL Connector/J (zalecany przez twórców MySQL)
Caucho Resin
• Ŝaden z tych sterowników nie jest w pełni zgodny ze
specyfikacją JDBC 2.0 ani ze standardem ANSI SQL-92
• podczas tworzenia aplikacji w zmiennej środowiskowej
CLASSPATH naleŜy podać ścieŜkę dostępu do pliku JAR
sterownika
• podczas wdraŜania aplikacji – plik sterownika naleŜy
umieścić (dla serwera Tomcat) w folderze WEB-INF/lib lub
we wspólnym folderze kat_instalacyjny/common/lib (jeśli na
serwerze działa wiele aplikacji WWW korzystających z bd)
• do pobrania ze strony:
http://www.mysql.com/products/connectorj/
• umieszczony w pliku:
mysqlconnectorjava3.1.14\mysqlconnectorjava
3.1.14bin.jar
• klasa sterownika:
com.mysql.jdbc.Driver
• URL uŜywany do połączenia z bazą danych:
jdbc:mysql://komputer:3306//NazwaBazy
27
28
Sterownik Caucho Resin
Przykład 1 – wy ś wietlanie
danych z bazy MYSQL
import java.sql.*;
publicclasstestBD {
• do pobrania ze strony:
http://www.caucho.com/projects/jdbcmysql/index.xtp
• umieszczony w pliku:
caucho-jdbc-2.1.0 .jar
• klasa sterownika:
com.caucho.jdbc.mysql.Driver
• URL uŜywany do połączenia z bazą danych:
jdbc:mysqlcaucho://komputer:3306//NazwaBazy
• wg. danych firmy Caucho sterownik jest 50%
szybszy od sterownika MySQLConnector/J
publicstaticvoidmain(String[] args)
throwsSQLException, ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
Connectionpolacz =
DriverManager.getConnection("jdbc:mysql://localhost:3306/
dane","root","");
Statement zapytanie= polacz.createStatement();
ResultSet w=zapytanie.executeQuery
("SELECT*FROM news");
29
30
5
297326543.024.png 297326543.025.png 297326543.026.png 297326543.027.png 297326543.028.png 297326543.029.png
Zgłoś jeśli naruszono regulamin