ODBC
" ODBC (Open DataBase Connectivity - otwarte
Obsługa baz danych przy
łącze baz danych) - interfejs programowania baz
danych opracowany w firmie Microsoft, który
u\yciu JDBC
pozwala wszystkim aplikacjom Windows
korzystającym z baz danych za pośrednictwem sieci
Beata Pańczyk - Java (Wykład 9)
posługiwać się tym samym zbiorem wywołań
" W skład ODBC wchodzą wywołania wbudowane
w aplikacje oraz sterowniki ODBC
2
Programowanie bazodanowe
JDBC
w Javie
" aplikacje bazodanowe programowane w tradycyjnych
językach - zale\ne od architektury konkretnej bazy danych
" JDBC (Java DataBase Connectivity) - łącze do baz
" w Javie - niezale\ność dzięki wprowadzeniu interfejsu
danych w języku Java
JDBC, który
" interfejs programowania opracowany w 1996 r. przez
operuje na poziomie języka SQL
Sun Microsystems, umo\liwiający niezale\nym od
ukrywa przed programistą specyficzne własności i
platformy aplikacjom napisanym w języku Java
ustawienia bazy danych
porozumiewać się z bazami danych za pomocą
" program napisany w Javie działa z dowolną bazą danych
języka SQL
obsługującą ten sam standard SQL-a
" interfejs ten jest odpowiednikiem zaprojektowanego
wspierającą technologię JDBC
przez Microsoft łącza ODBC
" klasy i interfejsy JDBC dostępne w pakiecie java.sql
3 4
Praca z bazą danych poprzez
JDBC Sterowniki
" załadowanie sterownika JDBC " sterownik JDBC - zestaw klas implementujących
interfejsy JDBC dla określonej bazy danych
" zdefiniowanie adresu URL połączenia
" zazwyczaj pisane przez producentów baz danych
" nawiązanie połączenia
" z jednej strony przyjmują połączenia JDBC
" utworzenie obiektu Statement
i instrukcje, a z drugiej wysyłają wywołania do
" wykonanie zapytania lub aktualizacja danych
bazy danych
" przetworzenie wyników
" zamknięcie połączenia
5 6
1
Kategorie sterowników Kategorie sterowników
" Sterowniki typu 1 i 2
1. JDBC-ODBC bridge driver
często rozpowszechniane za darmo (np. w SDK)
(technologia pomostowa między JDBC a ODBC
wymagają instalacji dodatkowego oprogramowania po
Microsoftu)
stronie klienta
2. Native API partly Java driver
" Sterowniki typu 3 i 4
(biblioteki napisane w innych językach)
zwykle odpłatne
3. JDBC-Net pure Java driver
nie wymagają \adnych dodatkowych instalacji
(standardowe interfejsy sieciowe)
" Aktualna lista dostępnych na rynku sterowników - na
4. Native protocol pure Java driver
stronie java.sun.com
(protokoły sieciowe wbudowane w maszyny
bazodanowe)
7 8
Klasa DriverManager Droga od kodu Javy do bazy danych
" w celu nawiązania połączenia z bazą danych środowisko
Program Java
wykonawcze Javy musi załadować odpowiedni sterownik
DriverManager
dla danej bazy
utrzymuje
" za ładowanie i usuwanie z pamięci sterowników
strukturę danych
Mened\er sterowników
odpowiedzialna jest klasa DriverManager (zarządca
JDBC
zawierającą
sterowników), która: Sterownik
obiekty Driver
dynamicznie zarządza obiektami sterowników
oraz informacje
zachowując kontekst zabezpieczeń ka\dego sterownika o nich
Baza
Wewnętrzny sterownik
kontekst zabezpieczeń definiuje środowisko, w jakim
danych
aplikacja jest uruchamiana
porównuje kontekst zabezpieczeń sterownika
z kontekstem programu (sprawdza czy są takie same)
Baza danych
9 10
Rejestracja sterownika
Aadowanie sterownika
" wywołanie metody Class.forName()
Przy pomocy wiersza poleceń: " argument metody (typu String) określa sterownik, np. dla
technologii pomostowej JDBC-ODBC jest to:
" \eby wykorzystać sterownik JDBC trzeba go załadować
"sun.jdbc.odbc.JdbcOdbcDriver"
" nale\y określić sterownik do załadowania przy u\yciu
" załadowanie sterownika aby zapewnić elastyczność kodu
nale\y unikać podawania na stałe nazwy u\ywanej klasy
zmiennej systemowej jdbc.drivers
sterownika, np.
" pomost JDBC-ODBC załaduje polecenie:
try {
java Djdbc.drivers=sun.jdbc.JdbcOdbcDriver nazw_apl
Class,forName("connect.microsoft.MicrosoftDriver");
Class.forName("oracle.jdbc.driver.OracleDriver");
W programach (mniej elastyczne):
Class.forName("com.sybase.jdbc.SybDriver");
" u\ytkownik końcowy nie mo\e w prosty sposób zmienić
}
wersji bazy danych
catch (ClassNotFoundException exp)
" łatwiejsze w codziennym u\ytkowaniu
{ System.out.println("Błąd ładowania sterownika: "+exp);}
11 12
2
Nawiązanie połączenia - klasa
Określenie adresu URL połączenia
Connection
" adresy URL odwołujące się do baz danych wykorzystują protokół
jdbc: i zawierają informacje o nazwie komputera na którym działa
" po zarejestrowaniu sterownika program łączy się za jego pomocą
serwer bazy danych, numer u\ywanego portu oraz nazwę bazy
z bazą danych
danych
" nawiązanie połączenia realizuje metoda getConnection klasy
" format zapisu adresu URL podany w dokumentacji dostarczonej
DriverManager:
z konkretnym sterownikiem JDBC
DriverManager.getConnection("url","user","pass");
" np.:
" wywołanie metody mo\e zgłosić wyjątek SQLException
String host="dbhost.firma.com.pl";
" metoda zwraca obiekt klasy Connection
String db="nazwaBazy";
int port=1234; " np.:
String user="beatap";
String oracleURL = "jdbc:oracle:thin:@" + host + ":" + port + ":" + db;
String sybaseURL = "jdbc:sybase:Tds:"+ host + ":" + port + ":" + String haslo="tajne";
"?SERVICENAME" +db;
Connection polaczenie = DriverManager.getConnection(
String msaccessURL = "jdbc:odbc" +db ;
oracleURL, user, haslo);
13 14
Informacje o bazie danych
Interfejs Connection
" prepareStatement tworzy prekompilowane zapytania do " Metody obiektu DatabaseMetaData:
przesłania do bazy danych
getDatabaseProductName nazwa BD
" prepareCall metoda odwołuje się do procedur
getDatabaseProductversion numer wersji BD
zachowanych, przechowywanych na serwerze BD
" rollback, commit metody do obsługi transakcji; commit -
getDriverName nazwa sterownika JDBC
zatwierdza zmiany, rollback - odrzuca wszystkie zmiany
getDriverVersion numer versji sterownika
dokonane od ostatniego wywołania commit
" setAutoSubmit() - wyłącza opcję automatycznego
" Np.:
dokonywania zmian
DatabaseMetaData dbmeta = polaczenie.getMetaData();
" close zamyka otwarte połączenie z bazą danych
String nazwaBazy = dbmeta. getDatabaseProductName();
" isClosed sprawdza czy nie skończył się okres wa\ności
System.out.println("Baza danych: " + nazwaBazy );
połączenia lub czy nie zostało ono jawnie zamknięte
String numerwersji = dbmeta. getDatabaseProductversion();
" getMetaData zwraca obiekt DataBaseMetaData
System.out.println("Numer wersji bazy: " + numerwersji);
15 16
Utworzenie polecenia - obiekt
Wykonanie zapytania
Statement
" do przesyłania zapytań i poleceń do BD są " dysponując obiektem Statement mo\na ju\
wykorzystywane obiekty Statement przesłać zapytanie SQL
" metoda createStatement() utworzonego obiektu " executeQuery przesyła zapytanie i w wyniku
klasy Connection zwraca obiekt Statement zwraca obiekt ResultSet przechowujący wiersze
tabeli wyników
" np.
Statement polecenie=polaczenie.createStatement(); " np.
String zapytanie = "SELECT * FROM books";
" większość sterowników JDBC pozwala na
ResultSet wynik = polecenie.executeQuery(zapytanie);
jednoczesne tworzenie i u\ywanie większej liczby
obiektów Statement korzystających z tego samego
połączenia z BD
17 18
3
Interfejs Statement przesyłanie i
wykonywanie dowolnych poleceń SQL Obiekty Statement i ResultSet
" executeQuery wykonuje polecenie SQL i zwraca dane w postaci
obiektu ResultSet (obiekt mo\e być pusty ale metoda nie zwraca null)
baza danych
program Java JDBC & Driver
" executeUpdate realizuje polecenia SQL UPDATE, INSERT,
DELETE i zwraca liczbę rekordów objętych działaniem
Statement(SQL)
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 ResultSet
czas
zwraca tablicę wierszy objętych działaniem poszczególnych poleceń;
Baza
dodawanie poleceń do grupy metoda addBatch Statement(SQL)
danych
" setQueryTimeout określa czas przez jaki sterownik będzie czekał na
odebranie wyników zanim zgłosi wyjątek SQLException
ResultSet
" getMaxRows, setMaxRows max liczba wierszy jaką mo\e zawierać
obiekt ResultSet (domyślnie 0 nie ograniczona)
19 20
Przykład wyświetlenie
Interfejs ResultSet -
wyników
przetworzenie wyników
String host="dbhost.firma.com.pl"; String db="nazwaBazy"; int port=1234;
String URL = "jdbc:odbc" +db ;
" metoda next() zwraca kolejny wiersz lub false jeśli
String user="beatap"; String haslo="tajne";
osiągnięto koniec zbioru wynikowego
Connection polaczenie = DriverManager.getConnection(URL, user, haslo);
" getXxx metody zwracające wartości niemal wszystkich
Statement polecenie=polaczenie.createStatement();
podstawowych typów danych (np. getString(), getInt() )
String zapytanie = "SELECT * FROM znajomi";
" UWAGA! Kolumny zbioru wynikowego są indeksowane
ResultSet wynik = polecenie.executeQuery(zapytanie);
(zgodnie z konwencją przyjętą
while (wynik.next())
w SQL) od 1 a nie od 0.
{ int id = wynik.getInt("id");
" odczytując dane przechowywane w obiekcie ResultSet,
String n = wynik.getString("nazwisko");
lepiej jest u\ywać nazw kolumn (nie ich indeksów) w
String i = wynik.getString("imie");
przypadku zmiany struktury tabeli niebezpieczeństwo
String e = wynik.getString("email");
awarii kodu obsługującego wyniki jest mniejsze
System.out.println(id+" "+n+" "+i+" "+e); }
polaczenie.close();
21 22
Interfejs ResultSet
Interfejs ResultSetMetaData
" next(), previous()
" getColumnCount
" relative(int) przesuwa kursor o podaną liczbę wierszy do
przodu lub do tyłu (wartość ujemna)
" getColumnName(int)
" absolute(int) przesuwa kursor do wiersza o wskazanym
" getColumnType zwraca wartość int do
numerze
porównania ze stałymi klasy java.sql.Types
" getXxx zwraca wartość odczytaną z wiersza o podanej
" isReadOnly czy wskazana kolumna tylko do
nazwie lub indeksie
odczytu
" wasNull sprawdza czy wartość odczytana przez ostatnie
wywołanie metody getXxx jest Null
" isSearchable czy wskazana kolumna mo\e być
" findColumn zwraca indeks kolumny o podanej nazwie
zastosowana w klauzuli WHERE
" getRow zwraca numer bie\ącego wiersza (numerowane
" isNullable - czy wskazana kolumna mo\e
od 1)
zawierać NULL
" getMetaData zwraca obiekt typu ResultSetMetaData
opisujący zawartość ResultSet
23 24
4
Instalacja i konfiguracja
Zamknięcie połączenia
serwera MySQL
" polaczenie.close();
" Zamknięcie połączenia powoduje równie\ zamknięcie
" pobranie MySQL ze strony
u\ywających go obiektów Statement i ResultSet
http://dev.mysql.com/downloads/ i zainstalowanie
" Je\eli planowane jest przeprowadzenie innych operacji na
jako usługi systemowej (w Windows)
BD nie nale\y zamykać połączenia przed ich
sczególowe informacje na stronie
wykonaniem (koszt otwarcia nowego połączenia jest dość
http://dev.mysql.com/doc/
wysoki)
" utworzenie bazy danych
" W praktyce stosowanie ju\ otwartych połączeń jest bardzo
wa\nym aspektem optymalizacji korzystania z baz danych
" utworzenie u\ytkownika
" API JDBC definiuje specjalny interfejs
" instalacja sterownika JDBC
ConnectionPoolDataSource do korzystania z pul
połączeń
25 26
Instalacja sterownika JDBC
Sterownik MySQL Connector/J
" najczęściej stosowane sterowniki do połączenia
z MySQL (dostępne w plikach JAR):
" do pobrania ze strony:
MySQL Connector/J (zalecany przez twórców MySQL)
http://www.mysql.com/products/connector-j/
Caucho Resin
" umieszczony w pliku:
" \aden z tych sterowników nie jest w pełni zgodny ze
specyfikacją JDBC 2.0 ani ze standardem ANSI SQL-92 mysql-connector-java-3.1.14\mysql-connector-java-
3.1.14-bin.jar
" podczas tworzenia aplikacji w zmiennej środowiskowej
CLASSPATH nale\y podać ście\kę dostępu do pliku JAR
" klasa sterownika:
sterownika
com.mysql.jdbc.Driver
" podczas wdra\ania aplikacji plik sterownika nale\y
" URL u\ywany do połączenia z bazą danych:
umieścić (dla serwera Tomcat) w folderze WEB-INF/lib lub
jdbc:mysql://komputer:3306//NazwaBazy
we wspólnym folderze kat_instalacyjny/common/lib (jeśli na
serwerze działa wiele aplikacji WWW korzystających z bd)
27 28
Przykład 1 wyświetlanie
Sterownik Caucho Resin
danych z bazy MYSQL
import java.sql.*;
" do pobrania ze strony:
public class testBD {
http://www.caucho.com/projects/jdbc-mysql/index.xtp
public static void main(String[] args)
" umieszczony w pliku:
throws SQLException, ClassNotFoundException {
caucho-jdbc-2.1.0.jar
Class.forName("com.mysql.jdbc.Driver");
" klasa sterownika:
Connection polacz =
com.caucho.jdbc.mysql.Driver
DriverManager.getConnection("jdbc:mysql://localhost:3306/
" URL u\ywany do połączenia z bazą danych:
dane", "root", "");
jdbc:mysql-caucho://komputer:3306//NazwaBazy
Statement zapytanie = polacz.createStatement();
" wg. danych firmy Caucho sterownik jest 50% ResultSet w = zapytanie.executeQuery
("SELECT * FROM news");
szybszy od sterownika MySQL Connector/J
29 30
5
Przykład 1 c.d.
while (w.next())
{
int id = w.getInt("Lp");
String n = w.getString("Naglowek");
String i = w.getString("Tresc");
String e = w.getString("Autor");
System.out.println(id+" "+n+" "+i+" \n"+e);
}
polacz.close();
}
}
31 32
Przykład 1b dodawanie
Przykład 1a rekordów do bazy
Statement zapytanie = polacz.createStatement();
int x = zapytanie.executeUpdate( "INSERT INTO news
" Przykład zmodyfikowanego zapytania SQL
(Autor, Naglowek, Tresc) VALUES ('Wilk', 'Tytul', 'Tresc')");
System.out.println("Dodano rekordow: " + x);
ResultSet w = zapytanie.executeQuery(
"SELECT Autor FROM news");
while (w.next())
{
String n = w.getString("Autor");
System.out.println(n);
}
33 34
Zalety JDBC Wady JDBC
" niska wydajność (poniewa\ jest to interfejs - zanim
" łatwość u\ycia (dzięki temu, \e jest ju\
zapytanie powędruje do bazy danych, jest ono
zdefiniowany interfejs i wszystkie mechanizmy do
przetwarzane do postaci uniwersalnej, rozumianej
obsługi baz danych, pozostaje jedynie z niego
przez wszystkie systemy oraz bazy danych; nawet
jeśli u\ytkownik pracuje na dwóch identycznych
skorzystać)
bazach danych, to i tak komunikacja między nimi
" uniwersalność (jak z ka\dego produktu SUN
sprowadza się do tłumaczenia na "język uniwersalny"
z JDBC mo\na korzystać na ka\dej platformie;
a dopiero potem dostarczania docelowej bazie
danych)
obsługa ró\nych rodzajów baz danych (Oracle,
" niski poziom bezpieczeństwa (aby komunikacja
Access, MySQL itd.) jest bardzo podobna
z bazą danych mogła przebiegać w miarę szybko
i być przy tym uniwersalna poziom bezpieczeństwa
jest tutaj na niezbyt wysokim poziomie)
35 36
6
Wyszukiwarka
Podobne podstrony:
java text FieldPositionjavajava text CollationElementIteratorjava io InvalidClassExceptiontworzenie aplikacji w jezyku java na platforme androidJava Tęczowy tekstjava awt image IndexColorModeljava awt image ImageConsumersieci0405 w9java beans PropertyChangeEventjava awt event ActionEventjava awt event FocusEventjava rmi server RMISocketFactorywięcej podobnych podstron