w9 java


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 FieldPosition
java
java text CollationElementIterator
java io InvalidClassException
tworzenie aplikacji w jezyku java na platforme android
Java Tęczowy tekst
java awt image IndexColorModel
java awt image ImageConsumer
sieci0405 w9
java beans PropertyChangeEvent
java awt event ActionEvent
java awt event FocusEvent
java rmi server RMISocketFactory

więcej podobnych podstron