Technologia JDBC w praktyce

Podobne dokumenty
JAVA I BAZY DANYCH. MATERIAŁY:

JDBC (Java Database Connectivity vit )

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

Programowanie komputerów. Wykład 10: Dostęp do baz danych z poziomu aplikacji Java. (JDBC Database Access)

Połączenie z bazą danych

Metody dostępu do danych

Typy sterowników. Rozdział 21 JDBC. Podstawowe kroki aplikacji. Historia. Program napisany w języku Java JDBC API. Menadżer sterowników JDBC

JDBC. Plan ćwiczenia. Wywoływanie poleceń SQL z języków programowania. Plan ćwiczenia cd. Wprowadzenie do laboratorium

Obsługa transakcji rozproszonych Java. Marek Wojciechowski, Maciej Zakrzewicz Instytut Informatyki, Politechnika Poznańska

JDBC w LoXiMie. Interfejs Java Database Connectivity dla systemu LoXiM. Adam Michalik 2008

JAVA bazy danych. na bazie: Język Java - Podstawy Programowania - Jacek Rumiński

Plan wykładu. Dostęp do bazy danych. Architektura JDBC. Dostęp do baz danych z aplikacji Java EE

Rozdział 9 Obsługa baz danych w języku Java

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Podstawy otwartych języków programowania Java Database Connectivity (JDBC)

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Java Database Connectivity

JDBC - Obsługa baz danych w języku Java

Cele. Definiowanie wyzwalaczy

Oracle PL/SQL. Paweł Rajba.

15. Funkcje i procedury składowane PL/SQL

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

PHP: bazy danych, SQL, AJAX i JSON

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

BAZY DANYCH. Transakcje. opracowanie: Michał Lech

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Aplikacje Internetowe

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Składowane procedury i funkcje

Bazy danych wykład dwunasty

Bazy danych. Dr inż. Paweł Kasprowski

PODSTAWY BAZ DANYCH 13. PL/SQL

Wykład 8. SQL praca z tabelami 5

BAZY DANYCH. Obsługa bazy z poziomu języka PHP. opracowanie: Michał Lech

Programowanie w języku Java. Bazy danych SQLite w Javie

Ćwiczenie 14 autoryzacja

Pakiety podprogramów Dynamiczny SQL

Connection con = DriverManager.getConnection(dbUrl, username, passwd);

Kurs programowania aplikacji bazodanowych

Java i bazy danych. 1. JDBC podstawy, transakcje. 2. Mapowanie relacyjno obiektowe. Hibernate, przykład.

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Dostęp do baz danych z aplikacji J2EE

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Łączenie z bazą danych przykładowa klasa infpolaczenie import java.sql.drivermanager; import java.sql.connection; import java.sql.

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

W tej części zajmiemy się ćwiczeniami dotyczącymi modyfikacji rekordów.

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

PL/SQL. Zaawansowane tematy PL/SQL

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski. Zaawansowane Systemy Decyzyjne. Laboratorium

Programowanie obiektowe zastosowanie języka Java SE

Wprowadzenie. Rozdział 23 PDO. Podstawowe kroki aplikacji. Źródło danych

Plan. Formularz i jego typy. Tworzenie formularza. Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza

Kurs programowania aplikacji bazodanowych

Database Connectivity

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Wykład 5 Charakterystyka języka SQL. Elementy obliczeń relacyjnych.

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

Procedury składowane. Funkcje vs. procedury Funkcja. Procedura. zazwyczaj ma parametry tylko typu IN; można wywoływać z poziomu

SQL w języku PL/SQL. 2) Instrukcje języka definicji danych DDL DROP, CREATE, ALTER, GRANT, REVOKE

Ref. 7 - Język SQL - polecenia DDL i DML

1) Przygotowanie środowiska pracy.

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

76.Struktura oprogramowania rozproszonego.

