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



Podobne dokumenty
JDBC (Java Database Connectivity vit )

Java Database Connectivity

JAVA I BAZY DANYCH. MATERIAŁY:

1 Wprowadzenie do J2EE

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

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)

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

Połączenie z bazą danych

Metody dostępu do danych

Dostęp do baz danych z aplikacji J2EE

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

Bazy danych wykład dwunasty

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

Aplikacje WWW - laboratorium

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

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

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

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

Analiza porównawcza technologii tworzenia aplikacji internetowych dla baz danych Oracle

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

Współpraca aplikacji WWW z bazami danych

Analiza porównawcza technologii tworzenia aplikacji internetowych dla baz danych Oracle

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

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

Obs³uga transakcji rozproszonych w jêzyku Java

Java Database Connectivity

Aplikacje internetowe i rozproszone - laboratorium

Dostęp do baz danych w aplikacjach Java EE

Java rozszerzenie. dr. A. Dawid

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

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Aplikacje Internetowe

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

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

Kurs programowania aplikacji bazodanowych

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

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

Wprowadzenie do J2EE. Maciej Zakrzewicz.

Programowanie obiektowe

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

Technologia JDBC w praktyce

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

Projektowanie aplikacji J2EE w architekturze Model-View-Controller

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

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

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

EJB 3.0 (Enterprise JavaBeans 3.0)

15. Funkcje i procedury składowane PL/SQL

Kurs programowania aplikacji bazodanowych

PODSTAWY BAZ DANYCH 13. PL/SQL

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

Aplikacje Internetowe, Servlety, JSP i JDBC

Multimedia JAVA. Historia

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

PL/SQL. Zaawansowane tematy PL/SQL

Wybrane działy Informatyki Stosowanej

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

Wybrane działy Informatyki Stosowanej

Programowanie obiektowe

1) Przygotowanie środowiska pracy.

Architektura Model-View-Controller

Programowanie obiektowe

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

Podejście obiektowe do relacyjnych baz danych Hibernate.

Podstawy programowania III WYKŁAD 2

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

Wzorce logiki dziedziny

Aplikacje RMI

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie


Wywoływanie metod zdalnych

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Serwery aplikacji. mgr Radosław Matusik. Wydział Matematyki i Informatyki Uniwersytetu Łódzkiego radmat radmat@math.uni.lodz.

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

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

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Oracle PL/SQL. Paweł Rajba.

Programowanie w Sieci Internet JSP ciąg dalszy. Kraków, 9 stycznia 2015 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Plan prezentacji. Budowa aplikacji w technologii Enterprise JavaBeans. Przegląd architektur: CORBA. Cele budowy aplikacji rozproszonych

Serwlety Java: zagadnienia zaawansowane. Data Sources. Data Sources. Przykład pliku data-sources.xml

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

Bazy danych. Dr inż. Paweł Kasprowski

Programowanie obiektowe zastosowanie języka Java SE

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

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

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

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

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

Enterprise JavaBeans

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

1.1. System otwartych baz danych ODBC. System otwartych baz danych ODBC. Interfejs ODBC. Interfejs ODBC. System otwartych baz danych ODBC

Programowanie w języku Java

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

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

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

Ćwiczenia 2 IBM DB2 Data Studio

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

prepared by: Programowanie WWW Servlety

Transkrypt:

1 Plan wykładu 2 Dostęp do bazy danych Dostęp do baz danych w aplikacjach Java EE JDBC Źródła danych część I: JDBC i źródła danych Dostęp do baz danych z aplikacji Java EE Architektura JDBC Programowane na niskim poziomie JDBC SQLJ Program Java JDBC API Dostęp z poziomu warstwy widoku MVC biblioteka znaczników JSTL SQL Dostęp z poziomu warstwy modelu MVC encyjne komponenty EJB technologie odwzorowania obiektowo-relacyjnego (Hibernate, TopLink) Java Persistence API Menedżer sterowników JDBC JDBC Type IV driver JDBC Type II driver Biblioteka klienta JDBC-ODBC Bridge driver Sterownik ODBC Biblioteka klienta BD

