• Nie Znaleziono Wyników

JDBC Database Access

N/A
N/A
Protected

Academic year: 2021

Share "JDBC Database Access"

Copied!
19
0
0

Pełen tekst

(1)

Uniwersytet Łódzki

Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej

JDBC Database Access

Wykład 12

mgr inż. Michał Misiak

(2)

JDBC

 JDBC API zostało zaprojektowane, aby ułatwić komunikację z relacyjnymi bazami danych oraz innymi typami źródeł danych w

heterogenicznych środowiskach.

 Korzystanie z bazy danych w aplikacji sprowadza się do 3 kroków

 Podłączenie do źródła danych – w tym przypadku BD

 Wykonywanie zapytań do bazy danych

 Odebranie i przetworzenie rezultatu odebranego od

bazy danych w odpowiedzi na zapytanie

(3)

Przykład

Connection con =

DriverManager.getConnection ( "jdbc:myDriver:wombat", "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"); }

*) Inicjalizacja obiektu DriverManager w celu podłączenia do bazy danych

*) stworzenie wyrażania do wykonania na bazie danych

*) inicjalizacja obiektu ResultSet w celu odebrania danych z bazy

Źródło: http://java.sun.com/docs/books/tutorial/jdbc/overview/index.html

(4)

Składniki JDBC

JDBC API składa się z dwóch pakietów, które są częścią J2SE oraz J2EE: java.sql oraz javax.sql.

JDBC DriverManager – definiuje obiekty, które służą do połączenia palikacji ze sterownikami JDBC. Do

połączenia wykorzystywany jest obiekt DataSource z pakietu javax.sql, który został zarejestrowany w

javax.naming (JNDI).

JDBC Test Suite – pozwala określić, czy dane sterowniki działają w aplikacji.

JDBC-ODBC Brige – jest to dostęp do bazy danych po

przez sterowniki ODBC.

(5)

Przykładowe architektury

Aplikacja Java JDBC

Właściwy protokół DBMS Maszyna klienta

Serwer bazodanowy

Architektura dwuwarstwowa Architektura trzywarstwowa

Przeglądarka

Serwer Aplikacyjny Java

JDBC

Maszyna klienta (GUI) HTML, RMI, CORBA, Web Services

Maszyna z logiką biznesową

Właściwy protokół DBMS

Serwer bazodanowy

*) Wszelkie zmiany w strukturze pozyskania danych realizowane są na poziomie serwera aplikacyjnego bez ingerencji w aplikacje u klienta

*) Uproszczony sposób rozbudowy

(6)

4 typy sterowników

TYP 1 – sterowniki, które implementują JDBC API mapując do innego API bazodanowego np. ODBC. Sterowniki te są zależne od bibliotek natywnych, które ograniczają przenośność. Przykładem jest JDBC-ODBC Bridge.

TYP 2 – sterowniki pisane są częściowo w Javie z kodem natywnym. Te sterowniki wykorzystują natywne biblioteki klienta specyficzne dla danego źródła danych. Z powodu natywnego kodu przenośność ograniczona.

TYP 3 – sterowniki napisane w pełni w Javie, które komunikują się przez warstwę pośredniczącą z serwerem korzystając z niezależnych od bazy danych protokołów.

TYP 4 – sterowniki, które napisane są w pełni w Javie i implementują

specyficzny dla danej bazy danych protokół. Klient łączy się bezpośrednio

ze źródłem danych.

(7)

Ustanowienie połączenia z źródłem danych

 Do połączenia z bazą danych wykorzystywane są dwa mechanizmy:

 DriverManager – wymaga, aby aplikacja załadowała odpowiedni sterownik JDBC korzystając z

umieszczone na stałe w kodzie adresu URL.

Początkowo próbuje załadować sterownik wyszczególniony w property jdbc.drivers

 DataSource – interfejs wykorzystywany przez DriverManager pozwalający zapewnić