ZAPOZNANIE SIĘ ZE SPOSOBEM PRZECHOWYWANIA

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Oracle PL/SQL. Paweł Rajba.

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Serwery Statefull i Stateless

Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie.

Struktura drzewa w MySQL. Michał Tyszczenko

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Wywoływanie metod zdalnych

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

Oracle10g: Programowanie w PL/SQL

Komunikacja Master-Slave w protokole PROFIBUS DP pomiędzy S7-300/S7-400

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Relacyjne bazy danych. Podstawy SQL

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Oracle11g: Programowanie w PL/SQL

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład X

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Podejście obiektowe do relacyjnych baz danych Hibernate.

Transakcje jednocześnie ACID

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

P o d s t a w y j ę z y k a S Q L

Komunikator internetowy w C#

Podstawy programowania III WYKŁAD 2

Oracle PL/SQL. Paweł Rajba.

Technologia informacyjna

Transkrypt:

Technologia JDBC w praktyce Cezary Bronny MSUI II Nr indeksu 227567

Spis treści 1. Wstęp... 3 2. Sterowniki... 4 3. Ustanawianie połączenia z bazą danych... 5 4. Wykonywanie poleceń SQL... 7 4.1. Wykonywanie polecenia select... 7 4.2. Wykonywanie poleceń insert, update i delete... 8 4.3. Wykonywanie DDL... 9 4.4. Wykonywanie procedur bazodanowych... 9 5. Zarządzanie transakcjami...10 6. Obsługiwanie wyjątków...12 7. Bibliografia...14 2

1. Wstęp Java, jako uniwersalny język programowania, daje moŝliwość dostępu do baz danych. Przenośność aplikacji bazodanowych tworzonych w Javie zapewnia interfejs JDBC opracowany przez firmę Sun Microsystems w 1996 roku. UmoŜliwia on konstruowanie i wykonywanie poleceń SQL owych z poziomu kodu Javy. Dzięki JDBC aplikacje bazodanowe napisane w Javie są niezaleŝne od sprzętu oraz stosowanej bazy danych (niezaleŝność od systemu operacyjnego zapewnia sama Java). NaleŜy jednak zaznaczyć, iŝ nadal moŝliwe jest stworzenie specyficznych wywołań lub uŝycie typów danych, występujących tylko w przypadku konkretnej bazy danych. Technologia JDBC znajduje zastosowanie między innymi w: programach aplikacyjnych napisanych w Javie apletach, czyli programach osadzonych na stronie WWW i uruchamianych przez przeglądarkę internetową serwletach osadzonych po stronie serwera w tzw. kontenerach serwletów/serwerach aplikacyjnych procedurach i funkcjach napisanych przy uŝyciu języka Java i składowanych w bazie danych W niniejszej pracy przedstawiono praktyczne informacje dotyczące interfejsu JDBC, tj. jak przygotować środowisko programistyczne do korzystania z interfejsu, jak ustanawiać połączenie z bazą danych, jak wykonywać polecenia SQL oraz w jaki sposób moŝna zarządzać transakcjami. Materiał zawiera równieŝ opis wyjątków zgłaszanych przez interfejs. 3

