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
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
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
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
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
Plik z chomika:
jacek_040
Inne pliki z tego folderu:
SQL.doc
(281 KB)
plsql_fsql.ppt
(62 KB)
SQL10G.pdf
(780 KB)
sql2.pdf
(224 KB)
plsql.pdf
(580 KB)
Inne foldery tego chomika:
5_VoIP
Asterisk
eng
eng opisy urzadzen
Fax & Telephony
Zgłoś jeśli
naruszono regulamin