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

Podobne dokumenty
Metody dostępu do danych

JDBC (Java Database Connectivity vit )

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

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

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

JAVA I BAZY DANYCH. MATERIAŁY:

Wprowadzenie do JDBC z wykorzystaniem bazy H2

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

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

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

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

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

Bazy danych wykład dwunasty

Połączenie z bazą danych

Programowanie Obiektowe Java

Programowanie Obiektowe Java

Wykład 05 Bazy danych

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

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

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

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

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

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

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

Projektowanie systemów baz danych

Podstawy programowania III WYKŁAD 2

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

Język SQL, zajęcia nr 1

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

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Wykład 5: PHP: praca z bazą danych MySQL

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

P o d s t a w y j ę z y k a S Q L

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

Bazy danych SQLite w Javie

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

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Programowanie w Ruby

Podejście obiektowe do relacyjnych baz danych Hibernate.

PHP: bazy danych, SQL, AJAX i JSON

Wykład 8. SQL praca z tabelami 5

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Java Database Connectivity

SQL (ang. Structured Query Language)

Dostęp do baz danych przy wykorzystaniu interfejsu JDBC

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

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

Przykładowa baza danych BIBLIOTEKA

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

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Projektowani Systemów Inf.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Bazy danych. Polecenia SQL

Bazy Danych i Usługi Sieciowe

Wykład 6. SQL praca z tabelami 3

Java Database Connectivity

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Relacyjne bazy danych. Podstawy SQL

Database Connectivity

Bartosz Jachnik - Kino

Wykład 5. SQL praca z tabelami 2

Bazy danych - wykład wstępny

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

Ref. 7 - Język SQL - polecenia DDL i DML

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

Bazy danych i usługi sieciowe

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

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

Programowanie w języku Java

Aplikacje Internetowe

Autor: Joanna Karwowska

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

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki

Paweł Cieśla. Dokumentacja projektu

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

Autor: Joanna Karwowska

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

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

Relacyjne bazy danych. Podstawy SQL

Język SQL. Rozdział 2. Proste zapytania

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Bazy danych. Dr inż. Paweł Kasprowski

Zagadnienia. Konstrukcja bibliotek mysql i mysqli w PHP. Dynamiczne generowanie stron. Połączenie, zapytanie i sesja

Bezpieczeństwo systemów komputerowych

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

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

Bazy danych. Dr inż. Paweł Kasprowski

Systemy internetowe. Wykład 4 mysql. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Hurtownia Świętego Mikołaja projekt bazy danych

Dokumentacja interfejsu MySQL. Platforma BSMS.PL Instrukcja podłączenia po przez mysql

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

Bazy danych 7. SQL podstawy

Transkrypt:

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

Treść wykładu Przypomnienie terminów bazodanowych Architektura JDBC Schemat działania przy dostępie do danych Analiza nazwy źródła danych podawanej przy nawiązywaniu połączenia Przykłady kodu

Terminy bazodanowe Tabela (relacja) Wiersz (krotka, rekord) Kolumna (atrybut) Relacja (związek) Schemat Klucz, klucz główny, klucz obcy

Terminy bazodanowe (przykład jednej tabeli) tabela autor id imie nazwisko www wiersz klucz główny kolumna

Schemat bazy danych autor id imie nazwisko int not null varchar(30) varchar(50) relacja PK 1 PK klucz główny (primary key) FK klucz obcy (foreign key) ksiazka id autor_id tytul int not null int not null varchar(60) PK FK schemat bazy danych (opis wszystkich tabel i relacji) autor id imie nazwisko 1 Jeden Taki 5 Frank Herbert 6 Adam Mickiewicz ksiazka id autor_id tytul 1 1 Abc wędkarza 2 5 Diuna 3 6 Pan Tadeusz 4 5 Heretycy Diuny

Typy relacji jeden do jednego (1:1, one to one) id id2 PK FK 1 1 id PK jeden do wielu (1:M, one to many) id PK 1 id id2 PK FK wiele do wielu (M:N, many to many) id PK 1 id id1 id2 PK FK FK 1 id PK

JDBC JDBC TM API zapewnia uniwersalny dostęp do baz danych z poziomu języka Java. Niezależne od architektury, przenośne rozwiązanie Wystarczy sterownik do bazy zgodny z JDBC oraz odpowiednie nawiązanie połączenia (reszta programu się nie zmienia) Klasy JDBC są w pakiecie java.sql JDBC 1.0 (tylko SQL), JDBC 2.0 (manipulacje danymi), JDBC 3.0 (nierelacyjne źródła danych) Wyjątki: java.sql.sqlexception

Architektura JDBC Java JDBC JDBC API API sterownika JDBC sterownik JDBC-Net most JDBC-ODBC sterownik firmy A sterownik firmy B sterowniki ODBC, OLE DB Implementacje alternatywne Protokół publiczny Prywatne protokoły dostępu do danych