2. Sterowniki Fizycznie JDBC jest zbiorem klas i interfejsów, które umoŝliwiają dostęp do bazy danych z programów napisanych w języku Java. Są one zawarte w pakietach java.sql oraz javax.sql. Aby moŝliwe było ich uŝycie, najpierw naleŝy załadować odpowiedni sterownik JDBC, którego klasy implementują interfejsy oraz przedefiniowują klasy znajdujące się w tychŝe pakietach. Co waŝne, sterowniki JDBC nie są uniwersalne współpracują z jednym konkretnym źródłem danych. Jeśli tym źródłem jest baza danych to sterownik jest zazwyczaj przygotowany przez jej producenta (ale nie jest to regułą). Ze względu na fakt, Ŝe nie wszyscy producenci systemów bazodanowych przygotowali implementacje swojego interfejsu JDBC, a niektórzy przygotowali rozwiązania hybrydowe, moŝna wyróŝnić cztery rodzaje sterowników. Są nimi: JDBC-ODBC Bridge Driver sterownik tego typu wykorzystuje sterownik ODBC do komunikacji z bazą danych. Sterownik JDBC tego typu pełni jedynie rolę pośrednika tłumaczącego kod napisany w Javie na język sterownika ODBC. Native-API Partly Java Driver sterownik korzysta z bibliotek napisanych w innych językach. Dla Oracle, biblioteki kodu własnego mogłyby bazować na bibliotekach OCI, które były pierwotnie zaprojektowane dla programistów C/C++. JDBC-ODBC Bridge po lewej i Native-API Partly Java Driver po prawej 4

Net Protocoll All-Java Driver ten sterownik komunikuje się z bazą danych za pośrednictwem komponentów poprzez protokół sieciowy. Komponenty pośrednie zapewniają dostęp do róŝnych baz danych. Sterowniki tego typu są w całości napisane w Javie i nie wymagają instalacji dodatkowego oprogramowania po stronie klienta. Native Protocoll All Java Driver sterownik jest w całości napisany w Javie i komunikuje się bezpośrednio z serwerem bazodanowym za pomocą protokołów sieciowych. Native po lewej i Net Protocoll All-Java Driver po prawej 3. Ustanawianie połączenia z bazą danych Ustanawianie połączenia z bazą danych zawsze odbywa się w dwóch krokach. Najpierw naleŝy załadować sterowniki JDBC a następnie nawiązać połączenie z bazą. Krok pierwszy wykonujemy wywołując polecenie: Class.forName("nazwa_sterownika"); W przypadku ładowania sterownika mostu JDBC-ODBC, wykonamy: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); a w przypadku sterownika do bazy Oraclowej: Class.forName("oracle.jdbc.driver.OracleDriver"); 5

W następnym kroku moŝemy przejść do nawiązania połączenia z bazą danych. Do tego celu moŝemy uŝyć metody getconnection z klasy DriverManager. Parametrami metody są: URL do bazy danych oraz nazwa uŝytkownika i hasło. Adres URL identyfikuje bazę danych w sposób specyficzny dla określonego sterownika. RóŜne sterowniki mogą potrzebować róŝnych informacji zawartych w URL do określenia hosta bazy danych. Adresy URL zazwyczaj zaczynają się od jdbc:subprotokół:subnazwa. Subprotokół określa nazwę wykorzystywanego sterownika, a subnazwa identyfikuje bazę danych. Na przykład, sterownik Oracle JDBC-Thin wymaga URL w formie jdbc:oracle:thin:@dbhost:port:sid, a JDBC- ODBC Bridge uŝywa jdbc:odbc:datasourcename:odbcoptions. PoniŜszy fragment kodu nawiązuje połączenie z bazą danych: Class.forName( sun.jdbc.odbc.jdbcodbcdriver ); Connection con; con=drivermanager.getconnection("jdbc:odbc:bazacb", "uzykownik", "haslo"); Innym sposobem na nawiązanie połączenia jest skorzystanie z obiektu DataSource. Aby to zrobić, naleŝy najpierw zarejestrować go w usłudze nazewniczej JNDI (czyli Java Naming and Directory Interface). Dzięki temu aplikacja nie będzie musiała znać Ŝadnych szczegółów dotyczących sterownika jak to miało miejsce w przypadku obiektu DriverManager. Wystarczy jej nazwa logiczna, która zostanie odwzorowana dzięki usłudze JNDI w fizyczny obiekt DataSource reprezentujący konkretne źródło danych. Dodatkowo DataSource umoŝliwia utrzymanie tzw. puli połączeń do bazy. Mechanizm puli połączeń (ang. connection pooling) moŝe mieć zasadniczy wpływ na wydajność aplikacji gdyŝ ponownie wykorzystuje zwrócone wcześniej połączenia (połączenia nie są zamykane lecz zwracane do puli). Zamiast za kaŝdym razem fizycznie otwierać nowe połączenie, obiekt DataSource przekazuje po prostu referencję do aktywnego, nawiązanego juŝ wcześniej połączenia. PoniŜej kod pozyskujący połączenie z puli połączeń. 6

