Java Database Connectivity

Podobne dokumenty
JAVA I BAZY DANYCH. MATERIAŁY:

JDBC (Java Database Connectivity vit )

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

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

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

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

Połączenie z bazą danych

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

Metody dostępu do danych

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

Wprowadzenie do JDBC z wykorzystaniem bazy H2

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

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

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

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

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

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Aplikacje Internetowe

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

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

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

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

Wywoływanie metod zdalnych

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

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

Java Database Connectivity

Programowanie Obiektowe Java

Programowanie Obiektowe Java

Wywoływanie metod zdalnych

1 Wprowadzenie do J2EE

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

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

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

Podejście obiektowe do budowy systemów rozproszonych

Aplikacje Internetowe

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

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

Wzorce logiki dziedziny

Programowanie w języku Java

Bazy danych wykład dwunasty

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

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ć

Remote Method Invocation 17 listopada 2010

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

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

Aplikacje RMI

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

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

przygotował: Bazy danych Paweł Kasprowski Wersja 2006Z

Kurs programowania aplikacji bazodanowych

Bartosz Jachnik - Kino

Technologia JDBC w praktyce

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

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

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

Dostęp do baz danych z aplikacji J2EE

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

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

Programowanie obiektowe

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

PL/SQL. Zaawansowane tematy PL/SQL

PHP: bazy danych, SQL, AJAX i JSON

Java rozszerzenie. dr. A. Dawid

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

Enterprise JavaBeans

Komponenty sterowane komunikatami

Wzorce dystrybucji i wspólbieżności autonomicznej

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

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

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

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki

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

Wybrane działy Informatyki Stosowanej

Aplikacje internetowe i rozproszone - laboratorium

Systemy Rozproszone - Ćwiczenie 6

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

akademia androida Składowanie danych część VI

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

Podejście obiektowe do relacyjnych baz danych Hibernate.

Programowanie rozproszone w języku Java

Języki i metody programowania Java. Wykład 2 (część 2)

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Db4o obiektowa baza danych wersja.net

Aplikacje RMI Lab4

Tuning SQL Server dla serwerów WWW

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

Kurs programowania aplikacji bazodanowych

Składowane procedury i funkcje

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

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

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

Technologia informacyjna

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

SYSTEM MONITORINGU PARAMETRÓW WĘZŁÓW PRZECHOWYWANIA DANYCH DLA PROJEKTU KRAJOWY MAGAZYN DANYCH PODRĘCZNIK DEWELOPERA

Wielojęzykowość w aplikacjach J2EE. Tomasz.Skutnik@e-point.pl

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Relacyjny model danych

Transkrypt:

1 Java Database Connectivity Java Database Connectivity (JDBC) to specyfikacja określająca zbiór klas i interfejsów napisanych w Javie, które mogą być wykorzystane przez programistów tworzących oprogramowanie korzystające z baz danych. Implementacja JDBC jest dostarczany przez producentów baz danych. Jedną z ważniejszych zalet takiego rozwiązania jest ukrycie przed programistą kwestii technicznych dotyczących komunikacji z bazą danych. Dzięki temu ten sam program napisany w Javie może współpracować z różnymi systemami baz danych (np. Oracle, Sybase, IBM DB2). Wystarczy podmienić odpowiednie biblioteki implementujące JDBC. Źródło informacji: http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/gettingstartedtoc.fm.html.

2 Bazy danych w Javie: przykład MySQL import java.sql.connection; import java.sql.drivermanager; import java.sql.resultset; import java.sql.sqlexception; import java.sql.statement; // Nie importujemy pakietu com.mysql.jdbc.* public class TestDriver { public static void main(string[] args) { Statement stmt = null; ResultSet rs = null; try { // newinstance() jest wywoływane na wszelki wypadek Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test?user=monty&password="); stmt = con.createstatement(); rs = stmt.executequery("select * FROM tabela"); while (rs.next()) { System.out.println(rs.getString("kolumna1"));