Odczyt danych z bazy 1. Załadowanie sterownika interfejs java.sql.driver 2. Otwarcie połączenia interfejs java.sql.connection 3. Utworzenie obiektu do wykonywania poleceń interfejs java.sql.statement 4. Odczyt danych i zapamiętanie wyniku interfejs java.sql.resultset

Schemat odczytu danych z bazy ResultSet getmoreresults executequery Statement getconnection DriverManager getxyz setxyz typy danych: Date, Time, Timestamp, Numeric, typy danych Javy, itp. getxyz executequery PreparedStatement CallableStatement createstatement preparestatement Connection preparecall

1. Ładowanie sterownika Aby załadować sterownik trzeba użyć Class.forName("nazwa.klasy.sterownika") Maszyna wirtualna musi być w stanie odnaleźć klasę sterownika trzeba podać pełną nazwę klasy, sama zaś klasa musi być dostępna przez CLASSPATH lub zapisana w ustawieniach maszyny wirtualnej Wszystkie sterowniki JDBC są zarządzane przez klasę DriverManager Każdy sterownik po załadowaniu sam rejestruje się przez wywołanie DriverManager.registerDriver() (i dlatego można go od tej pory używać)

Sterownik most JDBC-ODBC Wiele współczesnych baz danych ma sterowniki ODBC, jednak ODBC jest bardziej odpowiednie dla języka C niż Javy, jest też trudniejsze do nauczenia JDBC w porównaniu daje więcej możliwości, stanowi API wyższego poziomu używa się kilku interfejsów składających się na JDBC, o resztę dba konkretny sterownik (są jednak też możliwości zaawansowane i rozszerzenia JDBC pakiet javax.sql) Sterownik platformy Java, umożliwiający dostęp do istniejących sterowników ODBC: sun.jdbc.odbc.jdbcodbcdriver

Sterowniki natywne Sterownik most korzysta z dodatkowej warstwy pośredniczącej (ODBC), można jednak mieć sterownik natywny do konkretnej bazy danych Sterownik może być napisany całkowicie w Javie, jest wtedy przenośny i nie trzeba go specjalnie instalować na każdym komputerze (może być np. spakowany razem z aplikacją) Przykładowy sterownik do MySQL: com.mysql.jdbc.driver Aby używać sterownika, można np. podać ścieżkę do archiwum przy starcie aplikacji: java -cp.;mysql-connector-java-5.0.5-bin.jar Program

2. Nawiązywanie połączenia JDBC 1.0 DriverManager.getConnection() JDBC 3.0 DataSource.getConnection() Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conn; try { conn = DriverManager.getConnection( "jdbc:odbc:biblioteka", "user", "pass"); } catch (SQLException e) { System.out.println( "SQLException: " + e.getmessage() + "\nsqlstate: " + e.getsqlstate() + "\nvendorerror: " + e.geterrorcode()); e.printstacktrace(); }

Identyfikator źródła danych Przy otwieraniu połączenia do bazy danych należy podać łańcuch połączenia (JDBC URL) Składa się on z następujących części: jdbc : <protokół> : <podnazwa> Podnazwa może być np. aliasem ODBC źródła danych (DSN Data Source Name), albo może mieć ogólnie zalecaną postać: // serwer : port / nazwa_źródła_danych elementy opcjonalne

Ile trzeba nam połączeń? DriverManager Connection Connection Statement Statement Statement Statement ResultSet ResultSet ResultSet Aplikacja 1 Aplikacja 2

Stan połączeń Jeśli DriverManager zwrócił połączenie to jest ono otwarte (jeśli nastąpi błąd, pojawi się wyjątek) Połączenie można zamknąć Connection.close() Jeśli połączenie zostało zamknięte, metoda Connection.isClosed() zwraca true Nie używa się isclosed() aby sprawdzać czy połączenie jest w dobrym stanie (tylko czy zostało faktycznie zamknięte) Raczej można dowiedzieć się czy coś jest nie w porządku z połączeniem, łapiąc wyjątki jakie pojawiają się przy próbie wykonania operacji JDBC

3. Wydawanie poleceń Do wykonywania poleceń SQL (manipulowania danymi) w ramach połączenia z bazą danych, trzeba użyć obiektu polecenia. JDBC zawiera trzy klasy dla obiektów poleceń: Statement głównie odczyt danych, ale także wykonywanie zmian w bazie przez polecenia SQL PreparedStatement przechowuje wstępnie przygotowane polecenie SQL, z parametrami (szybsze przetwarzanie) CallableStatement wywołanie procedury składowanej z bazy danych

Tworzenie obiektów poleceń Statement stmt = conn.createstatement(); ResultSet rs = stmt.executequery( "select * from autor"); stmt.executeupdate( "insert into autor (imie, nazwisko) values " + " (\'Scott\', \'McNealy\')," + " (\'Jonathan\', \'Schwartz\')"); PreparedStatement pstmt = conn.preparestatement( "UPDATE EMPLOYEES SET SALARY =? WHERE ID =?"); pstmt.setbigdecimal(1, 153833.00); pstmt.setint(2, 110592); CallableStatement cstmt = conn.preparecall( "CALL GENERATE_REPORT");