Context ctx = new InitialContext(); //inicjalizacja środowiska dla JNDI DataSource ds; ds = (DataSource) ctx.lookup("jdbc/bazacb"); /* jdbc/bazacb to logiczna nazwa obiektu reprezentującego źródło danych, który został wcześniej zarejestrowany w usłudze JNDI */ Connection con = ds.getconnection("cb227567", " haslo"); //pobranie połączenia 4. Wykonywanie poleceń SQL Po uzyskaniu połączenia z bazą danych moŝna zacząć operować na bazie danych. Interfejs Statement reprezentuje podstawowe medium, słuŝące do transmisji wszelkich zleceń do bazy danych. Statement nie posiada samodzielnego konstruktora jest tworzony za pomocą metody createstatement wcześniej pozyskanego obiektu Connection. Statement stmt = con.createstatement(); 4.1. Wykonywanie polecenia select Do wykonania polecenia select słuŝy metoda executequery obiektu Statement. Wynikiem jej wykonania jest obiekt typu ResultSet, który jest listą zwróconych rekordów. ResultSet rs = stmt.executequery("select * FROM KLIENCI"); UŜycie metody next obiektu ResultSet pozwala na przemieszczanie się pomiędzy wierszami danych reprezentowanych przez ResultSet. Metoda ta w wyniku wykonania zwraca wartość typu boolean w zaleŝności czy udało się jej wykonać przejście do następnego rekordu. Odczytanie danych z bazy moŝe zatem wyglądać następująco: 7

// deklaracja zmiennych String piwo, bar; float cena; // wywołujemy zapytanie ResultSet rs= stmt.executequery("select nazwa_baru, nazwa_piwa, cena_piwa + FROM PIWO_W_BARACH"); while( rs.next() ) { // w petli przechodzimy po kolejnych rekordach uzyskanych z zapytania bar = rs.getstring("nazwa_baru"); // przypisujemy na zmienną bar wartość z kolumny nazwa_baru piwo = rs.getstring("nazwa_piwa"); // podobnie jw cena = rs.getfloat("cena_piwa"); //wypisanie informacji na standardowe wyjście System.out.print( W barze + bar + jest piwko + piwo); System.out.println( w cenie + cena + za kufel. ); } NaleŜy pamiętać, Ŝe obiekt ResultSet jest związany z obiektem Statement. Jeśli zatem obiekt Statement zostanie zamknięty lub wykorzystany do obsługi innego zapytania to powiązany z nim obiekt ResultSet równieŝ zostanie zamknięty. 4.2. Wykonywanie poleceń insert, update i delete Wykonanie operacji insert, update i delete jest bardzo podobne do select z poprzedniego podrozdziału. RóŜnica polega na tym, Ŝe zamiast wywoływania metody executequery na obiekcie Statement, wołamy executeupdate. RównieŜ i w tym przypadku parametrem metody jest polecenie SQL. String sql = INSERT INTO PIWO_W_BARACH VALUES ('Bar u Ździśka', 'Dębowe Mocne', '2.8') ; int insertedrows = stmt.executeupdate(sql); 8