Typy sterowników JDBC 5 Sterowniki JDBC Oracle 6 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 efektywne 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 odpowiedni dla dostępu do bazy danych z apletów JDBC Thin (typ IV) w 100% napisany w czystej Javie oracle.jdbc.oracledriver może być pobrany przez sieć wraz z apletem Java JDBC OCI (typ II) wykonuje wywołania OCI do fabrycznego sterownika, preinstalowanego po stronie klienta wykorzystywany wyłącznie w aplikacjach języka Java Server-side internal driver wykorzystywany przez aplikacje Java uruchamiane wewnątrz serwera Oracle (np. Java Stored Procedures) Server-side Thin driver wykorzystywany przez aplikacje Java uruchamiane wewnątrz serwera Oracle do nawiązywania połączeń z innymi serwerami Sterowniki JDBC IBM 7 Funkcjonalność JDBC 1.0 API 8 IBM DB2 Universal Database sterownik dla aplikacji po stronie serwera (typ II) COM.ibm.db2.jdbc.app.DB2Driver sterownik dla apletów (typ III) komunikuje się z bazą danych poprzez serwer apletów (ang. applet server) COM.ibm.db2.jdbc.net.DB2Driver IBM AS/00 Database IBM AS/00 "native" JDBC driver (typ II) Korzysta z SQL CLI ograniczony do platformy AS/00 com.ibm.as00.access.as00jdbcdriver Otwieranie połączeń z bazami danych Uzyskiwanie informacji o możliwościach serwera bazy danych Wykonywanie instrukcji DML i DDL Przetwarzanie wyników zapytań Przetwarzanie wyników zapytań Prekompilowane, sparametryzowane polecenia SQL Wywoływanie podprogramów składowanych Transakcje (zatwierdzanie, wycofywanie) IBM AS/00 "toolbox" JDBC driver (typ IV) 100% napisany w czystej Javie com.ibm.db2.jdbc.app.db2driver

Podstawowe klasy JDBC (pakiet java.sql) DriverManager Connection Statement PreparedStatement CollableStatement ResultSet DatabaseMetaData ResultSetMetaData SQLException 9 10 Rejestrowanie sterowników JDBC (1) Sterowniki JDBC muszą się rejestrować w menedżerze sterowników (DriverManager) Sterowniki rejestrują się automatycznie podczas ich ładowania (w przypadku większości JVM) // 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"); catch (ClassNotFoundException e) { 11 Rejestrowanie sterowników JDBC (2) W przypadku niektórych JVM załadowanie klasy nie rejestruje automatycznie sterownika (!) JDK 1.1.x na niektórych platformach (AIX, OS/2) Class.forName("oracle.jdbc.OracleDriver").newInstance(); Maszyny wirtualne Java firmy Microsoft DriverManager.registerDriver( new oracle.jdbc.oracledriver()); catch (SQLException 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 m 12

JDBC-ODBC Bridge Format JDBC URL dla różnych sterowników JDBC Oracle OCI Oracle Thin IBM DB2 app IBM DB2 net jdbc:odbc:<odbc_data_source> jdbc:oracle:oci:@<service_name> jdbc:oracle:thin:@<host>:<port>:<sid> jdbc:db2:<db_name> jdbc:db2://<host>:<port>/<db_name> 1 1 Podłączanie się do Oracle - Przykłady Connection conn; "jdbc:odbc:finance","scott","tiger"); catch (SQLException e) { Connection conn; "jdbc:oracle:oci:@findb","scott","tiger"); catch (SQLException e) { JDBC-ODBC Bridge Oracle OCI IBM AS/00 native IBM AS/00 toolbox jdbc:db2:<db_name> jdbc:as00://<system> Connection conn; "jdbc:oracle:thin:@host1:1521:orcl", "scott","tiger"); catch (SQLException e) { Oracle Thin Wyjątek SQLException 15 Pobieranie metadanych dotyczących bazy danych 16 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) "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(); Metadane opisujące bazę danych można odczytać w postaci obiektu DatabaseMetaData za pomocą obiektu reprezentującego bieżące połączenie Connection conn; DatabaseMetaData dm = conn.getmetadata(); String s1 = dm.geturl(); String s2 = dm.getsqlkeywords(); boolean b1 = dm.supportstransactions(); boolean b2 = dm.supportsselectforupdate(); catch (SQLException e) {

