Plan wykładu. 1. Zaawansowane możliwości JDBC: rodzaje obiektów ResultSet, dodatkowe możliwości obiektów ResultSet, zapytania prekompilowane,

Podobne dokumenty
JAVA I BAZY DANYCH. MATERIAŁY:

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

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

JDBC (Java Database Connectivity vit )

Połączenie z bazą danych

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

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

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

Wprowadzenie do JDBC z wykorzystaniem bazy H2

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

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

Java, bazy danych i SSL

Java Database Connectivity

Bazy danych wykład dwunasty

Metody dostępu do danych

Łukasz Przywarty Wrocław, r. Grupa: WT/N 11:15-14:00. Sprawozdanie z zajęć laboratoryjnych: OpenSSL - API

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

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

Wzorce dystrybucji i wspólbieżności autonomicznej

SQL 4 Structured Query Lenguage

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

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

Podejście obiektowe do relacyjnych baz danych Hibernate.

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

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

Java rozszerzenie. dr. A. Dawid

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

Bezpieczne uruchamianie apletów wg

Oracle PL/SQL. Paweł Rajba.

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

Java Code Signing UŜycie certyfikatów niekwalifikowanych do podpisywania kodu w technologii Java. wersja 1.2 UNIZETO TECHNOLOGIES SA

Aplikacje Internetowe

Ustawienie na poziomie sesji (działa do zmiany lub zakończenia sesji zamknięcia połączenia).

DB+frontend Inne języki H2. Bazy Danych i Systemy informacyjne Wykład 9. Piotr Syga

Wywoływanie metod zdalnych

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

BAZY DANYCH. Transakcje. opracowanie: Michał Lech

Bazy Danych i Usługi Sieciowe

przygotował: Bazy danych Paweł Kasprowski Wersja 2006Z

Bazy danych i usługi sieciowe

Ćwiczenie 10 JDBC. Wywoływanie poleceń SQL z języków programowania. Ćwiczenie 10 JDBC. Wymagania: Bazy Danych

JAVA I SIECI. MATERIAŁY:

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

15. Funkcje i procedury składowane PL/SQL

akademia androida Składowanie danych część VI

Aplikacje RMI Lab4

Administracja i programowanie pod Microsoft SQL Server 2000

Bazy Danych i Systemy informacyjne Wykład 5. Piotr Syga

Wywoływanie metod zdalnych

Java Database Connectivity

Podstawy programowania III WYKŁAD 2

Bazy danych. Dr inż. Paweł Kasprowski

Generowanie dokumentów XML z tabel relacyjnych - funkcje SQLX

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie Obiektowe Java

Programowanie w języku Java

Aplikacje RMI

Programowanie Obiektowe Java

Sprawdzenie poziomu izolacji transakcji (w aktualnym połączeniu):

Oracle PL/SQL. Paweł Rajba.

Kurs programowania aplikacji bazodanowych

Łukasz Przywarty Wrocław, r. Grupa: WT/N 11:15-14:00. Sprawozdanie z zajęć laboratoryjnych: OpenSSL

Wzorce logiki dziedziny

SYSTEM INFORMATYCZNY KS-SEW

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

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

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

Paweł Rajba

Bartosz Jachnik - Kino

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

Administracja i programowanie pod Microsoft SQL Server 2000

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

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

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

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Wykorzystywanie parsera DOM w programach Java i PL/SQL

SQL Server i T-SQL w mgnieniu oka : opanuj język zapytań w 10 minut dziennie / Ben Forta. Gliwice, Spis treści

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

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Wykład 8. SQL praca z tabelami 5

Katalog książek cz. 2

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Podejście obiektowe do budowy systemów rozproszonych

Transakcje jednocześnie ACID

Oracle PL/SQL. Paweł Rajba.

CREATE USER

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

Wykład V. Indeksy. Struktura indeksu składa się z rekordów o dwóch polach

mysql> UPDATE user SET Password=PASSWORD('pass') WHERE user='root'; Query OK, 2 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0