Bazy danych w Javie: przykład MySQL catch (Exception ex) { // obsluga bledow finally { // zwalnianie zasobow if (rs!= null) { try { rs.close(); catch (SQLException sqlex) { // ignorujemy rs = null; if (stmt!= null) { try { stmt.close(); catch (SQLException sqlex) { // ignorujemy stmt = null; // analogicznie con.close(); 3

JDBC a inne rozwiązania ODBC (Open DataBase Connectivity) najpopularniejszy mechanizm dostępu do relacyjnych baz danych. Dlaczego zatem nie używać ODBC w Javie? 1. ODBC używa interfejsu języka C. Wywołania z Javy kodu natywnego w C powoduje wiele problemów - bezpieczeństwo, efektywność, przenośność. 2. Bezpośrednie przepisanie interfejsu ODBC w Javie byłoby nieefektywne. 3. ODBC jest stosunkowo trudne w opanowaniu, ponieważ trzeba ustawiać wiele parametrów nawet przy wywołaniu prostych zapytań. 4. Driver ODBC musi być ręcznie instalowany i konfigurowany na każdym komputerze klienckim. Podobne problemy wykluczają stosowanie innych technologii: OLE (Object Linking and Embedding) DB, ADO (ActiveX Data Objects), and RDS (Remote Data Service). Niedawno Microsoft wprowadził mechanizm UDA (Universal Data Access), który jest dosyć podobny do JDBC. 4

Model dwu- i trzywarstwowy komunikacji klient aplikacja JDBC klient - GUI aplikacja, applet lub przeglądarka WWW HTTP, RMI, CORBA lub inne wywołanie serwer baza danych protokół bazy danych serwer serwer aplikacji JDBC protokół bazy danych logika biznesowa baza danych 5

Typy sterowników JDBC 1. JDBC-ODBC bridge plus ODBC driver: konwertuje żądania JDBC na ODBC, które jest używane do komunikacji z bazą. Najczęściej wykorzystywany w dużych sieciach korporacyjnych lub modelu trzywarstwowym. 2. Native-API partly-java driver: konwertuje żądania JDBC do innego natywnego klienckiego API dla bazy danych. 3. JDBC-Net pure Java driver: konwertuje żądania JDBC na operacje niezależnego protokołu. Te wywołania są tłumaczone przez warstwę pośrednią na konkretny protokół systemu baz danych. 4. Native-protocol pure Java driver: konwertuje żądania JDBC na operacje niezależnego protokołu konkretnego systemu baz danych. To jest najbardziej wydajne rozwiązanie. Informacje o sterownikach JDBC: http://servlet.java.sun.com/products/jdbc/drivers. 6

7 Nawiązanie połączenia Istnieją dwie metody nawiązania połączenia z bazą danych: za pomocą klasy DriverManager: String url = "jdbc:odbc:bazadanych"; Connection con = DriverManager. getconnection(url, "login", "haslo"); za pomocą klasy DataSource i usługi JNDI: Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/MojaDB"); Connection con = ds.getconnection("mylogin", "mypassword");

8 DriverManager DriverManager jest tradycyjną warstwą zarządzającą JDBC pomiędzy użytkownikiem a sterownikiem. Aktualną listę dostępnych sterowników można uzyskać za pomocą metody: Enumeration DriverManager.getDrivers(). Aby załadować dodatkowy sterownik należy skorzystać z metody: Class Class.forName(String) podając jako argument klasę ze sterownikiem np: Class.forName("jdbc.odbc.JdbcOdbcDriver"); // protokół jdbc:odbc Class.forName("com.mysql.jdbc.Driver"); //protokół jdbc:mysql. Rejestracja podprotokołów: jdbc@eng.sun.com.

DriverManager Inne metody (statyczne) udostępniane przez DriverManager'a: int getlogintimeout(), setlogintimeout(int) pobiera/ustawia czas w sekundach określający okres oczekiwania na zalogowanie się do bazy. PrintWriter getlogwriter(), void setlogwriter(printwriter) pobiera/ustawia obiekt do zapisywania logów, void println(string message) wstawia komunikat do logu, void registerdriver(driver driver), void deregisterdriver(driver) rejestruje/wyrejestrowuje sterownik. Rejestracja powinna odbywać się automatycznie przy załadowaniu sterownika kod statyczny w klasie sterownika. 9

DataSource DataSource reprezentuje źródło danych. Zawiera informacje identyfikujące i opisujące dane. Obiekt DataSource współpracuje z technologią Java Naming and Directory Interface (JNDI), jest tworzony i zarządzany niezależnie od używającej go aplikacji. Korzystanie ze źródła danych zarejestrowanego w JNDI zapewnia: brak bezpośredniego odwołania do sterownika przez aplikację, umożliwia implementację grupowania połączeń (pooling) oraz rozproszonych transakcji. Te cechy sprawiają, że korzystanie z klasy DataSource jest zalecaną metodą tworzenia połączenia z bazą danych, szczególnie w przypadku dużych aplikacji rozproszonych. 10

Standardowe własności DataSource W wersji 2.0 JDBC określono zbiór własności, które musi posiadać DataSource: databasename - nazwa bazy danych na serwerze bazy danych, datasourcename nazwa logiczna źródła danych; używana tylko gdy implementowany jest pooling i rozproszone transakcje, description opis źródła danych, networkprotocol protokół sieciowy używany do komunikacji z serwerem (String), portnumber numer portu, poprzez który dostajemy się do serwera bazy danych (int), user i password login i hasło, servername nazwa serwera lub adres IP 11

12 Rejestracja źródła danych w JNDI Przed użyciem obiektu DataSource powinien on zostać zarejestrowany: VendorDataSource vds = new VendorDataSource(); vds.setservername("moj_serwer"); vds.setdatabasename("nazwa_mojej_bazy"); vds.setdescription("tutaj_kroki_opis"); Context ctx = new InitialContext(); ctx.bind("jdbc/mojadb", vds); Klasa VendorDataSource jest dostarczana przez producenta systemu bazy danych, w ramach sterownika JDBC. UWAGA: nazwa VendorDataSource jest przykładowa.

Przesyłanie zapytań Do przesyłania zapytań do bazy danych służą obiekty klasy: Statement typowe pytania (bezparametrowe), PreparedStatement prekompilowany pytania zawierające parametry wejściowe, CallableStatement procedury zapisane w bazie danych. Obiekt Statement tworzy się w ramach nawiązanego wcześniej połączenia: Connection con = DriverManager.getConnection(url, login, pass); Statement stmt = con.createstatement(); stmt.executeupdate("insert INTO table(name, price) VALUE 'ser', 2.0"); 13

14 Przesyłanie zapytań Obiekt Statement zawiera Do przesyłania zapytań służą metody: executequery pytania zwracające dane: SELECT, executeupdate pytania zmieniające dane: INSERT, UPDATE, CREATE TABLE,.... execute dowolne zapytania. Dzięki tej instrukcji można wykonać sekwencje pytań, przekazać i odebrać dodatkowe parametry. W ramach jednego obiektu Statement można wykonać sekwencyjnie kilka zapytań. Po zakończeniu używania obiektu zaleca się wywołanie metody close().

Odbieranie generowanych kluczy Do odbioru automatycznych kluczy służy metoda getgeneratedkeys() wywołana na rzecz obiektu Statement: Statement stmt = con.createstatement(); String sql = "INSERT INTO AUTHORS(LAST, FIRST, HOME) VALUES " + "('PARKER', 'DOROTHY', 'USA')"; int rows = stmt.executeupdate(sql, Statement.RETURN_GENERATED_KEYS); ResultSet rs = stmt.getgeneratedkeys(); if (rs.next()) { ResultSetMetaData rsmd = rs.getmetadata(); int colcount = rsmd.getcolumncount(); do { for (int i = 1; i <= colcount; i++) { String key = rs.getstring(i); System.out.println("klucz " + i + ": " + key); while (rs.next()); else { System.out.println("Brak automatycznych kluczy."); 15

Specjalne parametry Parametry specjalne mają następującą postać: {keyword... parameters.... Używa się następujących słów kluczowych: escape - przesyłanie znaków w klauzuli LIKE: stmt.executequery("select name FROM Identifiers WHERE Id LIKE '\_%' {escape '\'"); - Id zaczyna się od '_' fn funkcje skalarne: {fn concat("hot", "Java"); {fn user(); Listę wspieranych funkcji można uzyskać za pomocą metod obiektu DatabaseMetaData, np: getnumericfunctions(), getstringfunctions(),.... 16

the database supports stored procedures. Specjalne parametry * oj forouter joins d, t oraz ts data i czas: {d 'yyyy-mm-dd' The syntax for an outer join is: {d 1999-02-28 zostanie zamienione np. na '28-FEB-99' jeśli taki format jest używany przez bazę danych. Analogicznie dla TIME i TIMESTAMP: {oj {t outer-join 'hh:mm:ss' {ts 'yyyy-mm-dd hh:mm:ss.f...' Część ułamkowa sekund (.f...) może zostać opuszczona. In this syntax, outer-join has the form call lub?= - wywołanie procedur zapisanych w bazie danych: {call procedure_name[(?,?,...)] lub jeśli table procedura {LEFT RIGHT FULL zwraca wunik: OUTER JOIN {table outer-join {? = call procedure_name[(?, ON?, search-condition...)] DatabaseMetaData.supportsStoredProcedures() mówi, czy baza wspiera procedury. 17

18 Specjalne parametry oj złączenia zewnętrzne (OUTER JOIN): {oj outer-join gdzie outer-join ma postać: tabela {LEFT RIGHT FULL OUTER JOIN {tabela outer-join ON warunek Przykład: Statement stmt = con.createstatement("select * FROM {oj TABLE1 LEFT OUTER JOIN TABLE2 ON DEPT_NO = 003420930"); Obiekt DatabaseMetaData posiada trzy metody pozwalające stwierdzić, czy baza wspiera złączenia zewnętrzne: supportsouterjoins(), supportsfullouterjoins() oraz supportslimitedouterjoins().

19 Przesyłanie serii zapytań try { // przygotowanie zapytań stmt.addbatch("insert INTO table1 VALUES (1000)"); stmt.addbatch("insert INTO table2 VALUES ('cos')"); stmt.addbatch("insert INTO table3 VALUES ('260')"); // wywołanie int [] updatecounts = stmt.executebatch(); catch(batchupdateexception b) { int [] updatecounts = b.getupdatecounts(); // wypisanie liczby zmian System.out.println("Update counts: "); for (int i = 0; i < updatecounts.length; i ++) { System.out.print(updateCounts[i] + " "); System.out.println("");

20 Odbieranie danych Wyniki zwrócone w wyniku wykonania zapytania są dostępne poprzez obiekt typu ResultSet. Przykład: Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select a, b, c FROM table"); while (rs.next()) { // odebranie i wypisanie wyników w bieżącym rekordzie int i = rs.getint("a"); String s = rs.getstring("b"); float f = rs.getfloat("c"); System.out.println("ROW = " + i + " " + s + " " + f);

Odbieranie danych Więcej informacji o typach danych: http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/mapping.html#1033804 21

HSQLDB HSQLDB to system baz danych w całości napisany w Javie (open source).. Strona domowa projektu: http://www.hsqldb.org. Niektóre własności: obsługa SQL'a, transakcje (COMMIT, ROLLBACK, SAVEPOINT), integralność relacji (klucze obce), operacje kaskadowe, zdalne procedury i funkcje (pisane w Javie), triggery, możliwość dołączania do programów i appletów. Działanie w trybie read-only, tabele o rozmiarze do 8GB, rozmiar tekstowych i binarnych danych ograniczony przez rozmiar pamięci. 22

23 HSQLDB tryby pracy serwera Hsqldb Server tryb preferowany. Klasa org.hsqldb.server, Hsqldb Web Server używany, jeśli serwer może używać tylko protokołu HTTP lub HTTPS. W przeciwnym razie niezalecany. Klasa org.hsqldb.webserver, Hsqldb Servlet używa tego samego protokołu co Web Server. Wymaga osobnego kontenera serwletów (np. Tomcat). Może udostępniać tylko jedną bazę danych. Wszystkie tryby pracy serwera umożliwiają korzystanie z JDBC.

24 HSQLDB połączenie z serwerem Przykład: try { Class.forName("org.hsqldb.jdbcDriver").newInstance(); catch (Exception e) { System.out.println("ERROR"); e.printstacktrace(); return; Connection c = DriverManager.getConnection( "jdbc:hsqldb:hsql://localhost/xdb", "sa", ""); Serwer: localhost, nazwa bazy: xdb, użytkownik: sa, hasło: ''.

HSQLDB tryb stand-alone W trybie stand-alone serwer bazy danych działa w ramach tej samej wirtualnej maszyny Javy, co korzystający z niego program kliencki. Przykład uruchomienia bazy: Connection c = DriverManager.getConnection( "jdbc:hsqldb:file:/opt/db/testdb", "sa", ""); Niewielkie bazy danych mogą być uruchamiane do pracy w pamięci operacyjnej komputera: Connection c = DriverManager.getConnection( "jdbc:hsqldb:mem:testdb", "sa", ""); W obecnej wersji HSQLDB istnieje możliwość jednoczesnego używania wielu serwerów baz danych działających w trybie stand-alone. 25

26 HSQLDB kończenie pracy z bazą Wszystkie bazy mogą być zamknięte komendą SQL SHUTDOWN. Parametr połączenia shutdown=true wymusza zamknięcie bazy danych wraz z zakończeniem ostatniego połączenia za pomocą metody close(). Po komendzie SHUTDOWN wszystkie aktywne transakcje są anulowane (rollback) Komenda SHUTDOWN COMPACT dodatkowo przepisuje pliki.data zmniejszając ich rozmiar.

27 Podsumowanie Podstawowe klasy służące do interakcji z systemami bazodanowymi są udostępniane za pośrednictwem obiektów: Connection, Statement i ResultSet. Wszystkie te klasy należą do pakietu java.sql. Klasy rozszerzające funkcjonalność JDBC (np. DataSource) znajdują się w pakiecie javax.sql. Korzystanie z interfejsu JDBC umożliwia jednolity sposób dostępu do różnych systemów bazodanowych. Jako przykład przedstawiono bazę HSQLDB. Jej ważną zaletą jest możliwość działania w ramach jednej Wirtualnej Maszyny Javy wraz z programem klienckim.