Polecenia SQL w JDBC 17 Polecenia SQL w JDBC 18 Statement, PreparedStatement, CollableStatement Polecenie Statement wykonywanie zapytań lub operacji DML/DDL 1 2 5 6 7 import java.sql.*; Connection ); int modified = stmt.executeupdate( stmt.close(); conn.close(); "DELETE FROM pracownicy WHERE id_prac = 220"); catch (SQLException e) { System.err.println("Błąd: " + e.geterrorcode() +" "+e.getmessage()); 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 Polecenie CallableStatement (wywiedzione z PreparedStatement) wywoływanie procedur i funkcji składowanych w bazie danych zachowana możliwość zaszywania zmiennych Klasa Statement (1) 19 Klasa Statement (2) 20 Wykonywanie zapytań (metoda executequery() zwracająca zbiór wynikowy ResultSet) ResultSet rset = stmt.executequery catch (SQLException e) { ("SELECT ename, sal FROM emp"); Wykonywanie poleceń DML i DDL (metoda executeupdate()) Metoda execute() wykorzystywana dla poleceń, których natura nie jest znana (SELECT, UPDATE, ) lub zwracających więcej niż jeden zbiór wynikowy ResultSet) sprawdzenie czy instrukcja zwróciła liczbę modyfikacji: int getupdatecount() zwrócenie bieżącego zbioru wynikowego: ResultSet getresultset() przejście do kolejnego ze zwróconych zbiorów wynikowych: boolean getmoreresults() stmt.executeupdate ("DELETE FROM emp WHERE empno = 981"); catch (SQLException e) {

21 Przetwarzanie zbiorów wynikowych JDBC Konwersje typów między SQL i Java 22 Wyniki zapytań zwracane jako ResultSet ResultSet utrzymuje kursor do nawigacji po wynikach Wymaga utrzymywania otwartego połączenia z bazą Konwersje danych między typami SQL i Java 1 2 ResultSet rset = stmt.executequery( "SELECT nazwisko, placa_pod FROM pracownicy"); while (rset.next()) { String naz = rset.getstring(1); double placa = rset.getdouble(2); System.out.println(naz + " zarabia " + placa + ". ); rset.close(); 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 (np. 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() Obsługa wartości NULL w JDBC 2 Odczytywanie metadanych z ResultSet 2 Wynikiem odczytu z bazy danych wartości NULL jest: null w przypadku użycia metod getxxx() zwracających obiekty (np. getobject(), getbigdecimal()) 0 w przypadku użycia getbyte(), getshort(), getint(), getlong(), getfloat() lub getdouble() false w przypadku użycia getboolean() Aby sprawdzić czy wartością danego atrybutu jest NULL, należy odczytać wartość atrybutu, a następnie na rzecz zbioru wynikowego wywołać metodę wasnull() ResultSet rs = st.executequery("select ename, comm FROM emp"); while (rs.next()) { System.out.print(rs.getString(1)+" "); double d = rs.getdouble(2); if (!rs.wasnull()) System.out.print(d); Obiekt ResultSet może posłużyć do odczytania obiektu ResultSetMetaData udostępniającego metadane o zbiorze wynikowym ResultSet rset = ; ResultSetMetaData md = rset.getmetadata(); while (rset.next()) { for (int i = 0; i < md.getcolumncount(); i++) { String lbl = md.getcolumnlabel(); String typ = md.getcolumntypename(); catch (SQLException e) {

Klasa PreparedStatement 25 Parametryzacja poleceń SQL w JDBC 26 Zalecane, gdy istnieje potrzeba wielokrotnego wykonania tego samego polecenia, lecz z różnymi parametrami: Parametry wstawia się za pomocą znaku? Connection ); 1 PreparedStatement pstmt = conn.preparestatement( "UPDATE pracownicy SET placa_pod =? WHERE id_prac =?"); pstmt.setdouble(1, 850.5); 2 pstmt.setint(2, 210); PreparedStatement pstmt = conn.preparestatement("update emp SET sal =?"); catch (SQLException e) { 5 6 pstmt.executeupdate(); pstmt.setdouble(1, 1100); pstmt.setint(2, 200); pstmt.executeupdate(); pstmt.close(); Transakcje 27 JDBC w różnych typach aplikacji Java 28 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 Connection ); conn.setautocommit(false); // zmiana trybu polecenia SQL conn.commit(); // zatwierdzenie polecenia SQL conn.rollback(); // wycofanie transakcji JDBC jest uniwersalnym standardem dla wszystkich typów aplikacji Java (aplikacje samodzielne, aplety, serwlety, JavaServer Pages, JavaBeans, EJBs, procedury składowane) Ograniczenia dotyczące apletów powinny korzystać ze sterowników typu IV ("pure Java") środowisko przeglądarki ogranicza swobodę nawiązywania połączeń sieciowych do serwera, z którego aplet został pobrany (rozwiązanie: aplety podpisane, Oracle Connection Manager) Specyfika procedur składowanych Java automatycznie dostępne, otwarte połączenie z bieżącą bazą danych

JDBC w serwlecie Przykład (1) 29 JDBC w serwlecie Przykład (2) 0 import java.sql.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class EmpServlet extends HttpServlet { Connection conn; EmpServlet.java public void init(servletconfig config) throws ServletException { super.init(config); Class.forName("oracle.jdbc.OracleDriver"); "jdbc:oracle:thin:@host:1521:sid", "scott", "tiger"); catch (Exception e) { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException,IOException { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); out.println("<html><body>"); if (conn!= null) { EmpServlet.java ResultSet rset = stmt.executequery("select ename, sal FROM emp"); while (rset.next()) out.println(rset.getstring(1)+": "+rset.getdouble(2)+"<br>"); rset.close(); stmt.close(); catch (SQLException e) { out.println("</body></html>"); JDBC w serwlecie Przykład () 1 JDBC w JSP Przykład 2 public void destroy() { if (conn!= null) { try { conn.close(); catch (SQLException e) { EmpServlet.java <%@ page language="java" import="java.sql.*" %> empjsp.jsp <HTML><HEAD><TITLE>Employees</TITLE></HEAD><BODY BGCOLOR="#FFFFFF"> <% try { DriverManager.registerDriver(new oracle.jdbc.oracledriver()); Connection "jdbc:oracle:thin:@host:1521:sid", "scott", "tiger"); ResultSet rset = stmt.executequery("select ename, sal FROM emp"); while (rset.next()) out.println(rset.getstring(1)+": "+rset.getdouble(2)+"<br>"); rset.close(); stmt.close(); conn.close(); catch (Exception e) { out.println(e); %> </BODY></HTML>

Źródła danych (obiekty DataSource) Konfiguracja źródeł danych na serwerze Preferowany mechanizm uzyskiwania połączeń z bazą danych ( fabryka połączeń ) Reprezentują rzeczywiste źródła danych, najczęściej relacyjne bazy danych Typowo tworzone przez serwer w oparciu o zawartość pliku konfiguracyjnego i udostępniane jako zasób w JNDI Mogą implementować mechanizm connection pooling utrzymywana pula otwartych połączeń z bazą danych gdy aplikacja otwiera połączenie, otrzymuje jedno z połączeń z puli gdy aplikacja zamyka połączenie, jest ono zwracane do puli i będzie mogło być ponownie wykorzystane 1 2 5 data-sources.xml <data-source class="com.evermind.sql.drivermanagerdatasource name="instytutds location="jdbc/instytutcoreds xa-location="jdbc/xa/instytutxads ejb-location="jdbc/instytutds connection-driver="oracle.jdbc.driver.oracledriver" username="scott password="tiger" 6 /> url="jdbc:oracle:thin:@localhost:1521:orcl" Korzystanie ze źródeł danych w aplikacji 5 Podsumowanie 6 Wyszukanie źródła danych przez JNDI (J2EE <= 1.) import javax.naming.*; import javax.sql.*; Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/InstytutDS"); Aplikacje Java EE realizują operacje na bazie danych poprzez interfejs JDBC i źródła danych Twórcy aplikacji wykorzystują technologie O/RM Przyszłość należy do Java Persistence Wstrzyknięcie źródła danych adnotacją (Java EE >= 5.0) @Resource(name= jdbc/instytutds ) DataSource ds; Uzyskanie połączenia poprzez źródło danych Connection conn = ds.getconnection();