przeźroczystość źródła danych dla aplikacji.

DataSource reprezentuje szczególne źródło danych.

(8)

Ustanowienie połączenia ze źródłem danych (2)

 Załadowanie sterowników.

Class.forName("org.apache.derby.jdbc.XXXXDriver");

Class.forName – tworzy instancję 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.

jdbc:XXXX:<NazwaBazyDanych>[lista_wlasciwosci]

Connection conn =

DriverManager.getConnection("jdbc:XXXX:BazaDanych", login,

pass);

(9)

Ustanawianie połączenia przez DataSource

DataSource zwiększa przenaszalność aplikacji, gdyż aplikacja korzysta wyłączenie z nazwy źródła, bez wnikania w jego rodzaj.

InitialContext ic = new InitialContext();

DataSource ds = ic.lookup("java:comp/env/jdbc/myDB");

Connection con = ds.getConnection();

DataSource ds = (DataSource) org.apache.derby.jdbc.ClientDataSource() ds.setPort(1527);

ds.setHost("localhost");

ds.setUser("APP");

ds.setPassword("APP");

Connection con = ds.getConnection();

(10)

Wykorzystanie ANT do utworzenia Tabel

<target name="create-db_common" depends="init,start-db,delete-db"

description="Create database tables and populate database.">

- <sql driver="${db.driver}" url="${db.url}" userid="${db.user}"

password="${db.password}" classpathref="db.classpath"

delimiter="${db.delimiter}" autocommit="false" onerror="abort">

<transaction src="

{javaee.tutorial.home}/examples/common/sql/

${db.vendor}/tutorial.sql"/>

</sql>

</target>

Wpis do ANT

Plik z właściwościami

# Database properties are in derby.properties db.delimiter=; db.root=${javaee.home}/XXXX db.driver=org.apache.derby.jdbc.ClientDriver

db.datasource=org.apache.derby.jdbc.ClientDataSource db.host=localhost db.port=1527

(11)

ResultSet

Interfejs ResultSet udostępnia szereg metod do odbierania i manipulowania danymi

Typy ResultSet:

TYPE_FORWARD_ONLY – odebrane dane nie są „przewijalne”. Kurs porusza się wyłącznie do przodu od pierwszego do ostatniego wiersza.

TYPE_SCROLL_INSENSITIVE – możliwość poruszania się po wierszach zestawu odebranych danych. Możliwość przesuwania kursora w ściśle określone miejsce lub względem aktualnej pozycji.

TYPE_SCROLL_SENSITIVE - możliwość poruszania się po wierszach zestawu odebranych danych.

CONCUR_READ_ONLY – możliwość odczytania wyników

CONCUR_UPDATABLE – możliwość zaktualizowania wyników

Uwaga należy zachować kolejność podwanych typów – najpierw sposób poruszania się po wynikach, potem prawa do odczytu lub aktualizacji.

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

ResultSet srs = stmt.executeQuery("SELECT COF_NAME, PRICE FROM COFFEES");

(12)

ResultSet – lista metod

next() – przesuwa kurs do następnego wiersza. Jeśli wiersz jest ostatnim zwraca fałsz.

previous() – przesuwa kurs jedną pozycje do tyłu. Zwraca fałsz jeśli kurs jest ustawiony na pierwszym wierszu.

first() – przesuwa kurs na pierwsza pozycję. Zwraca fałsz jeśli ResultSet nie zawiera ani jednego wiersza.

last() – przesuwa kurs do ostatniego wiersza w obiekcie ResultSet.

Zwraca fałsz jeśli obiekt ResultSet nie zawiera żadnego wiersza.

beforeFirst() – ustawia kursor na pozycję początkową przed pierwszym wierczem.

afterLast() – przesuwa kurs na pozycję za ostatnim wierszem.

relative(int rows) – przesuwa kursor do obecnej pozycji

absolute(int row) – pozycjonuje kursor na określonym wierszu.

