Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałJadzia Jędrzejek Został zmieniony 11 lat temu
1
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej JDBC Database Access Wykład 12 mgr inż. Michał Misiak
2
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 Przykładowe architektury Aplikacja Java JDBC Właściwy protokół DBMS Maszyna klienta Serwer bazodanowy Architektura dwuwarstwowaArchitektura 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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: [lista_wlasciwosci] Connection conn = DriverManager.getConnection("jdbc:XXXX:BazaDanych", login, pass);
9
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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"/> 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 db.sid=sun-appserv-samples db.url=jdbc:derby://${db.host}:${db.port}/${db.sid};create=true; db.user=APP db.pwd=APP Źródło: http://java.sun.com/docs/books/tutorial/jdbc/overview/index.html
11
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 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
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.