Zwracaną wartością jest w tym przypadku ilość rekordów które zostały wstawione. W przypadku DELETE wartością zwróconą będzie ilość usuniętych rekordów. Natomiast wykonanie UPDATE zwróci liczbę zmodyfikowanych rekordów. 4.3. Wykonywanie DDL Polecenia DDL są instrukcjami SQL umoŝliwiającymi manipulowanie strukturami przechowującymi dane (w odróŝnieniu od DML, które realizują operacje na danych). NaleŜą do nich polecenia CREATE, ALTER oraz DROP. Zlecenie wykonania ich przez serwer bazy danych zasadniczo nie róŝni się od wywołania polecenia INSERT czy UPDATE. Realizujemy je np. tak: Statement stmt = con.createstatement(); String sql = "drop table piwo_w_barach"; stmt.executeupdate(sql); 4.4. Wykonywanie procedur bazodanowych Serwery bazodanowe często posiadają swój własny język programowania, który umoŝliwia definiowanie tzw. procedur bazodanowych. Utworzone procedury mogą być wywoływane przez zewnętrzne aplikacje. Jednym z przykładów jest język PL/SQL dla bazy Oracle. Bazodanowe języki programowania są często lepiej przystosowane do wykonania pewnych akcji na bazie danych. Interfejs JDBC umoŝliwia wywoływanie takich procedur. Realizowane to jest przez obiekt implementujący interfejs CallableStatement. Bazodanową procedurę o nagłówku: uzupelnij_zapasy_piwa(id IN INTEGER, ile IN INTEGER, nazwa OUT VARCHAR2) moŝna wywołać w następujący sposób: CalableStatement ctmt = con.preparecall("{call uzupelnij_zapasy_piwa (?,?,?)}"); // w miejsce znaków? zostaną wstawione parametry dla wołanej procedury 9

ctmt.setint(1, idzapasupiwa); // pierwszym parametrem będzie wartość zmiennej idzapasupiwa ctmt.setint(2, dodatkowyzapaspiwa); // drugim dodatkowyzapaspiwa ctmt.registeroutparameter(3, java.sql.types.varchar); // trzecim parametrem procedury będzie parametr typu OUT VARCHAR ctmt.execute(); System.out.println("Zwiększono zapas piwa " + ctmt.getstring(3)); // pobranie wartości parametru nr 3 i wyświetlenie informacji na standardowe wyjście Metoda preparecall obiektu Connection słuŝy do tworzenia obiektów CallableStatement. W miejsce znaków zapytania (parametr metody preparecall) wstawiane są określone później wartości. Do określania tych wartości słuŝą metody setxxx obiektu CallableStatement, gdzie XXX to nazwa wstawianego typu. I tak np. ctmt.setint(1, idzapasupiwa) wstawi pod pierwsze wystąpienie znaku zapytania wartość zmiennej typu integer idzapasupiwa. Warto zwrócić uwagę na metodę registeroutparameter. Ustawia ona typ parametru wyjściowego procedury bazodanowej (OUT). Po zleceniu systemowi zarządzania bazą danych wykonania procedury (metoda execute), i faktycznym jej wykonaniu, parametry wyjściowe procedury moŝna pobrać metodą getxxx (XXX nazwa typu) obiektu CallableStatement. 5. Zarządzanie transakcjami W JDBC domyślnie kaŝda pojedyncza operacja jest transakcją i jest zatwierdzana automatycznie (ang. autocommit) po wywołaniu metod execute/executeupdate i pomyślnym wykonaniu jej przez serwer bazy danych. Gdy chcemy Ŝeby ciąg jakiś operacji wykonał się w całości albo wcale (np. przelew pieniędzy w banku z konta na konto), tryb taki nie będzie odpowiedni. MoŜna go zmienić wywołując metodę setautocommit obiektu klasy Connection z parametrem false. Do zatwierdzania transakcji słuŝy metoda commit a do wycofań rollback. Przykład wykorzystania: 10