4. Odczyt danych ResultSet first() / last() beforefirst() / afterlast() next() / previous() absolute() / relative() isfirst() / islast() isbeforefirst() / isafterlast() przechodzenie po wierszach pytanie o położenie Uwaga: wczytanie pustego zbioru danych powoduje, że w zbiorze nie ma pierwszego rekordu i cztery ostatnie metody zawsze zwracają wartość logiczną false

Różnice w obsłudze danych ResultSet w JDBC 1.0 pozwala odczytywać dane tylko do przodu ResultSet w JDBC 2.0 jest przewijalny, tzn. ma możliwość przechodzenia do przodu, do tyłu oraz do wybranego wiersza (ang. scrollable) W JDBC 2.0 można zmodyfikować dane odczytane w ResultSet używając jego metod, a następnie wysłać te zmiany do bazy

Przykład odczytu danych /* Zakładamy, że połączenie 'conn' jest już utworzone i używa bazy 'biblioteka' */ Statement stmt = conn.createstatement(); // Odczyt zbioru danych ResultSet rs = stmt.executequery( "select * from autor"); // Przechodzenie do kolejnych wierszy while (rs.next()) { // Wyciągnięcie danych z bieżącego wiersza int id = rs.getint(1); String imie = rs.getstring(2); String nazwisko = rs.getstring("nazwisko"); // Wyświetlenie danych System.out.println(id + " : " + imie + ", " + nazwisko); }

Zmiany bieżącego wiersza 1 2 101 108 Adam Piotr Nowak Goniec 152 Maria Woźniczka 153 Stanisław Wspaniały 3 ResultSet na początku jest przed zbiorem danych (isbeforefirst() zwraca true) Każde wywołanie next() przesuwa go do przodu o jeden (jeśli się udało zwrócone będzie true) Po skończeniu się zbioru danych ResultSet jest za zbiorem danych (isafterlast() zwraca true)

Porządki? Należy zamykać połączenia i obiekty poleceń kiedy nie są potrzebne Służą do tego metody: Statement.close() oraz Connection.close() Zaleca się jawnie zamykać powyższe obiekty (szybsze zwalnianie zewnętrznych zasobów) Jeśli nie, połączenia będą zamykane dopiero przy odśmiecaniu pamięci

Typowe problemy W przypadku aplikacji przyjmujących dane przysyłane z przeglądarki internetowej niezmiernie ważną rzeczą jest upewnienie się czy przychodzące dane są poprawne. Do podstawowych elementów należą m.in. walidacja Javascript po stronie przeglądarki walidacja parametrów po stronie serwera zapobieganie Cross-Site Scripting (XSS) zapobieganie SQL Injection

Walidacja danych (sprawdzanie poprawności) Sprawdzanie poprawności powinno odbywać się w dwóch miejscach: w przeglądarce (mniejsze obciążenie serwera) w aplikacji na serwerze (zapobiega problemom, gdy Javascript nie działa w przeglądarce) W przypadku aplikacji JSP można wykorzystać znaczniki <jsp:usebean> oraz <jsp:setproperty property="*">

Cross-Site Scripting (XSS) Bez kontroli przysłanych danych może się okazać, że w bazie danych umieszczane są znaczniki HTML, które po prostym dołączeniu do strony powodują nieoczekiwane efekty (zmianę wyglądu, wyświetlanie zbędnych obrazków, itp.) Problem XSS objawia się tym, że w dodanymi znacznikami są <script> przez co przy ładowaniu lub wyświetlaniu strony przeglądarka wykonuje arbitralnie dodane programy Javascript. W celu zapobiegnięcia XSS jako minimum należy zamieniać znaki < na < i > na > przed zapisaniem danych w bazie.

SQL Injection Samodzielne budowanie wyrażeń SQL z ciągów znaków przysłanych z przeglądarki może powodować, że zostaną do nich dołączone arbitralnie podane, zbędne (niebezpieczne!) polecenia SQL. W celu zabezpieczenia się przed tymi problemami, należy zawsze przy podawaniu parametrów korzystać z obiektów PreparedStatement a nie Statement.

Przykład SQL Injection Zły kod: String imie = "John"; String nazwisko = "K.\'); DROP DATABASE biblioteka;"; Statement stmt = conn.createstatement(); stmt.executeupdate( "insert into autor (imie, nazwisko) values " + " (\'" + imie + "\', \'" + nazwisko + "\')"); Sklejanie może doprowadzić tu do skasowania całej bazy danych.

Zapobieganie SQL Injection Dobry kod: String imie = "John"; String nazwisko = "K.\'); DROP DATABASE biblioteka;"; PreparedStatement stmt = conn.preparestatement( "insert into autor (imie, nazwisko) values " + " (?,?)"); stmt.setstring(1, imie); stmt.setstring(2, nazwisko); stmt.executeupdate(); Wartości parametrów są podawane przez zbiór metod setxyz().