JDBC (Java Database Connectivity vit )



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

JAVA I BAZY DANYCH. MATERIAŁY:

Bazy danych wykład dwunasty

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

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

Połączenie z bazą danych

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

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

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

Java Database Connectivity

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

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

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

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

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

Dostęp do baz danych z aplikacji J2EE

Metody dostępu do danych

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

Aplikacje Internetowe

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

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Java Database Connectivity

Łą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:

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

Dostęp do baz danych w aplikacjach Java EE

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

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

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

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

Technologia JDBC w praktyce

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

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

Obs³uga transakcji rozproszonych w jêzyku Java

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

Kurs programowania aplikacji bazodanowych

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

Transakcje w systemach Java Enterprise Korzystanie z baz danych w serwerach aplikacji

Podejście obiektowe do relacyjnych baz danych Hibernate.

Aplikacje WWW - laboratorium

Programowanie Obiektowe Java

PODSTAWY BAZ DANYCH 13. PL/SQL

Oracle PL/SQL. Paweł Rajba.

PL/SQL. Zaawansowane tematy PL/SQL

Protokół JDBC współpraca z relacyjnymi bazami danych lab3

Podstawy programowania III WYKŁAD 2

1) Przygotowanie środowiska pracy.

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Programowanie Obiektowe Java

Wywoływanie metod zdalnych

15. Funkcje i procedury składowane PL/SQL

Oracle PL/SQL. Paweł Rajba.

Programowanie w języku Java

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Współpraca aplikacji WWW z bazami danych

Java rozszerzenie. dr. A. Dawid

Dostęp do baz danych przy wykorzystaniu interfejsu JDBC

Wzorce logiki dziedziny

Bazy danych SQLite w Javie

Wywoływanie metod zdalnych

Dokumentacja do API Javy.

Aplikacje Internetowe

1 Wprowadzenie do J2EE

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

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

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

Kurs programowania aplikacji bazodanowych

Programowanie obiektowe zastosowanie języka Java SE

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

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

Stanowe komponenty sesyjne

Programowanie obiektowe

przygotował: Bazy danych Paweł Kasprowski Wersja 2006Z

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Dostęp do baz danych przy wykorzystaniu interfejsu PDO

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Programowanie obiektowe

Pakiety podprogramów Dynamiczny SQL

Laboratorium Programowania Kart Elektronicznych

Dlaczego JDBC jest lepszy ni ODBC? Zgodno ze standardami SQL. Sterowniki.

Aplikacje RMI

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Projektowanie systemów baz danych

Database Connectivity

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

Składowane procedury i funkcje

Systemy GIS Tworzenie zapytań w bazach danych

Aplikacje internetowe i rozproszone - laboratorium

Połączenia między bazami danych i programem w języku Java część 2

Integracja systemów transakcyjnych

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

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

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

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Transkrypt:

1 JDBC (Java Database Connectivity) Marek Wojciechowski

Czym jest JDBC? 2 JDBC jest standardowym interfejsem do współpracy aplikacji Java z relacyjną bazą danych JDBC definiuje standardowe interfejsy interfejsy są implementowane przez sterowniki JDBC standard dopuszcza rozszerzenia producentów Zaprojektowany na podstawie X/Open SQL Call Level Interface (podobny do ODBC) Interfejs dla dynamicznych instrukcji SQL Opracowany przez Sun Microsystems Powszechnie wspierany przez producentów systemów baz danych i narzędzi programistycznych

Architektura JDBC 3 Program Java JDBC API Menedżer sterowników JDBC JDBC Pure Java driver Typ 3 Typ 4 JDBC Partial Java driver Biblioteka klienta JDBC-ODBC Bridge driver * Sterownik ODBC Warstwa pośrednia Typ 2 BD BD BD Biblioteka klienta Typ 1 * sun.jdbc.odbc.jdbcodbcdriver

Typy sterowników JDBC 4 Typ I Most JDBC-ODBC umożliwia połączenie z każdą bazą danych, dla której istnieje sterownik ODBC Typ II Sterownik napisany częściowo w Javie, wykorzystujący biblioteki klienta bazy danych najbardziej wydajne rozwiązanie wymaga preinstalowanego oprogramowania klienta bazy danych Typ III Uniwersalny sterownik w czystej Javie, z obsługą specyficznych baz danych w warstwie pośredniej najbardziej elastyczna architektura Typ IV Sterownik w czystej Javie, komunikujący się bezpośrednio z serwerem bazy danych nie wymaga bibliotek klienta bazy danych

Sterowniki JDBC Oracle 5 JDBC Thin (typ IV) w 100% napisany w czystej Javie JDBC OCI (typ II) wykonuje wywołania OCI do fabrycznego sterownika, preinstalowanego po stronie klienta Server-side internal driver wykorzystywany przez aplikacje Java uruchamiane wewnątrz serwera Oracle (np. Java Stored Procedures) Server-side Thin driver oracle.jdbc.oracledriver wykorzystywany przez aplikacje Java uruchamiane wewnątrz serwera Oracle do nawiązywania połączeń z innymi serwerami