try { // załoŝenie ze obiekt con klasy Connection został wcześniej zainicjalizowany con.setautocommit(false); //wyłączenie automatycznego zatwierdzania transakcji Statement stmt = con.createstatement(); stmt.executeupdate("update MAGAZYN SET ILOŚĆ = (ILOŚĆ - 10) WHERE PRODUCTID = 7"); // wykonanie modyfikacji danych tabeli MAGAZYN stmt.executeupdate("update WYSYŁKA SET WYSŁANE = (WYSŁANE + 10) WHERE PRODUCTID = 7"); // wykonanie modyfikacji danych tabeli WYSYŁKA con.commit(); // zatwierdzamy wykonanie transakcji System.out.println("Operacja zamówienia zakończona sukcesem ); } catch(exception e) { // wystąpił błąd try { con.rollback(); // wycofujemy transakcje } catch (SQLException ignored) {} System transakcyjny zaimplementowany w JDBC moŝe działać w róŝnych poziomach izolacji. Do wyboru mamy: TRANSACTION_NONE TRANSACTION_READ_COMMITTED TRANSACTION_READ_UNCOMMITTED TRANSACTION_REPEATABLE_READ TRANSACTION_SERIALIZABLE Odpowiedni poziom moŝemy ustawić za pomocą metody: Connection.setTransactionIsolation (odpowiednia stała z listy powyŝej); Warunkiem moŝliwości zastosowania wybranego poziomu izolacji jest konieczność wsparcia przez system zarządzania bazą danych. 11

Czasami moŝe być przydatny rollback części transakcji a nie całej. Specyfikacja JDBC w wersji 3.0 określa taką moŝliwość nosi ona nazwę transaction savepoints. Savepoint to nazwany punkt wewnątrz transakcji. Ustawia się go metodą setsavepoints(nazwa_savepointu) naleŝącą do obiektu klasy Connection. MoŜliwość cofnięcia transakcji do savepointu realizowane jest za pomocą metody rollback(nazwa_savepointu).. con.setautocommit(false); //wyłączenie automatycznego zatwierdzania transakcji Statement stmt = con.createstatement(); Savepoint save1 = con.setsavepoint("insert_point"); // ustawiamy savepoint stmt.executeupdate( INSERT INTO... ); //wykonujemy operacje na bazie danych Savepoint save2 = con.setsavepoint("update_point"); // ustawiamy kolejny savepoint stmt.executeupdate( UPDATE... ); //ponownie wykonujemy operacje na bazie... con.rollback(save2); // rollback do savepointa save2... con.commit(); // zatwierdzenie transakcji Tak jak w poprzednim przykładzie dotyczącym izolacji transakji, i tu, zarówno baza danych jak i sterowniki JDBC muszą wspierać savepointy. 6. Obsługiwanie wyjątków W trakcie działania aplikacji bazodanowej mogą zaistnieć róŝnego rodzaju sytuacje powodujące, Ŝe określone operacje na bazie zakończą się niepowodzeniem (np. próba utworzenia tabeli o istniejącej juŝ nazwie albo próba wstawienia nieunikatowej wartości do kolumny klucza głównego tabeli). Dlatego waŝne jest, aby nasza aplikacja potrafiła obsłuŝyć tego typu zdarzenia. Pomocny 12

okazuje się mechanizm obsługi wyjątków. W takich przypadkach wykorzystujemy klasę SQLException. Dziedziczy ona bezpośrednio z klasy Exception. Wyjątki SQL owe obsługujemy tak, jak wszystkie inne, z którymi spotkać moŝemy się w Javie. try { // operacje na bazie danych } catch (SQLException e) { // tu obsługujemy przechwycony wyjątek } 13

7. Bibliografia JDBC Technology http://java.sun.com/products/jdbc/index.jsp Java Server Programming - Jason Hunter, William Crawford Java Enterprise in a Nutshell, 3rd Edition - William Crawford, Jim Farley Introduction to JDBC http://www-db.stanford.edu/~ullman/fcdb/oracle/orjdbc.html Wikipedia http://pl.wikipedia.org JDBC Marek Misiowiec http://stencel.mimuw.edu.pl/abwi/20011218.b.jdbc/ 14