Programowanie Obiektowe Java Małgorzata Janik Zakład Fizyki Jądrowej malgorzata.janik@pw.edu.pl http://java.fizyka.pw.edu.pl/
Bazy danych DBMS H2 SQL JDBC
Bazy Danych za: Wikipedia Baza danych = zbiór danych zapisanych zgodnie z określonymi regułami. W szerszym znaczeniu będzie obejmować np. księżkę telefoniczną. W węższym (dla nas interesującym) znaczeniu obejmuje dane cyfrowe gromadzone zgodnie z zasadami przyjętymi dla danego programu komputerowego specjalizowanego do gromadzenia i przetwarzania tych danych. Program taki nazywany jest systemem zarządzania bazą danych (ang. database management system, DBMS).
Bazy danych Rodzaje baz danych (wg. struktur organizacji danych) Bazy proste: kartotekowe hierarchiczne Bazy złożone: relacyjne obiektowe relacyjno-obiektowe strumieniowe temporalne nierelacyjne (NoSQL)
Bazy danych Rodzaje baz danych (wg. struktur organizacji danych) Bazy proste: kartotekowe hierarchiczne Bazy złożone: Najczęściej używane bazy danych: RELACYJNE relacyjne obiektowe relacyjno-obiektowe strumieniowe temporalne nierelacyjne (NoSQL)
Bazy danych Relacyjne bazy danych w modelu relacyjnym dane grupowane są w relacje, które reprezentowane są przez tablice
Bazy danych Relacyjne bazy danych https://pl.wikipedia.org/wiki/model_relacyjny#/ media/file:relational_model_concepts_pl.png
Bazy danych Relacyjne bazy danych w modelu relacyjnym dane grupowane są w relacje, które reprezentowane są przez tablice relacje są pewnym zbiorem rekordów o identycznej strukturze wewnętrznie powiązanych za pomocą związków zachodzących pomiędzy danymi związki pomiędzy relacjami zapewniają integralność referencyjną danych i pozwalają modelować odpowiednią logikę naszej struktury
Bazy danych Relacyjne bazy danych Więcej informacji: http://www.sqlpedia.pl/relacyjne-bazy-danych-pojecia-podstawowe/ związki pomiędzy relacjami zapewniają integralność referencyjną danych i pozwalają modelować odpowiednią logikę naszej struktury
Relacyjne bazy danych Najważniejsze w modelu relacyjnym dane grupowane są w relacje, które reprezentowane są przez tablice
Bazy danych System zarządzania bazą danych, (ang. Database Management System, DBMS) oprogramowanie bądź system informatyczny służący do zarządzania bazą danych (czyli zbiorem danych z określonymi regułami). System zarządzania bazą danych może być również serwerem bazy danych lub może udostępniać bazę danych lokalnie na określonym komputerze.
Bazy danych Photo by: Selmer van Alten Mamy np. wspomnianą książkę telefoniczną Chcemy ją zapisać w postaci cyfrowej Co robimy?
Bazy danych Co robimy? Photo by: Selmer van Alten Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać.
Bazy danych Co robimy? Photo by: Selmer van Alten Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, relacyjna.
Bazy danych Co robimy? Photo by: Selmer van Alten Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, relacyjna. Ustalamy jakiego DBMS będziemy używać.
Bazy danych Co robimy? Photo by: Selmer van Alten Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, relacyjna. Ustalamy jakiego DBMS będziemy używać. Popularne możliwości: https://db-engines.com/en/ranking
Bazy danych Co robimy? Photo by: Selmer van Alten Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, relacyjna. Ustalamy jakiego DBMS będziemy używać. Popularne możliwości: https://db-engines.com/en/ranking Bądź inne, dopasowane do naszych potrzeb : na 342 możliwych Programowanie Obiektowe (Wykład)
Baza danych H2 http://www.h2database.com
Baza danych H2
Baza danych H2 Zalety: Mieści się w jednym pliku jar (w tym pliku mieści się serwer, a nie tylko klient). Dobry wybór do małych aplikacji (np. w Swingu) które chcą korzystać z funkcjonalności dostępu do bazy danych, a nie chcą zmuszać użytkownika do instalacji serwera.
Bazy danych Co robimy? Photo by: Selmer van Alten Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, relacyjna. Ustalamy jakiego DBMS będziemy używać. Np. H2. Tworzymy w BDMS wszystkie potrzebne tabele i wypełniamy je. Jak? Musimy się jakoś skomunikować z naszą bazą danych. Najbardziej popularnym językiem do komunikacji jest SQL.
Język SQL SQL, ang. Structured Query Language, jest językiem pozwalającym na modyfikację relacyjnych baz danych i umożliwia dostęp do nich. SQL został standardem American National Standards Institute (ANSI) w 1986, oraz International Organization for Standardization (ISO) w 1987. Mimo standardów, pomiędzy różnymi DBMS występują pewne różnice w użyciu SQL. Wszystkie bazy danych mają własne dialekty SQL, więc tekst zapytań będzie różnić się dla różnych baz danych. To powoduje, że bazy danych są bardzo słabo przenośne. Zawsze musimy pisać kod pod konkretny typ bazy danych. Podstawy SQL właściwie wszędzie są takie same.
Język SQL Język SQL pozwala na zarządzanie bazą danych, między innymi poprzez: - tworzenie nowych tabel - dodawanie danych do tabel - modyfikację danych zawartych w tabelach - modyfikację struktury tabel - usuwanie danych z tabel - oraz usuwanie całych tabel - pobieranie danych z tabel
Język SQL Podstawowe właściwości: - wielkość liter nie ma znaczenia - polecenia w językach baz danych nazywamy zapytaniami lub kwerendami (ang. query). dlatego SQL nazywany jest też językiem zapytań (ang. query language) - każde zapytanie kończy się średnikiem ( ; )
Język SQL Przykładowy skrypt (przykłady zapytań) Usuń tabelę (jeśli istnieje) DROP TABLE IF EXISTS TEST; Stwórz nową tabelę z kolumnami ID i NAME CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255)); Dodaj nowy wiersz INSERT INTO TEST VALUES(1, 'Hello'); Dodaj kolejny wiersz INSERT INTO TEST VALUES(2, 'World'); Wypisz tabelę SELECT * FROM TEST ORDER BY ID; Zmień zawartość wiersza UPDATE TEST SET NAME='Hi' WHERE ID=1; Usuń wiersz DELETE FROM TEST WHERE ID=2;
Język SQL tworzenie przykładowej tabeli Tworzenie tabeli: CREATE TABLE Składnia: CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype,... ); Typ kolumny (przykłady): int date / datetime float varchar(255)
Język SQL tworzenie przykładowej tabeli Tworzenie tabeli: CREATE TABLE Przyklad: CREATE TABLE pracownik ( int id, varchar(100) imie, varchar(100) nazwisko ); id imie nazwisko 1 Jan Kowalski 2 Zofia Kwiatkowska
Język SQL tworzenie przykładowej tabeli Tworzenie tabeli: CREATE TABLE Składnia: CREATE TABLE table_name ( column1 datatype not null, column2 datatype, column3 datatype,. PRIMARY KEY (column1) ); Klucz podstawowy (PRIMARY KEY): Tabele należy tworzyć w ten sposób, by zawsze móc jednoznacznie odwołać się do każdego z rekordów. Klucz podstawowy określa taką jednoznaczną wartość (zestaw wartości) po którym możemy każdy wiersz rozróżnić. Każda tabela ma tylko jeden klucz, który nie może być NULL.
Język SQL tworzenie przykładowej tabeli Tworzenie tabeli: CREATE TABLE Składnia: CREATE TABLE table_name ( column1 datatype PRIMARY KEY, column2 datatype, column3 datatype,. ); Klucz podstawowy (PRIMARY KEY): Tabele należy tworzyć w ten sposób, by zawsze móc jednoznacznie odwołać się do każdego z rekordów. Klucz podstawowy określa taką jednoznaczną wartość (zestaw wartości) po którym możemy każdy wiersz rozróżnić. Każda tabela ma tylko jeden klucz, który nie może być NULL.
Język SQL tworzenie przykładowej tabeli Tworzenie tabeli: CREATE TABLE Składnia: CREATE TABLE table_name ( int id not null auto_increment, column2 datatype, column3 datatype,. PRIMARY KEY (column1) ); Automatyczne przypisywanie: auto_increment pozwala na automatyczne wpisywanie pól typu id : pierwszą wartością będzie 1, każda następna będzie poprzednia+1
Język SQL tworzenie przykładowej tabeli Tworzenie tabeli: CREATE TABLE Składnia: CREATE TABLE table_name ( int id not null auto_increment, column2 datatype default wartość, column3 datatype,. PRIMARY KEY (column1) ); default Pozwala na ustawienie domyślnej wartości dla danej kolumny. Jeśli dodając nowy rekord nie ustalimy innej wartości, zostanie przypisana ta, którą określa default.
Język SQL tworzenie przykładowej tabeli Tworzenie tabeli: CREATE TABLE DROP TABLE IF EXISTS `waluty`; Jeśli już istnieje tabela o nazwie waluty to ją usuń. CREATE TABLE `waluty` ( `Id` int unsigned NOT NULL auto_increment, `data` date default GETDATE(), `USD` float default NULL, `EUR` float default NULL, `GBP` float default 0, PRIMARY KEY (`Id`) ) ; Stwórz tabelę waluty z następującymji kolumnami: Id, data, USD EUR, GBP
Język SQL tworzenie przykładowej tabeli Tworzenie tabeli: CREATE TABLE DROP Typ kolumny: TABLE int IF EXISTS date float `waluty`; CREATE TABLE `waluty` ( `Id` int unsigned NOT NULL auto_increment, `data` date default GETDATE(), `USD` float default NULL, getdate() `EUR` float default NULL, funkcja zwracająca `GBP` float default 0, obecną datę PRIMARY KEY (`Id`) ) ; Kluczem podstawowym jest automatycznie inkrementowane Id.
Język SQL tworzenie przykładowej tabeli waluty Id data 1 2018-04-02 4.1267 4.2232 6.7571 2 2018-04-03 4.1299 4.2797 6.776 USD EUR GPB
Język SQL tworzenie przykładowej tabeli osoby Id imie 1 Małgorzata Janik 1887 2 Helena Nowak 1984 nazwisko data_urodzenia
Język SQL tworzenie przykładowej tabeli osoby create table osoby + drop if exists Id imie 1 Małgorzata Janik 1887 2 Helena Nowak 1984 nazwisko data_urodzenia
Język SQL tworzenie przykładowej tabeli osoby create table osoby + drop if exists Id imie nazwisko 1 Małgorzata Janik 1887 2 Helena Nowak 1984 Primary key NOT NULL auto_increment data_urodzenia
Język SQL tworzenie przykładowej tabeli osoby Id imie 1 2 create table osoby + drop if exists nazwisko data_urodzenia Małgorzata Janik 13-11-1887 Helena Nowak 10-12-1984 Primary key NOT NULL auto_increment Id int unsigned Imie - varchar(20) Nazwisko - varchar(40) data_urodzenia - date
Język SQL tworzenie przykładowej tabeli DROP TABLE IF EXISTS `Osoby`; CREATE TABLE `Osoby` ( `Id` int(6) unsigned NOT NULL auto_increment, `imie` varchar(20) NOT NULL, `nazwisko` varchar(40)not NULL, `data_urodzenia` date default NULL, PRIMARY KEY (`Id`) ) ;
Język SQL dodawanie danych Tworzenie tabeli: INSERT INTO Składnia: Jeśli pilnujemy kolejności kolumn: INSERT INTO table_name VALUES (value1, value2, value3,...); Niezależnie od kolejności: INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...);
Język SQL dodawanie danych INSERT INTO `waluty` VALUES (1, 2000-01-03, 4.1171,4.165,6.6576); INSERT INTO `waluty` (`Id`,`data`,`USD`,`EUR`,`GBP`) VALUES (2,'2000-01-04',4.1267,4.2232,6.7571); INSERT INTO `waluty` (`data`,`usd`,`eur`,`gbp`) VALUES ('2000-01-05',4.1299,4.2797,6.776); INSERT INTO waluty (data,usd) VALUES ('2000-01-06, 4.1129); Pozostałe pola zostaną wypełnione automatycznie (auto_increment) bądź będą miały wartość NULL.
Język SQL komenda SELECT SELECT column1, column2,... FROM table_name [WHERE condition] [ORDER BY o_column] gdzie: column1, column2,... to nazwy kolumn, których zawartość ma być wyświetlona jako wynik zapytania. table_name to nazwa tabeli, z której pobierane są dane condition to warunek jaki muszą spełniać wiersze tabeli, aby zostać wyświetlone o_column to kolumna, wg. której mają być posortowane wyniki zapytania
Język SQL komenda SELECT Chcąc pobrać wszystkie kolumny z tabeli zamiast wypisywać ich nazwy można użyć * (gwiazdka), np.. komenda: SELECT * FROM osoby; zwróci wszystkie kolumny z tabeli osoby. Parametry [WHERE condition] oraz [ORDER BY o_column] są opcjonalne.
Język SQL komenda SELECT Załóżmy, że tabela osoby zawiera trzy kolumny: imie, nazwisko oraz wiek. W takim przypadku komenda: SELECT imie FROM osoby WHERE wiek = 18 zwróci imiona osób, które mają 18 lat. SELECT nazwisko, imie FROM osoby ORDER BY wiek zwróci nazwiska i imiona wszystkich osób z tabeli, posortowane według wieku. SELECT nazwisko, imie FROM osoby ORDER BY nazwisko DESC zwróci nazwiska i imiona wszystkich osób z tabeli, posortowane alfabetycznie według nazwisk, w odwróconej kolejności od Z do A (modyfikator DESC sprawia, że kolejność sortowania jest odwócona)
Język SQL komenda SELECT W warunkach występujących po WHERE można stosować: operatory porównania =, >=, > itp. operatory logiczne AND i OR do porównywania łańcuchów można stosować polecenie LIKE akceptujące wzorce napisów, w których znak _ zastępuje dowolną literę, zaś znak % zastępuje dowolny ciąg znaków SELECT * FROM osoby WHERE nazwisko LIKE 'A%' zwróci wszystkie dane osób, których nazwisko rozpoczyna się na literę A. W "warunkach" można używać również operatora BETWEEN, który pozwala wybierać dane z określonego zakresu, np.: SELECT * FROM osoby WHERE wiek BETWEEN 18 AND 30 zwróci rekordy z osobami o wieku od 18 do 30 lat. Jest to równoważne z zapisem: SELECT * FROM osoby WHERE wiek > 18 AND wiek < 30
Język SQL komenda UPDATE Zmiana wierszy tabeli: UPDATE Składnia: UPDATE table_name SET column1 = value1, column2 = value2,... WHERE condition );
Język SQL komenda UPDATE Zmiana wierszy tabeli: UPDATE Przykład: UPDATE Osoby SET imie = Katarzyna, nazwisko = Kwiatkowska WHERE id=2; );
Język SQL komenda DELETE Usuwanie wierszy tabeli: DELETE FROM Składnia: DELETE FROM table_name WHERE condition ; Przykład: DELETE FROM OSOBY WHERE imie = Malgorzata ; Usunie wszystkie Małgorzaty z tabeli OSOBY
H2 umożliwia łączenie się z bazą z panelu kontrolnego z poziomu przeglądarki Wystarczy po instalacji odpalić program H2 Console, wtedy pojawią się następujące okienka: (plik z bazą musi być w katalogu domowym użytkownika) http://www.h2database.com/html/quickstart.html
Java i bazy danych Mamy już język porozumiewania się z bazą danych (SQL)....ale przecież chcąc porozumiewać się z bazą danych nie będziemy za każdym razem wpisywać komend w konsoli. Zwykle chcemy, by nasz program w wyniku np. naciśnięcia przycisku pobierał dane / odpowiednio modyfikował bazę danych. Chcielibyśmy więc bezpośrednio z poziomu kodu Javy wysyłać do bazy danych odpowiednie instrukcje.
Java DataBase Connectivity JDBC, ang. Java DataBase Connectivity, to biblioteka stanowiąca interfejs umożliwiający aplikacjom napisanym w języku Java porozumiewać się z bazami danych za pomocą języka SQL. Interfejs ten operuje na poziomie typowego dla baz danych języka SQL i pozwala w prosty sposób konstruować zapytania do bazy danych oraz wykorzystywać ich wyniki w kodzie Javy. Środowisko Java zawiera API JDBC, natomiast użytkownik musi dodatkowo uzyskać sterownik JDBC dedykowany do swojej bazy danych.
JDBC ogólna zasada wykorzystania 1. Uzyskanie połączenia ze źródłem danych 2. Wykonywanie operacji na bazie danych (przekazywanie poleceń w postaci kwerend SQL) 3. Przetwarzanie danych pobranych z bazy w efekcie wykonania kwerend
JDBC ogólna zasada wykorzystania // Łączenie z bazą: Connection con = DriverManager.getConnection( "jdbc:mydriver:mydatabase", username, password); // Wykonywanie kwerendy: Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery( "SELECT a, b, c FROM Table1"); // Przetwarzanie pobranych danych while (rs.next()) { int x = rs.getint("a"); String s = rs.getstring("b"); float f = rs.getfloat("c"); }
JDBC ogólna zasada wykorzystania // Łączenie z bazą: Connection con = DriverManager.getConnection( "jdbc:mydriver:mydatabase", username, password); H2: // Wykonywanie kwerendy: "jdbc:h2:nazwabazy", Statement stmt = con.createstatement(); username, ResultSet rs = stmt.executequery( Jeśli baza danych nie istnieje, password "SELECT a, b, c FROM Table1"); to próba podłączenia spowoduje // Przetwarzanie pobranych danych utworzenie nowej pustej bazy while (rs.next()) { (w postaci pliku *.db). int x = rs.getint("a"); String s = rs.getstring("b"); float f = rs.getfloat("c"); MySQL: } "jdbc:mysql://localhost/nazwabazy? user=username&password=password
Tworzenie bazy z poziomu JAVY TworzenieBazy.java Program otwiera / tworzy bazę danych H2 o nazwie nazwabazy nazwa użytkownika to sa domyślnie bez hasła conn = DriverManager.getConnection("jdbc:h2:nazwabazy", "sa", ""); // domyslnie nazwa uzytkownika to "sa" a dostep jest bez hasla - "" // Proba podlaczenia do bazy H2, ktora nie istnieje // domyslnie powoduje utworzenie nowej instancji pustej bazy // (w postaci pliku z rozszerzeniem *.db, np. nazwabazy.h2.db) // Dymyslne tworzenie pustej bazy danych czasem moze generowac bledy, // dlatego mozliwe jest wylaczenie domyslnego tworzenia pustej bazy // conn = DriverManager.getConnection("jdbc:h2:nazwabazy5;IFEXISTS=TRUE", "sa", "");
JDBC ogólna zasada wykorzystania // Łączenie z bazą: Connection con = DriverManager.getConnection( "jdbc:mydriver:mydatabase", username, password); // Wykonywanie kwerendy: Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery( "SELECT a, b, c FROM Table1"); // Przetwarzanie pobranych danych Query = while (rs.next()) { Zapytanie, Kwerenda int x = rs.getint("a"); String s = rs.getstring("b"); float f = rs.getfloat("c"); }
JDBC ogólna zasada wykorzystania // Łączenie z bazą: Connection con = DriverManager.getConnection( "jdbc:mydriver:mydatabase", username, password); // Wykonywanie kwerendy: Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery( "SELECT a, b, c FROM Table1"); // Przetwarzanie pobranych danych Język SQL while (rs.next()) { int x = rs.getint("a"); String s = rs.getstring("b"); float f = rs.getfloat("c"); }
Operacje na bazie z poziomu JAVY Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * FROM Tab1"); Trzy podstawowe metody wywołania kwerend: stmt.executequery(...), stmt.executeupdate(...), stmt.execute(...) Różnią się to sposobem przekazywania wyniku. W pierwszym przypadku otrzymamy wynik w postaci tabeli (wynik zapytania). ExecuteQuery stosuje się zazwyczaj do zapytań typu SELECT... W drugim przypadku otrzymamy ilość pomyślnie przeprowadzonych zmian w bazie. Update stosuje się zazwyczaj do zapytań typu CREATE TABLE... lub INSERT... Trzecia opcja jest uogólnieniem dwóch poprzednich. Zwraca wynik, z tym, że to użytkownik musi sprawdzić jaki wynik otrzymał.
Execute //Wyswietlanie calej tabeli: statement.execute("select * FROM waluty"); //Ograniczenie do 10 pierwszych rekordow statement.execute("select * FROM waluty limit 10" ); // Przykladowe kwerendy z dodatkwoym warunkiem: statement.execute("select * FROM waluty where data < '2001-03-27'"); statement.execute("select * FROM waluty where usd > 4.50"); statement.execute("select * FROM waluty where usd > 4.50 and eur < 3.83");
TworzenieTabeli.java Program tworzy tabelę waluty i wypełnia przykładowymi wartościami. Statement statement = conn.createstatement(); // Usuwanie tabeli jeśli już istnieje // kolejne uruchomienie przykladu nie wygeneruje bledu: statement.executeupdate("drop TABLE IF EXISTS `waluty`;"); // Tworzenie tabeli o okreslonej strukturze danych statement.executeupdate("create TABLE `waluty` ("+ "`Id` int(6) unsigned NOT NULL auto_increment,"+ "`data` date default NULL,"+ "`USD` float default NULL,"+ "`EUR` float default NULL,"+ "`GBP` float default NULL,"+ "PRIMARY KEY (`Id`)"+ ") ;");
TworzenieTabeli.java Dodawanie danych do tabeli: statement.executeupdate("insert INTO `waluty` (`Id`,`data`,`USD`,`EUR`,`GBP`) VALUES (1,'2000-0103',4.1171,4.165,6.6576);"); // Przykladowe rownowazne polecenia SQL: statement.executeupdateupdate("insert INTO `waluty` VALUES (1,'2000-01-03',4.1171,4.165,6.6576);"); statement.executeupdate("insert INTO `waluty` (`data`,`usd`,`eur`,`gbp`) VALUES ('2000-01-03, 4.1171, 4.165, 6.6576 );"); statement.executeupdate("insert INTO waluty VALUES (1,'2000-01-03',4.1171,4.165,6.6576);"); statement.executeupdate("insert INTO waluty (Id,data,USD,EUR,GBP) VALUES (1,'2000-0103',4.1171,4.165,6.6576);");
Prepared Statement Zamiast interfejsu Statement, w którym wykorzystujemy dokładną (statyczną) treść kodu SQL, można wykorzystać typ PreparedStatement, który pozwala na parametryzację. Użycie prekompilowanych komend jest wygodne, jeśli wywołujemy wiele podobnych komend na różnych argumentach, lub kiedy chcemy pobrać poszczególne wartości od użytkownika. PreparedStatement prep = conn.preparestatement ("INSERT into waluty(data, usd, eur, gbp) values (?,?,?,?)"); prep.setstring(1, "2000-01-03"); prep.setstring(2, "4.1171"); prep.setstring(3, "4.165"); prep.setstring(4, "6.6576"); prep.executeupdate(); Co jest równoważne:
Prepared Statement dodatkowa funkcjonalność Wyobraźmy sobie aplikację, do której użytkownik się loguje. Użytkownik podaje login ( name ) i hasło ( password ) a następnie uruchamiane jest zapytanie: statement.execute("select COUNT(*) FROM users WHERE name=" + name + "AND password=" + password); ResultSet rs = statement.getresultset(); rs.next(); if (rs.getint(1) == 0){ //niezalogowany } A użytkownik wpisuje jako login:
Prepared Statement dodatkowa funkcjonalność Wyobraźmy sobie aplikację, do której użytkownik się loguje. Użytkownik podaje login ( name ) i hasło ( password ) a następnie uruchamiane jest zapytanie: statement.execute("select COUNT(*) FROM users WHERE name=" + name + "AND password=" + password); ResultSet rs = statement.getresultset(); rs.next(); if (rs.getint(1) == 0){ //niezalogowany } A użytkownik wpisuje jako login: "; DROP TABLE users; --"
Prepared Statement dodatkowa funkcjonalność A użytkownik wpisuje jako login: "; DROP TABLE users; --" Czyli baza danych dostaje zapytanie: SELECT COUNT(*) FROM users WHERE name=; DROP TABLE users;
Prepared Statement dodatkowa funkcjonalność A użytkownik wpisuje jako login: "; DROP TABLE users; --" Czyli baza danych dostaje zapytanie: SELECT COUNT(*) FROM users WHERE name=; DROP TABLE users; Zwróci informacje o błędzie. Usunie tabelę users.
Prepared Statement Jeśli chcemy pobierać wartości od użytkownika to nigdy, nigdy NIGDY nie tworzymy zapytań SQL z dodawania takich ciągów znaków. Należy używać polecenia PreparedStatement które zapewni, by podane przez użytkownika wartości nigdy nie zostanały ziterpretowane jako samodzielne polecenia SQL.
TworzenieTabeli.java Dodawanie danych do tabeli: // Rownowazne wywolanie z wykorzystaniem PreparedStatement PreparedStatement prep = conn.preparestatement ("INSERT into waluty(data, usd, eur, gbp) values (?,?,?,?)"); prep.setstring(1, "2000-01-03"); prep.setstring(2, textboxusd.text); prep.setstring(3, textboxeur.text); prep.setstring(4, textboxgbp.text); prep.executeupdate(); Używając PreparedStatement możemy bezpiecznie brać dane od użytkownika.
JDBC ogólna zasada wykorzystania // Łączenie z bazą: Connection con = DriverManager.getConnection( "jdbc:mydriver:mydatabase", username, password); // Wykonywanie kwerendy: Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery( "SELECT a, b, c FROM Table1"); // Przetwarzanie pobranych danych while (rs.next()) { int x = rs.getint("a"); String s = rs.getstring("b"); float f = rs.getfloat("c"); }
ResultSet Wyniki wykonanej kwerendy dostępne są w obiekcie klasy ResultSet. ResultSet zawiera linie (rekordy) z wyniku wykonanej operacji. Początkowo jest ustawiony przed pierwszą linią. Aby przesunąć go na następna linijkę i przy okazji sprawdzić, czy jest więcej wyników, wykorzystuje się metodę next().
ResultSet, ResultSetMetaData ResultSet rs = statement.getresultset(); ResultSetMetaData md = rs.getmetadata(); //wyswietlanie nazw kolumn: for (int ii = 1; ii <= md.getcolumncount(); ii++){ System.out.print(md.getColumnName(ii)+ " "); } System.out.println(); // wyswietlanie poszczegolnych wierszy while (rs.next()) { for (int ii = 1; ii <= md.getcolumncount(); ii++){ System.out.print( rs.getobject(ii) + " "); } System.out.println(); }
WypisywanieTabeli.java //Wyswietlanie calej tabeli: statement.execute("select * FROM waluty"); //Ograniczenie do 10 pierwszych rekordow statement.execute("select * FROM waluty limit 10" ); // Przykladowe kwerendy z dodatkwoym warunkiem: statement.execute("select * FROM waluty where data < '2001-03-27'"); statement.execute("select * FROM waluty where usd > 4.50"); statement.execute("select * FROM waluty where usd > 4.50 and eur < 3.83"); Jeśli chcemy wyświetlić wynik z każdego statement, to po każdym execute musimy wyciągnąć ResultSet.
WypisywanieTabeli.java
Wykres.java Tworzenie pliku JAR konieczny dostęp do pliku z bazą danych
Informacje dodatkowe
Nomenklatura obiektów w różnych terminologiach Teoria relacyjna Model ER (EntityRelationship) Relacyjne bazy Aplikacje Relacja Encja Tabela Klasa Krotka Instancja Wiersz Instancja klasy (obiekt) Atrybut Atrybut Kolumna Właściwość, atrybut Dziedzina Dziedzina/typ Typ danych Typ danych
Struktura JDBC
Klasy i interfejsy JDBC