Title: JDBC Database Access
1JDBC Database Access
mgr inz. Michal Misiak
2JDBC
- JDBC API zostalo zaprojektowane, aby ulatwic
komunikacje z relacyjnymi bazami danych oraz
innymi typami zródel danych w heterogenicznych
srodowiskach. - Korzystanie z bazy danych w aplikacji sprowadza
sie do 3 kroków - Podlaczenie do zródla danych w tym przypadku BD
- Wykonywanie zapytan do bazy danych
- Odebranie i przetworzenie rezultatu odebranego od
bazy danych w odpowiedzi na zapytanie
3Przyklad
) Inicjalizacja obiektu DriverManager w celu
podlaczenia do bazy danych ) stworzenie
wyrazania do wykonania na bazie danych )
inicjalizacja obiektu ResultSet w celu odebrania
danych z bazy
Connection con DriverManager.getConnection (
"jdbcmyDriverwombat", "myLogin","myPassword"
) Statement stmt con.createStatement()
ResultSet rs stmt.executeQuery("SELECT a, "
"b, c FROM Table1") while (rs.next())
int x rs.getInt("a") String s
rs.getString("b") float f rs.getFloat("c")
Zródlo http//java.sun.com/docs/books/tutorial/jd
bc/overview/index.html
4Skladniki JDBC
- JDBC API sklada sie z dwóch pakietów, które sa
czescia J2SE oraz J2EE java.sql oraz javax.sql. - JDBC DriverManager definiuje obiekty, które
sluza do polaczenia palikacji ze sterownikami
JDBC. Do polaczenia wykorzystywany jest obiekt
DataSource z pakietu javax.sql, który zostal
zarejestrowany w javax.naming (JNDI). - JDBC Test Suite pozwala okreslic, czy dane
sterowniki dzialaja w aplikacji. - JDBC-ODBC Brige jest to dostep do bazy danych
po przez sterowniki ODBC.
5Przykladowe architektury
Architektura dwuwarstwowa
Architektura trzywarstwowa
Przegladarka
Maszyna klienta (GUI)
Maszyna klienta
HTML, RMI, CORBA, Web Services
Maszyna z logika biznesowa
Wlasciwy protokól DBMS
Wlasciwy protokól DBMS
Serwer bazodanowy
Serwer bazodanowy
) Wszelkie zmiany w strukturze pozyskania danych
realizowane sa na poziomie serwera aplikacyjnego
bez ingerencji w aplikacje u klienta )
Uproszczony sposób rozbudowy
64 typy sterowników
- TYP 1 sterowniki, które implementuja JDBC API
mapujac do innego API bazodanowego np. ODBC.
Sterowniki te sa zalezne od bibliotek natywnych,
które ograniczaja przenosnosc. Przykladem jest
JDBC-ODBC Bridge. - TYP 2 sterowniki pisane sa czesciowo w Javie z
kodem natywnym. Te sterowniki wykorzystuja
natywne biblioteki klienta specyficzne dla danego
zródla danych. Z powodu natywnego kodu
przenosnosc ograniczona. - TYP 3 sterowniki napisane w pelni w Javie,
które komunikuja sie przez warstwe posredniczaca
z serwerem korzystajac z niezaleznych od bazy
danych protokolów. - TYP 4 sterowniki, które napisane sa w pelni w
Javie i implementuja specyficzny dla danej bazy
danych protokól. Klient laczy sie bezposrednio ze
zródlem danych.
7Ustanowienie polaczenia z zródlem danych
- Do polaczenia z baza danych wykorzystywane sa dwa
mechanizmy - DriverManager wymaga, aby aplikacja zaladowala
odpowiedni sterownik JDBC korzystajac z
umieszczone na stale w kodzie adresu URL.
Poczatkowo próbuje zaladowac sterownik
wyszczególniony w property jdbc.drivers - DataSource interfejs wykorzystywany przez
DriverManager pozwalajacy zapewnic
przezroczystosc zródla danych dla aplikacji.
DataSource reprezentuje szczególne zródlo danych.
8Ustanowienie polaczenia ze zródlem danych (2)
- Zaladowanie sterowników.
- Class.forName("org.apache.derby.jdbc.XXXXDriver")
- Class.forName tworzy instancje sterowników XXXX
(np. Oracle) i rejestruje je w DriverManager - Korzystanie z DriverManager
- Zadaniem DriverManager jest rozpoznanie na
podstawie URL rodzaju sterownika oraz jego
odnalezieniu. - jdbcXXXXltNazwaBazyDanychgtlista_wlasciwosci
- Connection conn DriverManager.getConnection("jdb
cXXXXBazaDanych", login, pass)
9Ustanawianie polaczenia przez DataSource
DataSource zwieksza przenaszalnosc aplikacji,
gdyz aplikacja korzysta wylaczenie z nazwy
zródla, bez wnikania w jego rodzaj.
InitialContext ic new InitialContext() DataSour
ce ds ic.lookup("javacomp/env/jdbc/myDB")
Connection con ds.getConnection() DataSource
ds (DataSource) org.apache.derby.jdbc.ClientData
Source() ds.setPort(1527) ds.setHost("localhost
") ds.setUser("APP") ds.setPassword("APP")
Connection con ds.getConnection()
10Wykorzystanie ANT do utworzenia Tabel
Wpis do ANT
lttarget name"create-db_common"
depends"init,start-db,delete-db"
description"Create database tables and populate
database."gt - ltsql driver"db.driver"
url"db.url" userid"db.user"
password"db.password" classpathref"db.classpa
th" delimiter"db.delimiter"
autocommit"false" onerror"abort"gt
lttransaction src"
javaee.tutorial.home/examples/common/sql/
db.vendor/tutorial.sql"/gt
lt/sqlgt lt/targetgt
Plik z wlasciwosciami
Database properties are in derby.properties
db.delimiter db.rootjavaee.home/XXXX
db.driverorg.apache.derby.jdbc.ClientDriver
db.datasourceorg.apache.derby.jdbc.ClientDataSou
rce db.hostlocalhost db.port1527
db.sidsun-appserv-samples db.urljdbcderby//
db.hostdb.port/db.sidcreatetrue
db.userAPP db.pwdAPP
Zródlo http//java.sun.com/docs/books/tutorial/jd
bc/overview/index.html
11ResultSet
- Interfejs ResultSet udostepnia szereg metod do
odbierania i manipulowania danymi - Typy ResultSet
- TYPE_FORWARD_ONLY odebrane dane nie sa
przewijalne. Kurs porusza sie wylacznie do
przodu od pierwszego do ostatniego wiersza. - TYPE_SCROLL_INSENSITIVE mozliwosc poruszania
sie po wierszach zestawu odebranych danych.
Mozliwosc przesuwania kursora w scisle okreslone
miejsce lub wzgledem aktualnej pozycji. - TYPE_SCROLL_SENSITIVE - mozliwosc poruszania sie
po wierszach zestawu odebranych danych. - CONCUR_READ_ONLY mozliwosc odczytania wyników
- CONCUR_UPDATABLE mozliwosc zaktualizowania
wyników - Uwaga nalezy zachowac kolejnosc podwanych typów
najpierw sposób poruszania sie po wynikach, potem
prawa do odczytu lub aktualizacji.
Statement stmt con.createStatement(ResultSet.TYP
E_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY
) ResultSet srs stmt.executeQuery("SELECT
COF_NAME, PRICE FROM COFFEES")
12ResultSet lista metod
- next() przesuwa kurs do nastepnego wiersza.
Jesli wiersz jest ostatnim zwraca falsz. - previous() przesuwa kurs jedna pozycje do tylu.
Zwraca falsz jesli kurs jest ustawiony na
pierwszym wierszu. - first() przesuwa kurs na pierwsza pozycje.
Zwraca falsz jesli ResultSet nie zawiera ani
jednego wiersza. - last() przesuwa kurs do ostatniego wiersza w
obiekcie ResultSet. Zwraca falsz jesli obiekt
ResultSet nie zawiera zadnego wiersza. - beforeFirst() ustawia kursor na pozycje
poczatkowa przed pierwszym wierczem. - afterLast() przesuwa kurs na pozycje za
ostatnim wierszem. - relative(int rows) przesuwa kursor do obecnej
pozycji - absolute(int row) pozycjonuje kursor na
okreslonym wierszu.
13Metody getXXXX z ResultSet
- ResultSet posiada zestaw metod, które odpowiadaja
okreslonym typom danych np. getDouble,
getBoolean. - Pobieranie danych z okreslonej kolumny odbywa sie
po przez odwolanie sie do nie po nazwie lub po
indeksie. Indeks jest bardziej wydajny. - Nazwy kolumn sa czule na male i duze litery
- Odbieranie róznych wartosci z róznych wersji SQL
moze sie odbywac po przez getString
14Przyklad
Statement stmt con.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY) ResultSet srs
stmt.executeQuery( "SELECT COF_NAME, PRICE
FROM COFFEES") while (srs.next()) String
name srs.getString("COF_NAME") float price
srs.getFloat("PRICE") System.out.println(na
me " " price)
15Aktualizacja danych w bazie
- Modyfikacja danych realizowana jest w dwóch
korkach - modyfikacja danych w obiekcie ResultSet, który
jest typu CONCUR_UPDATABLE - wyslanie modyfikacje do bazy danych
- ResultSet posiada metody do wykonywania
modyfikacji danych poslugujace sie indeksem
kolumny, badz jej nazwa - Dla kazdego z typów wystepuje osobno metoda
updateXXXX, np. updateString, updateFloat - W przypadku anulowania modyfikacji danych w
okreslonej kolumnie nalezy uzyc metody
cancelRowUpdates(), za nim zostanie wywolana
metoda updateRow() - Modyfikacja wiersza realizowana jest w miejscu,
gdzie aktualnie znajduje sie kursor
16Modyfikacja danych - przyklad
Modyfikacja danych
Zawartosc ResultSet
Statement stmt conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE) ResultSet srs
stmt.executeQuery( "select COF_Name from
COFFEES " "where price 7.99")
srs.next() srs.updateString("COF_NAME",
"Foldgers") srs.updateRow()
COF_NAME PRICE ------------------
----- Colombian 7.99 French_Roast 8.99
Espresso 9.99 Colombian_Decaf 8.99
French_Roast_Decaf 9.99
17Przygotowane wyrazenia
- Przygotowane wyrazania reprezentuje obiekt
preparedStatement i wykorzystywany jest w
przypadku czestego wykonywania tego samego
zapytania na bazie danych - Zaleta jest to, ze wyrazanie zostalo wczesniej
skompilowane. Jest wymagana komplikacja przed
zapytaniem do bazy danych, wyslany jest jedynie
SQL.
Przyklad
PreparedStatement updateSales
con.prepareStatement( "UPDATE COFFEES SET SALES
? WHERE COF_NAME LIKE ?") ... updateSales.se
tInt(1, 75) updateSales.executeUpdate()
18Transakcje
- Przy tworzeniu polaczenia wlaczany jest tryb
auto-commit kazda pojedyncze wyrazenie jest
wykonywane jako osobna transakcja. - Grupowanie kilku wyrazen w jedna transakcje mozna
wywolac po przez wylaczenie trybu auto-commit - Zatwierdzenie transakcji odbywa sie po przez
wywolanie metody con.commit() - Wykorzystanie tzw. SavePoint do wycofywania
transakcji za pomoca metody Connection.rollback
19Kolokwium
- Czas trwania 60 min.
- Ocena z przedmiotu 60 projekt 40 kolokwium
nalezy zaliczyc obydwie czesci - Test do wyboru z wieloma wariantami
- Zadanie na analize kodu zródlowego