Java i bazy danych Programowanie z wykorzystaniem JDBC mgr inż. Piotr Kopniak
Omawiane zagadnienia Wstęp do technologii baz danych Sposoby połączenia z bazą danych Sterowniki JDBC Połączenie z bazą danych poprzez JDBC Język SQL (Structured Query Language) Praca z bazą danych poprzez JDBC Jak stworzyć prostą aplikację pracującą z bazą danych w Javie
Bazy danych I Baza danych - zbiór danych zorganizowany logicznie w postaci tabel. Każda tabela składa się z kolumn różnych typów wierszy (krotek, rekordów). System zarządzania bazą danych (w skrócie SZBD lub DBMS) - oprogramowanie zarządzające danymi zarządzające fizycznie danymi w bazie danych. Warstwa dająca użytkownikowi (programiście) możliwość logicznego manipulowania danymi.
Bazy danych II Relacyjna baza danych - zbiór danych powiązanych ze sobą relacjami zapewniającymi spójność danych. Relacja jest to związek dwóch rekordów w tej samej tabeli lub różnych tabelach powiązanych logicznie, np. jeden wiersz z tabeli Faktura związany jest z kilkoma wierszami z tabeli Pozycje faktur. Obiektowa baza danych - baza przechowująca obiekty, tzn. nie tylko dane ale także funkcje na nich operujące, czyli obiekt. Fizyczna budowa - plik lub zbiór plików na jednym lub wielu woluminach. Plik może zawierać całą bazę danych lub odpowiadać jednej tabeli. Baza posiada także pliki specjalnego przeznaczenia, np. pliki przechowujące indeksy i pliki logowania transakcji.
Połaczenie z bazą danych Aplikacja klienta - program z którego korzysta użytkownik. Dostarcza interfejs do wprowadzania i prezentacji danych. Sterownik - program tłumaczący instrukcje wstawiania i pobierania danych np.. w języku SQL na wywołania funkcji API SZBD SZBD - program zarządzający fizycznymi danymi zgromadzonymi w bazie danych BD - baza danych lub zestaw rozproszony baz danych Aplikacja zdalna - aplikacja pracująca na serwerze WWW (wykonana jako servlet lub strona jsp) lub komponent umieszczony na serwerze aplikacji komunikujący się z bazą danych i przesyłający często dodatkowo przeliczone lub przefiltrowane dane do klienta BD SZB D Aplikacja klienta Stero wnik Sieć Stero wnik Aplikacja zdalna
Połaczenie z bazą danych w Javie Sterownik JDBC (Java Database Connectivity) - zestaw klas najczęściej w pliku *.jar dystrybuowany przez producentów SZBD lub firmy trzecie Servlet - aplikacja działająca w kontenerze serwera WWW np. Tomcat lub JServ. Po pierwszym odwołaniu utworzona instancja przechowuje informacje o swoim stanie i stanie połączeń sieciowych sesjach. Wielowątkowo obsługuje wielu użytkowników. JSP - dynamiczna strona internetowa, wymieszany kod HTML i Javy. W momencie pierwszego odwołania klienta jest kompilowana do servletu, który przejmuje obsługę żądania. BD SZBD Aplikacja, aplet, napisany w Javie Sterownik JDBC Sieć Aplikacja JSP lub Servlet ODBC Sterownik JDBC
Sterowniki JDBC Generacja 1 JDBC - ODBC Bridge Driver –ODBC (Open Dartabase Connectivity) –Sterownik korzystający z dostępnych sterowników ODBC - wymaga jego instalacji Generacja 2 Native - API Partly - Java Driver –sterownik napisany w języku JAVA –korzystający z funkcji napisanych w innych języka np.. w C Generacja 3 NET - Protocol All - Java Driver –sterownik korzystając z protokołów sieciowych i gniazd bezpośrednio łączy się z komponentem pośrednim na serwerze –nie wymaga dodatkowych instalacji –umożliwia korzystanie z różnorakich baz danych Generacja 4 Native - Protocol All - Java Driver –połączenie za pomocą sieci i gniazd z silnikiem bazy danych industry.java.sun.com/products/jdbc/drivers (obecnie 221)
Wybrane klasy i interfejsy JDBC I java.sql.Driver –interfejs odpowiedzialny za połączenie z bazą danych - tłumaczy zapytania SQL-a na instrukcje dla bazy danych java.sql.DriverManager –klasa zarządzająca listą dostępnych sterowników i udostępniająca wymagany sterownik dla aplikacji. Posiada m.in.. metody registerDriver(), deregisterDriver() java.sql.Connection –interfejs reprezentujący połączenie z bazą danych java.sql.Statement –interfejs reprezentujący zapytanie SQL-owe, które wysyłane jest w celu wykonania do bazy danych. Podstawowe metody ResultSet executeQuery(), int executeUpdate()
Wybrane klasy i interfejsy JDBC II java.sql.ResultSet –interfejs będący zbiorem rekordów zwróconych z bazy danych w wyniku wykonania zapytania, czyli jest taką wirtualną tabelą (tablicą w pamięci). Podstawowe metody: getXXX(), np. getString(), next(), previous() java.sql.RowSet –Rozszerza ResultSet o możliwości JavaBeans (właściwości, odbiorcy zdarzeń) – łatwiejsza praca na danych (przewijanie wyników, modyfikacje danych) od JDK 1.4 – s.pdf java.sql.SQLException –klasa umożliwiająca dostęp do informacji o błędzie bazy danych (zgodnie z XOPEN SQL)
Połączenie poprzez most JDBC:ODBC Rejestracja źródła ODBC do bazy Access I 1. Utworzenie bazy danych w Accessie i zapis do pliku *.mdb (należy zapamiętać ścieżkę) 2. Rejestracja źródła ODBC. –W panelu sterowania wybieramy program 32bit ODBC lub uruchamiamy bezpośrednio program odbcad32.exe z katalogu Windows/System32. –Na zakładce źródła systemowe lub użytkownika wybieramy Dodaj i tworzymy nowe źródło. Podajemy jego nazwę (którą musimy zapamiętać), wybieramy odpowiedni sterownik do bazy danych z listy oraz wskazujemy plik bazy danych.
Połączenie poprzez most JDBC:ODBC Rejestracja źródła ODBC do bazy Access II
Połączenie do bazy danych poprzez JDBC I URL bazy danych URL (Uniform Resource Locator) bazy danych –Konstrukcja adresu: jdbc: : –Różne dla różnych producentów jdbc:odbc:baza – most jdbc-odbc (baza – nazwa źródła ODBC) jdbc:msql://db_serwer:port/baza – baza MSQL jdbc:mysql://[host:port],[host:port].../ [database][?propertyName1][=propertyValu e1][&propertyName2][=propertyValue2]... - baza MySQL jdbc:oracle:thin:dbhost:1234:baza – baza Oracle
Połączenie do bazy danych poprzez JDBC II Klasy sterownika Instalacja sterownika – mysql-connector-java-[version]-bin.jar Ustawienie zmiennej systemowej CLASSPATH – $ setenv CLASSPATH /path/to/mysql- connector-java-[version]- bin.jar:$CLASSPATH UNIX – C:\> set CLASSPATH=\path\to\mysql- connector-java-[version]- bin.jar;%CLASSPATH% WINDOWS Załadowanie sterownika w programie – Class.forName(com.mysql.jdbc.Driver); – Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);
Przykład połączenia do bazy poprzez JDBC I ( import java.sql.*; public class myConnection { public static void main( String[] args ) { try { // Using Sybase jConnect 4.2 Class.forName("com.sybase.jdbc.SybDriver"); // Using Sybase jConnect 5.2 //Class.forName("com.sybase.jdbc2.jdbc.SybDriver"); Connection conn = DriverManager.getConnection("jdbc:sybase:Tds:testmachine -pc:2638", "dba", "sql");
Przykład połączenia do bazy poprzez JDBC II Statement stmt = conn.createStatement( ); ResultSet rs = stmt.executeQuery( "SELECT * FROM EMPLOYEE"); while ( rs.next( ) ) { System.out.println( rs.getInt( 1 ) ); } } catch ( Exception e ) { System.out.println( "An exception occurred." ); } } // end of main } // end of MyConnection class
SQL (Structured Query Language) SELECT - instrukcja pobrania danych z bazy, np.. Select * from studenci Select Nazwisko, Imie, Sum(nieobecnosc), Avg(ocena) from studenci s, obecnosci ob, oceny oc where ob.id_student=s.id_student and oc.id_student=s.id_student and s.nazwisko like No% and ob.nieobecnosc>2 or (oc.cwiczenia=java and oc.ocena>2) INSERT - instrukcja wstawiania do bazy danych, np.. Insert into oceny (id, cwiczenia, ocena) values (1, java, 5.0) UPDATE - instrukcja modyfikacji danych, np.. update studenci set ocena_java = 5.0 update obecnosci set obecnosc=usprawiedliwiona where data between and
Praca z bazą danych poprzez JDBC I Pobieranie danych Statement stmt = conn.createStatement( ); ResultSet rs = statement.exequteQuery(Select * from studenci); while ( rs.next( ) ) { System.out.println( rs.getString( 1 ) ); } Modyfikacja danych int ile_zmodyfikowano = statement.exequteUpdate( Insert into oceny (id, cwiczenia, ocena) values (1, java, 5.0)); int ile_zmodyfikowano = statement.exequteUpdate(update studenci set ocena_java = 5.0);
Praca z bazą danych poprzez JDBC II Obsługa transakcji –Włączenie własnej obsługi transakcji: connection.setAutocommit(false); –Zatwierdzenie transakcji: connection.commit(); –Cofniecie zmian: connection.rollback(); Rodzaje ResultSet –Domyślnie – przesuwany w dół, do odczytu stm = con.createStatement(); –Przewijany w obie strony, nie reagującu na zmiany w bazie, z mozliwością modyfikacji danych stm = con.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); Modyfikacja danych poprzez ResultSet –UPDATE rs.first();rs.updateString(Miasto, Lublin); –DELETE rs.absolute(100);rs.deleteRow(); –INSERT rs.moveToInsertRow(); rs.update...;rs.insertRow();
Praca z bazą danych poprzez JDBC III Zapytania z parametrem – Prepared Statements PreparedStatement pstm = conn.prepareStatement(UPDATE STUDENT SET OCENA=? WHERE OBEC_NA_WYKL>?); pstm.setString(1, bdb); pstm.setInt(10); stm.execute(); Wywoływanie procedur składowanych – Callable Statements CallableStatement cstm = conn.prepareCall({?=call best_transaction(?,?)}); cstm.registerOutParameter(1,java.sql.Types.INTEGER); cstm.setDate(2,data_od); cstm.setDate(3,data_do); cstm.execute();
Praca z bazą danych poprzez JDBC IV Metadane –ResultSetMetaData: getColumnCount(), getColumnLabel(), isCaseSensitive(), itd. –DatabaseMetaData: getTables(), getPrimaryKeys(), getUserName(), itd. Więcej o JDBC – /basics/index.html – /distributed/