(13)

Metody getXXXX z ResultSet

 ResultSet posiada zestaw metod, które

odpowiadają określonym typom danych np.

getDouble, getBoolean.

 Pobieranie danych z określonej kolumny odbywa się po przez odwołanie się do nie po nazwie lub po indeksie. Indeks jest bardziej wydajny.

 Nazwy kolumn są czułe na małe i duże litery

 Odbieranie różnych wartości z różnych wersji

SQL może się odbywać po przez getString

(14)

Przykład

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(name + " " + price);

}

(15)

Aktualizacja danych w bazie

Modyfikacja danych realizowana jest w dwóch korkach:

modyfikacja danych w obiekcie ResultSet, który jest typu CONCUR_UPDATABLE

wysłanie modyfikacje do bazy danych

ResultSet posiada metody do wykonywania modyfikacji danych posługujące się indeksem kolumny, bądź jej nazwą

Dla każdego z typów występuje osobno metoda updateXXXX, np.

updateString, updateFloat

W przypadku anulowania modyfikacji danych w określonej kolumnie należy użyć metody: cancelRowUpdates(), za nim zostanie

wywołana metoda updateRow()

Modyfikacja wiersza realizowana jest w miejscu, gdzie aktualnie

znajduje się kursor

(16)

Modyfikacja danych - przykład

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

Zawartość ResultSet Modyfikacja danych

(17)

Przygotowane wyrażenia

Przygotowane wyrażania reprezentuje obiekt preparedStatement i wykorzystywany jest w przypadku częstego wykonywania tego samego zapytania na bazie danych

Zaletą jest to, że wyrażanie zostało wcześniej skompilowane. Jest wymagana komplikacja przed zapytaniem do bazy danych, wysłany jest jedynie SQL.

PreparedStatement updateSales =

con.prepareStatement( "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");

...

updateSales.setInt(1, 75);

updateSales.executeUpdate():

Przykład

(18)

Transakcje

 Przy tworzeniu połączenia włączany jest tryb auto-

commit – każda pojedyncze wyrażenie jest wykonywane jako osobna transakcja.

 Grupowanie kilku wyrażeń w jedną transakcję można wywołać po przez wyłączenie trybu auto-commit

 Zatwierdzenie transakcji odbywa się po przez wywołanie metody: con.commit();

 Wykorzystanie tzw. „SavePoint” do wycofywania

transakcji za pomocą metody Connection.rollback

(19)

Kolokwium

 Czas trwania 60 min.

 Ocena z przedmiotu 60% projekt + 40%

kolokwium – należy zaliczyć obydwie części

 Test do wyboru z wieloma wariantami

 Zadanie na analizę kodu źródłowego

Cytaty

Powiązane dokumenty

You simply create a Statement object and then execute it, supplying the appropriate execute method with the SQL statement you want to send?. For a SELECT statement, the method to use

Należy tu skorzystać z możliwości samodzielnego utworzenia masek. Do maski wprowadzania należy wprowa- dzać symbole zastępujące cyfry. Maska wprowadzania dla

wyświetlanie zawartość tabeli TRIP (metoda void wyswietl_wycieczki()), wyświetlanie wycieczek każdej osoby (metoda void wyswietl_wycieczki_osob()).. Wykonaj kopię programu Baza_1

Procedura posługiwania się sterownikiem JDBC-ODBC 1) Utworzenie relacyjnej bazy danych np. katalog.mdb zawierającej tabele Tytul i Ksiazka.. 2) Połączenie bazy danych ze

[r]

Po zakończeniu edycji struktury tabeli zostanie utworzona pusta tabela bazy danych; zapisz ją (na dysku) i rozpocznij wprowadzanie danych do rekordów;

Pozwala on na stosunkowo proste i przejrzyste konstruowanie szablonów zapytań w postaci tabel analogicznych do tabel danych; zasadnicza różnica polega na

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {. Osoby o =