Podstawowe klasy JDBC (pakiet java.sql) 6 DriverManager Connection Statement PreparedStatement CollableStatement ResultSet DatabaseMetaData ResultSetMetaData SQLException

Rejestrowanie sterowników JDBC 7 Sterowniki JDBC muszą się rejestrować w menedżerze sterowników (DriverManager) Sterowniki rejestrują się automatycznie podczas ich ładowania (w przypadku większości JVM) try { // Oracle JDBC driver (Thin + OCI) Class.forName("oracle.jdbc.OracleDriver"); // IBM DB2 Universal Database app driver Class.forName("COM.ibm.db2.jdbc.app.DB2Driver"); // JDBC-ODBC bridge driver Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Java DB (derby) driver Class.forName("org.apache.derby.jdbc.ClientDriver");} catch (ClassNotFoundException e) {... }

Nawiązywanie połączenia z bazą danych Menedżer sterowników zarządza sterownikami JDBC i służy do otwarcia połączenia z bazą danych Baza danych jest wskazywana przez podanie JDBC URL, identyfikującego sterownik JDBC i bazę danych: jdbc:<subprotocol>:<connectstring> Na podstawie JDBC URL menedżer sterowników (DriverManager) wybiera odpowiedni sterownik JDBC spośród zarejestrowanych sterowników 8

Formaty JDBC URL - Przykłady 9 JDBC-ODBC Bridge jdbc:odbc:<odbc_data_source> Oracle OCI Oracle Thin jdbc:oracle:oci:@<service_name> jdbc:oracle:thin:@<host>:<port>:<sid> IBM DB2 app IBM DB2 net jdbc:db2:<db_name> jdbc:db2://<host>:<port>/<db_name> MySQL jdbc:mysql://<host>:<port>/<db_name> Java DB (Derby) jdbc:derby://<host>:<port>/<db_name>

Wyjątek SQLException 10 Wywołania JDBC mogą generować wyjątek java.sql.sqlexception Metody zawierające wywołania JDBC muszą obsługiwać ten wyjątek lub deklarować możliwość jego generowania Wyjątek SQLException niesie następujące informacje: kod "SQL state" (zgodny ze specyfikacją XOPEN SQL) tekstowy komunikat o błędzie numeryczny kod błędu (specyficzny dla danego DBMS) try { conn = DriverManager.getConnection("jdbc:odbc:Finance", "scott","tiger"); } catch (SQLException e) { System.err.println("Error: " + e); String sqlstate = e.getsqlstate(); String message = e.getmessage(); int errorcode = e.geterrorcode();... }

Polecenia SQL w JDBC 11 Polecenie Statement wykonywanie zapytań lub operacji DML/DDL Polecenie PreparedStatement (wywiedzione z Statement) wykonywanie poleceń prekompilowanych możliwość zaszycia zmiennych przydatne gdy to samo polecenie jest wykonywane kilkukrotnie dla różnych wartości zwiększa odporność na ataki SQL injection Polecenie CallableStatement (wywiedzione z PreparedStatement) wywoływanie procedur i funkcji składowanych w bazie danych zachowana możliwość zaszywania zmiennych

Klasa Statement 12 Wykonywanie zapytań (metoda executequery() zwracająca zbiór wynikowy ResultSet) try { Statement stmt = conn.createstatement(); ResultSet rset = stmt.executequery ("SELECT name, salary FROM employees");... } catch (SQLException e) { } Wykonywanie poleceń DML i DDL (metoda executeupdate()) try { Statement stmt = conn.createstatement(); stmt.executeupdate ("DELETE FROM employees WHERE id = 120"); } catch (SQLException e) { }

Przetwarzanie zbiorów wynikowych 13 Obiekt ResultSet przechowuje tabelę danych wynikowych zwróconych przez zapytanie SQL Obsługa kursorów kursor startuje od pozycji przed pierwszym rekordem zbioru wynikowego metoda next() przesuwa kursor na następny rekord (zwraca true, gdy znaleziono kolejny rekord) od JDBC 2.0 są przewijalne i modyfikowalne zbiory wynikowe Dane odczytuje się przy pomocy metod getxxx() np. getint(), getstring(), które odwzorowują wyniki w równoważne typy języka Java Dostęp do pól bieżącego rekordu odbywa się przez numer na liście wyrażeń w zapytaniu lub nazwę atrybutu

Przetwarzanie zbiorów wynikowych - Przykłady 14 try { ResultSet rset = stmt.executequery( "SELECT name, salary FROM employees"); while (rset.next()) { String name = rset.getstring(1); int salary = rset.getint(2); } } catch (SQLException e) { } try { ResultSet rset = stmt.executequery( "SELECT name, salary FROM employees"); while (rset.next()) { String name = rset.getstring("name"); int salary = rset.getint("salary"); } } catch (SQLException e) { }

JDBC kompletny przykład 15 import java.sql.*; public class MyDemo { public static void main(string[] args) throws ClassNotFoundException, SQLException { Connection conn; Statement stmt; ResultSet rset; }} Class.forName("oracle.jdbc.OracleDriver"); conn = DriverManager.getConnection( "jdbc:oracle:thin:@srv1:1521:orcl","scott","tiger"); stmt = conn.createstatement(); rset = stmt.executequery("select name, salary from employees"); while (rset.next()) { System.out.print(rset.getString("NAME")+" "); System.out.println(rset.getString("SALARY")); } rset.close(); stmt.close(); conn.close();

JDBC 4.1 zarządzanie zasobami 16 try (Statement stmt = con.createstatement()) { ResultSet rs = stmt.executequery(query); while (rs.next()) {... = rs.getxxx("...");... } } catch (SQLException e) {... } Opuszczenie bloku try (normalne zakończenie lub wystąpienie wyjątku) spowoduje automatyczne zamknięcie obiektu polecenia (Statement) Zamknięcie polecenia powoduje zamknięcie zbiorów wynikowych (ResultSet) z nim związanych Analogicznie można obsłużyć zamknięcie połączenia (Connection)

Konwersje typów między SQL i Java 17 Dla każdego typu SQL istnieje jeden lub więcej typów Java, do których możliwa jest konwersja: CHAR -> String, int, double, float, java.math.bigdecimal,... NUMBER -> int, double, float, java.math.bigdecimal,... DATE -> Date, Time, Timestamp, String... Konwersja z SQL do Java może wiązać się z utratą precyzji Producenci systemów baz danych mogą dostarczać typy Java pozwalające na uniknięcie utraty precyzji przy konwersji z SQL (przykładem jest Oracle) Specyficzne typy Java do obsługi typów Oracle SQL: CHAR -> oracle.sql.char NUMBER -> oracle.sql.number DATE -> oracle.sql.date... Do konwersji do typów oracle.sql.* służą odpowiednie metody getxxx() np. getchar()

Klasa PreparedStatement 18 Umożliwiają wielokrotne wykonanie tego samego polecenia dla różnych wartości parametrów wydajność Parametry wstawia się za pomocą znaku? Zapobieganie atakom SQL injection try { Connection conn = DriverManager.getConnection( ); PreparedStatement pstmt = conn.preparestatement( "UPDATE employees SET salary = 9000 WHERE id =?"); } catch (SQLException e) { }

Wiązanie zmiennych i wykonywanie polecenia PreparedStatement Przed wywołaniem polecenia PreparedStatement należy związać parametry z konkretnymi wartościami Parametry wiąże się metodami setxxx() klasy PreparedStatement 19 try { PreparedStatement pstmt = conn.preparestatement( "UPDATE employees SET salary = 8900 WHERE id =?"); pstmt.setint(1, 120); pstmt.executeupdate(); pstmt.setint(1, 130); pstmt.executeupdate(); } catch (SQLException e) { }

Transakcje 20 Przetwarzanie transakcyjne zależy od właściwości autocommit obiektu Connection domyślnie true, co oznacza oddzielną transakcję dla każdego polecenia SQL (każda instrukcja jest automatycznie zatwierdzana) do zmiany trybu służy metoda setautocommit() gdy autocommit == false: commit() - zatwierdzenie transakcji rollback() - wycofanie transakcji setsavepoint() - ustawienie punktu bezpieczeństwa Connection conn = DriverManager.getConnection( ); conn.setautocommit(false); // zmiana trybu... // polecenia SQL conn.commit(); // zatwierdzenie... // polecenia SQL conn.rollback(); // wycofanie transakcji

Źródła danych (DataSources) 21 Obiekt DataSource reprezentuje źródło danych (np. DBMS) Obiekt DataSource w zakresie uzyskiwania połączenia z bazą danych jest alternatywą dla DriverManager przede wszystkim w aplikacjach Java EE (na serwerze aplikacji) Źródło DataSource może wspierać: transakcje rozproszone obsługę pul połączeń Źródło DataSource może zostać zarejestrowane w JNDI Aplikacja łącząc się z bazą danych: wyszukuje źródło danych w JNDI przez jego logiczną nazwę poprzez obiekt DataSource uzyskuje obiekt Connection Połączenie uzyskane poprzez DataSource może brać udział w transakcjach rozproszonych i/lub funkcjonować w ramach puli połączeń zależnie od właściwości źródła

Definicja źródła danych Przykład 22 Przykład dla serwera GlassFish domain.xml <resources> <jdbc-resource enabled="true" jndi-name="jdbc/sample" object-type="user" pool-name="samplepool"/> <jdbc-connection-pool... datasource-classname="org.apache.derby.jdbc.clientdatasource" max-pool-size="32" name="samplepool" res-type="javax.sql.datasource"... > <property name="databasename" value="sample"/> <property name="user" value="app"/> <property name="password" value="app"/> <property name="url" value="jdbc:derby://localhost:1527/sample"/> <property name="portnumber" value="1527"/> <property name="servername" value="localhost"/> </jdbc-connection-pool> </resources>

Korzystanie ze źródeł danych Przykład 23 Dostęp do źródła poprzez jawne wyszukanie w serwisie nazw JNDI (ang. lookup) Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/sample"); Connection conn = ds.getconnection();... Dostęp do źródła dzięki wstrzykiwaniu zależności (ang. dependency injection) @Resource(name="jdbc/sample") private DataSource ds; Connection conn = ds.getconnection();...