Ćwiczenia 2 IBM DB2 Data Studio

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Bazy danych 2. Wykład 6 Transakcje

Transkrypt:

1 Plan wykładu 1. Zaawansowane możliwości JDBC: rodzaje obiektów ResultSet, dodatkowe możliwości obiektów ResultSet, zapytania prekompilowane, wywoływanie zdalnych procedur, transakcje. 2. SSL i bazy danych: przykład HSQLDB.

2 Rodzaje obiektów ResultSet Ze względu na dostęp do odebranych danych obiekty ResultSet dzielimy na: TYPE_FORWARD_ONLY odbiór danych kolejno od pierwszego do ostatniego rekordu, TYPE_SCROLL_INSENSITIVE dostęp do dowolnych danych, przygotowane wyniki nie zmieniają sie pod wpływem zmian w bazie. TYPE_SCROLL_SENSITIVE dostęp do dowolnych danych, przygotowane wyniki zmieniają sie pod wpływem zmian w bazie. Kolejność rekordów nie musi być stała. Rodzaj dostępu zmieniamy metodą setfetchdirection(int). Do przechodzenia między rekordami służą metody: next(), previous(), last(), first(), absolute(), relative().

3 Rodzaje obiektów ResultSet Obiekty ResultSet mogą mieć różne możliwości zmieniana odebranych danych: 1. CONCUR_READ_ONLY dane nie mogą być zmienione poprzez metody updatexxx(). najwyższy poziom współbieżności (największa liczba użytkowników jednocześnie operujących na danych jedyna możliwość w wersji JDBC 1.0 2. CONCUR_UPDATABLE dane mogą być zmieniane. zmniejszony poziom współbieżności, mniejsza wydajność.

Rodzaje obiektów ResultSet Connection con = DriverManager.getConnection( "jdbc:my_subprotocol:my_subname"); Statement stmt = con.createstatement( stmt.setfetchsize(25); ResultSet rs = stmt.executequery( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE, ResultSet.HOLD_CURSORS_OVER_COMMIT); "SELECT col1, col2 FROM table1"); Obiekt rs udostępnia dane w dowolnej kolejności, umożliwia zmianę danych, nie jest zamykany przy zatwierdzeniu transakcji. Do bazy danych zostaje przekazana sugestia, aby dane odbierać w pakietach po 25 rekordów. 4

5 Inne operacje na obiektach ResultSet 1. Usuwanie rekordów: rs.first(); rs.deleterow(); 2. Wstawianie rekordów: rs.movetoinsertrow(); rs.updateobject(1, myarray); rs.updateint(2, 3857); rs.updatestring(3, "Mysteries"); rs.insertrow(); rs.first();

6 Inne operacje na obiektach ResultSet Uwagi do wstawiania rekordów: 1. Na wstawianym rekordzie można wywoływać metody getxxx(). Jeśli odpowiednia wartość nie została ustawiona wcześniej metodą updatexxx() wartość zwracana będzie nieokreślona. 2. Aktualizacja wartości we wstawianym rekordzie nie zmienia obiektu ResultSet. 3. metoda insertrow(), dodająca rekord do obiektu ResultSet i do bazy danych zrzuca SQLException, jeśli liczba lub typy kolumn nie zgadzają się ze specyfikacją tabeli w bazie. 4. Bieżącym rekordem jest ten, który był nim przed wywołaniem metody movetoinsertrow().

Inne operacje na obiektach ResultSet Odczytywanie dużych porcji danych: Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select xdata FROM Table2"); byte [] buff = new byte[4096]; while (rs.next()) { InputStream fin = rs.getasciistream(1); for (;;) { int size = fin.read(buff); if (size == -1) break; // wypisanie danych System.out.write(buff, 0, size); } } 7

Prekompilowane zapytania JDBC przewiduje możliwość tworzenia prekompilowanych zapytań. Służy do tego klasa PreparedStatement wyprowadzona z klasy Statement. Przykłady: PreparedStatement pstmt = con.preparestatement( "UPDATE table4 SET m =? WHERE x =?"); PreparedStatement pstmt2 = con.preparestatement( "SELECT a, b, c FROM Table1", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstmt2.executequery(); Używanie prekompilowanych zapytań może zwiększyć szybkość działania programu. 8

Przekazywanie parametrów Przekazywanie parametrów: pstmt.setstring(1, "Hi"); for (int i = 0; i < 10; i++) { pstmt.setint(2, i); int rowcount = pstmt.executeupdate(); } Od wersji JDBC 2.0 można przekazywać parametry typu SQL BLOB oraz SQL ARRAY. PreparedStatement pstmt = con.preparestatement( "UPDATE Table3 SET Stats =? WHERE Depts =?"); pstmt.setblob(1, statistics); pstmt.setarray(2, departments); 9

10 Przekazywanie dużych parametrów Przykład pokazuje jak przesłać zawartość pliku jako parametr wejściowy: File file = new File("/tmp/data"); int filelength = file.length(); InputStream fin = new FileInputStream(file); PreparedStatement pstmt = con.preparestatement( "UPDATE Table5 SET stuff =? WHERE index = 4"); pstmt.setbinarystream (1, fin, filelength); pstmt.executeupdate(); Inny sposób polega na wykorzystaniu typów BLOB i CLOB.

11 Informacje o parametrach Dodatkowe dane o parametrach prekompilowanego zapytania można uzyskać poprzez interfejs ParameterMetaData (JDBC 3.0): PreparedStatement pstmt = con.preparestatement( "INSERT INTO QUOTAS (ID, LAST, FIRST, DEPT, QUOTA) " + "VALUES (?,?,?,?,?)"; ParameterMetaData paraminfo = pstmt.getparametermetadata(); int numberofparams = paraminfo.getparametercount(); for (int i = 1; i <= numberofparams; i++) { String dbtype = paraminfo.getparametertypename(i); System.out.println("Param " + i " is DBMS type " + dbtype); }

Serie prekompilowanych zapytań Podobnie jak w przypadku Statement istnieje możliwość przesłania serii zapytań. PreparedStatement pstmt = con.preparestatement( "UPDATE Table4 SET History =? WHERE ID =?"); pstmt.setclob(1, clob1); pstmt.setlong(2, 350985839); pstmt.addbatch(); pstmt.setclob(1, clob2); pstmt.setlong(2, 350985840); pstmt.addbatch(); int [] updatecounts = pstmt.executebatch(); Jeśli którekolwiek z zapytań UPDATE zwróci cokolwiek ponad liczbę zmienionych rekordów metoda executebatch() zrzuci wyjątek. 12

Zdalne procedury Do wywoływania zdalnych procedur używa się obiektów klasy CallableStatement: CallableStatement cstmt = con.preparecall( "{call updateprices(?,?)}"); cstmt.setstring(1, "Colombian"); cstmt.setfloat(2, 8.49f); cstmt.addbatch(); cstmt.setstring(1, "Colombian_Decaf"); cstmt.setfloat(2, 9.49f); cstmt.addbatch(); int [] updatecounts = cstmt.executebatch(); Procedura zostanie wywołana dwukrotnie Parametry przekazywane do procedury nazywamy parametrami IN. 13

Zdalne procedury odbieranie wyników Istnieje możliwość ustawienia parametrów przez zdalną procedurę (parametry OUT): CallableStatement cstmt = con.preparecall( "{call gettestdata(?,?)}"); cstmt.registeroutparameter(1, java.sql.types.tinyint); cstmt.registeroutparameter(2, java.sql.types.decimal); ResultSet rs = cstmt.executequery(); //... odczyt danych poprzez ResultSet byte x = cstmt.getbyte(1); // odczyt zwracanych parametrow BigDecimal n = cstmt.getbigdecimal(2); Procedura wypełnia przekazywane parametry. 14

15 Zdalne procedury odbieranie wyników Numeracja parametrów OUT: CallableStatement cstmt = con.preparecall( "{call gettestdata(25,?)}"); cstmt.registeroutparameter(1, java.sql.types.tinyint); Przy numeracji uwzględniane są tylko parametry oznaczone znakiem zapytania

Zdalne procedury parametry INOUT Parametry INOUT to takie, które są przekazywane do procedury a następnie modyfikowane przez wywołaną procedurę. CallableStatement cstmt = con.preparecall( "{call revisetotal(?)}"); cstmt.setbyte(1, (byte)25); cstmt.registeroutparameter(1, java.sql.types.tinyint); cstmt.executeupdate(); byte x = cstmt.getbyte(1); Parametr jest najpierw ustawiany IN a następnie rejestrowany jako OUT. Po wywołaniu procedury można odebrać jego nową wartość. Zaleca się odebranie wszystkich danych poprzez obiekt ResultSet przed odebraniem parametrów INOUT. 16

17 Transakcje Transakcje to zbiór operacji zgrupowanych w jednym lub wielu obiektach Statement. Aby zakończyć transakcję należy wywołać metodę commit() na rzecz obiuektu Connection. Domyślnie metoda commit() jest wywoływana po zakończeniu wykonywania zapytań w ramach jednego obiektu Statement. Aby to zmienić należy użyć metody setautocommit(false). Do anulowania zmian wprowadzonych przez niezatwierdzoną transakcję służy metoda rollback().

18 Poziomy izolacji Zwykle w systemy baz danych realizują jednocześnie wiele transakcji. Aby zapewnić kontrolę nad tym procesem wprowadzono tzw. poziomy izolacji, poprzez które określa się zasady równoległej realizacji kilku transakcji. JDBC przewiduje pięć poziomów izolacji: TRANSACTION_NONE brak transakcji. TRANSACTION_READ_UNCOMMITTED dopuszcza odczyt danych przed wywołaniem metody commit(). TRANSACTION_READ_COMMITTED inne transakcje nie mogą odczytywać zmienionych wierszy przed wywołaniem metody commit() (dirty reads).

19 Poziomy izolacji TRANSACTION_REPEATABLE_READ dodatkowo chroni przed sytuacją gdy transakcja odczytuje wiersz, druga transakcja go zmienia a pierwsza ponownie go odczytuje otrzymując inne dane (non-repetable reads). TRANSACTION_SERIALIZABLE dodatkowo chroni przed sytuacją, gdy jedna transakcja odczytuje zbiór wierszy spełniający kryteria zawarte w warunku WHERE, następnie druga transakcja wstawia wiersz spełniający ten warunek, po czym pierwsza transakcja ponownie odczytuje zbiór wierszy dostając nowy rekord (phantom-read). Poziomy izolacji ustawia się metodą settransactionisolation(int) wywołaną na rzecz obiektu klasy Connection.

Etapy transakcji - Savepoints Obiekt Savepoint (JDBC 3.0) umożliwia częściowe odwrócenie (rollback) transakcji zamiast całkowitego. Do utworzenia tego obiektu służy metoda setsavepoint(). Statement stmt = con.createstatement(); int rows = stmt.executeupdate("insert INTO AUTHORS VALUES " + "(LAST, FIRST, HOME) 'TOLSTOY', 'LEO', 'RUSSIA'"); Savepoint save1 = con.setsavepoint("savepoint_1"); int rows = stmt.executeupdate("insert INTO AUTHORS VALUES " + "(LAST, FIRST, HOME) 'MELVOY', 'HAROLD', 'FOOLAND'");... con.rollback(save1);... con.commit(); 20

HSQLDB SSL HSQLDB umożliwia szyfrowanie transmisji. Aby taka transmisja była możliwa zarówno serwer jak i klient muszą być odpowiednio skonfigurowane. Konfiguracja serwera: 1. Generowanie certyfikatu serwera: >keytool -genkey -alias hsqldb -keyalg RSA -validity 30 -keystore hsqlserver.store Enter keystore password: hsqldb What is your first and last name?... [Unknown]: localhost Is CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct? [no]: yes Enter key password for <hsqldb> (RETURN if same as keystore password): 21

22 HSQLDB SSL Inny sposób generowania klucza gdy posiadamy certyfikat podpisany przez zewnętrzne Centrum Autoryzacji openssl pkcs8 -topk8 -outform DER -in Xpvk.pem -inform PEM -out Xpvk.pk8 -nocrypt openssl x509 -in Xcert.pem -out Xcert.der -outform DER java DERImport server.store NEWALIAS Xpvk.pk8 Xcert.der UWAGA: hasło dla klucza musi być takie samo jak hasło dla server.store!

23 HSQLDB SSL 2. Uruchomienie serwera: >java -Djavax.net.ssl.keyStorePassword=hsqldb -Djavax.net.ssl.keyStore=hsqlserver.store -cp hsqldb.jar org.hsqldb.server [Server@13c5982]: [Thread[main,5,main]]: checkrunning(false) entered... [Server@13c5982]: Using TLS/SSL-encrypted JDBC... [Server@13c5982]: Startup sequence completed in 978 ms. [Server@13c5982]: 2006-03-19 10:16:28.100 HSQLDB server 1.8.0 is online

Po stronie klienta należy: HSQLDB SSL 1. Uzyskać certyfikat serwera np: >keytool -export -keystore server.store -alias hsqldb -file server.cer Enter keystore password: hsqldb Certificate stored in file <server.cer> Jeśli nie mamy dostępu do server.store możemy użyć dowolnego narzędzia do połączenia się z serwerem i odebrania certyfikatu np: openssl s_client -connect host:port - zakodowany w Base64 certyfikat pojawi sie na ekranie pomiędzy liniami -----BEGIN CERTIFICATE-----... ----END CERTIFICATE-----. Ten fragment zapisujemy do pliku server.cer. 24

2. Dodać certyfikat serwera jako zaufany: HSQLDB SSL >keytool -import -trustcacerts -keystore hsqlclient.store -alias hsql -file hsqlserver.cer Enter keystore password: hsqldb Owner: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown Issuer: CN=localhost, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown Serial number: 441d1f43 Valid from: Sun Mar 19 10:07:15 CET 2006 until: Tue Apr 18 11:07:15 CEST 2006 Certificate fingerprints: MD5: 68:A2:33:BA:FA:4B:08:4A:E2:21:DD:E5:F6:7B:E3:8A SHA1: 59:6A:4D:66:03:C8:D6:B0:D1:4C:0B:1B:30:E2:90:0F: 88:66:EC:40 Trust this certificate? [no]: yes Certificate was added to keystore 25

26 HSQLDB SSL JVM musi zostać poinformowana, ze w pliku hsqlclient.store znajdują się zaufane certyfikaty. Można to zrobić na trzy sposoby: a) plik hsqlclient.store należy dodać do katalogu z zaufanymi certyfikatami (w JDK zwykle: JAVA_HOME/jre/lib/security/cacerts), b) wywołać program kliencki z opcją: -Djavax.net.ssl.trustStore=/sciezka/do/hsqlclient.store c) w kodzie programu klienckiego użyć instrukcji: System.getProperties().put("javax.net.ssl.trustStore", "/sciezka/do/hsqlclient.store");

27 HSQLDB SSL Przykładowy program klienta: import java.sql.*; public class HSQLDb { public static void main(string[] args){ System.getProperties().put("javax.net.ssl.trustStore", "/sciezka/do/hsqlclient.store"); System.getProperties().put("javax.net.debug","all"); try { Class.forName("org.hsqldb.jdbcDriver").newInstance(); } catch (Exception e) { e.printstacktrace(); return; }

28 HSQLDB SSL } } try { Connection con = DriverManager.getConnection( "jdbc:hsqldb:hsqls://localhost/test", "sa", ""); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select NOW()"); rs.next(); System.out.println(rs.getString(1)); con.close(); } catch (SQLException ex) { ex.printstacktrace(); } }