Programowanie Obiektowe
Java
Małgorzata Janik
Zakład Fizyki Jądrowej
Bazy danych DBMS
SQL H2
JDBC
Bazy danych
●
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).
za: Wikipedia
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:
●
relacyjne
●
obiektowe
●
relacyjno-obiektowe
●
strumieniowe
●
temporalne
●
nierelacyjne (NoSQL)
Najczęściej używane bazy danych:
RELACYJNE
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
– 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
Id imie nazwisko data_urodzenia
1 Małgorzata Janik 1887
2 Helena Nowak 1984
osoby
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
●
Mamy np.
wspomnianą książkę
telefoniczną
●
Chcemy ją zapisać w
postaci cyfrowej
●
Co robimy?
Photo by: Selmer van Alten
Bazy danych
● Co robimy?
– Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać.
Photo by: Selmer van Alten
–
Bazy proste:
●
kartotekowe
●
hierarchiczne
–
Bazy złożone:
●
relacyjne
●
obiektowe
●
relacyjno-obiektowe
●
strumieniowe
●
temporalne
●
nierelacyjne (NoSQL)
Bazy danych
● Co robimy?
– Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, → Łatwe, relacyjna.
Photo by: Selmer van Alten
Bazy danych
● Co robimy?
– Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, → Łatwe, relacyjna.
– Ustalamy jakiego DBMS będziemy używać.
Photo by: Selmer van Alten
Bazy danych
● Co robimy?
– Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, → Łatwe, relacyjna.
– Ustalamy jakiego DBMS będziemy używać.
Popularne możliwości:
→ Łatwe,
Photo by: Selmer van Alten
https://db-engines.com/en/ranking
Bazy danych
● Co robimy?
– Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, → Łatwe, relacyjna.
– Ustalamy jakiego DBMS będziemy używać.
Popularne możliwości:
→ Łatwe,
→ Łatwe, Bądź inne, dopasowane do naszych potrzeb :
Photo by: Selmer van Alten
https://db-engines.com/en/ranking
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.
Baza danych H2
http://www.h2database.com
Bazy danych
● Co robimy?
– Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, → Łatwe, relacyjna.
– Ustalamy jakiego DBMS będziemy używać.
Np.
→ Łatwe, H2.
– Tworzymy w DBMS wszystkie potrzebne tabele i wypełniamy je. Jak? Musimy się → Łatwe, jakoś skomunikować z naszą bazą danych.
●
Najbardziej popularnym językiem do komunikacji jest SQL.
Photo by: Selmer van Alten
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 ( ; )
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
Przykładowy skrypt (przykłady zapytań)
CREATE TABLE table_name ( column1 datatype,
column2 datatype, column3 datatype, ....
);
Język SQL – tworzenie przykładowej tabeli
Tworzenie tabeli: CREATE TABLE
●
Składnia:
Typ kolumny (przykłady):
int
date / datetime float
varchar(255)
CREATE TABLE pracownik ( int id,
varchar(100) imie,
varchar(100) nazwisko );
Język SQL – tworzenie przykładowej tabeli
Tworzenie tabeli: CREATE TABLE
●
Przykład:
id imie nazwisko
1 Jan Kowalski
2 Zofia Kwiatkowska
CREATE TABLE table_name ( column1 datatype not null, column2 datatype,
column3 datatype, .…
PRIMARY KEY (column1) );
Język SQL – tworzenie przykładowej tabeli
Tworzenie tabeli: CREATE TABLE
●
Składnia:
Klucz podstawowy (PRIMARY KEY):
Tabelę 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ść
CREATE TABLE table_name (
column1 datatype PRIMARY KEY, column2 datatype,
column3 datatype, .…
);
Język SQL – tworzenie przykładowej tabeli
Tworzenie tabeli: CREATE TABLE
●
Składnia:
Klucz podstawowy (PRIMARY KEY):
Tabelę 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ć.
CREATE TABLE table_name (
int id not null auto_increment , column2 datatype,
column3 datatype, .…
PRIMARY KEY (column1) );
Język SQL – tworzenie przykładowej tabeli
Tworzenie tabeli: CREATE TABLE
●
Składnia:
Automatyczne przypisywanie:
auto_increment pozwala na automatyczne wpisywanie
pól typu “id” :
CREATE TABLE table_name (
int id not null auto_increment , column2 datatype default wartość, column3 datatype,
.…
PRIMARY KEY (column1) );
Język SQL – tworzenie przykładowej tabeli
Tworzenie tabeli: CREATE TABLE
●
Składnia:
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
DROP TABLE IF EXISTS `waluty`;
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`) ) ;
Tworzenie tabeli: CREATE TABLE
Jeśli już istnieje tabela o nazwie “waluty” to ją usuń.
Stwórz tabelę “waluty” z następującymji kolumnami:
Język SQL – tworzenie przykładowej tabeli
DROP TABLE IF EXISTS `waluty`;
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`) ) ;
Tworzenie tabeli: CREATE TABLE
Typ kolumny:
int date float
getdate() -
funkcja zwracająca obecną datę Kluczem podstawowym jest
automatycznie inkrementowane
Id data USD EUR GPB
1 2018-04-02 4.1267 4.2232 6.7571
2 2018-04-03 4.1299 4.2797 6.776
waluty
Język SQL – tworzenie przykładowej tabeli
Id imie nazwisko data_urodzenia
1 Małgorzata Janik 1887
2 Helena Nowak 1984
osoby
Język SQL – tworzenie przykładowej tabeli
Id imie nazwisko data_urodzenia
1 Małgorzata Janik 1887
2 Helena Nowak 1984
osoby
Język SQL – tworzenie przykładowej tabeli
create table osoby + drop if exists
Id imie nazwisko data_urodzenia
1 Małgorzata Janik 1887
2 Helena Nowak 1984
osoby
Język SQL – tworzenie przykładowej tabeli
create table osoby
Primary key NOT NULL auto_increment
+ drop if exists
osoby
Język SQL – tworzenie przykładowej tabeli
create table osoby
Primary key NOT NULL auto_increment
Id – int unsigned Imie - varchar(20)
Nazwisko - varchar(40) data_urodzenia - date
+ drop if exists
Id imie nazwisko data_urodzenia
1 Małgorzata Janik 1887
2 Helena Nowak 1984
osoby
Język SQL – tworzenie przykładowej tabeli
create table osoby
Primary key NOT NULL auto_increment
Id – int unsigned Imie - varchar(20)
Nazwisko - varchar(40) data_urodzenia - date
+ drop if exists
Id imie nazwisko data_urodzenia
1 Małgorzata Janik 1887
2 Helena Nowak 1984
domyślnie NULL
DROP TABLE IF EXISTS `Osoby`;
CREATE TABLE `Osoby` (
`Id` int(6) unsigned NOT NULL auto_increment, `imie` varchar(20),
`nazwisko` varchar(40),
`data_urodzenia` date default NULL, PRIMARY KEY (`Id`)
) ;
Język SQL – tworzenie przykładowej tabeli
INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
Jeśli pilnujemy kolejności kolumn:
Niezależnie od kolejności:
Język SQL – dodawanie danych
Tworzenie tabeli: INSERT INTO
●
Składnia:
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)
Id data USD EUR GPB
1
2018-04-024.1267 4.2232 6.7571
2
2018-04-034.1299 4.2797 6.776
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:
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
●
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)
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
// Łą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);
// 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");
}
H2:
"jdbc:h2:nazwabazy", username,
password Jeśli baza danych nie istnieje,
to próba podłączenia spowoduje utworzenie nowej pustej bazy
(w postaci pliku *.db).
MySQL:
"jdbc:mysql://localhost/nazwabazy?
JDBC – ogólna zasada wykorzystania
Tworzenie bazy z poziomu JAVY
TworzenieBazy.java
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", "");
Program otwiera / tworzy bazę danych H2
●
o nazwie nazwabazy
●
nazwa użytkownika to sa
●
domyślnie bez hasła
// Łą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
Query =
Zapytanie, Kwerenda
// Łą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");
}
Język SQL
JDBC – ogólna zasada wykorzystania
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
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
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`)"+
") ;");
Program tworzy tabelę “waluty” i wypełnia przykładowymi wartościami.
TworzenieTabeli.java
Dodawanie danych do tabeli:
statement.executeUpdate("INSERT INTO `waluty`
(`Id`,`data`,`USD`,`EUR`,`GBP`) VALUES (1,'2000-01- 03',4.1171,4.165,6.6576);");
// Przykladowe rownowazne polecenia SQL:
statement.executeUpdate("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-01-
03',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.
Co jest równoważne:
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();
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; --"
drop table users;Prepared Statement
– dodatkowa funkcjonalność
●
A użytkownik wpisuje jako login:
●
Czyli baza danych dostaje zapytanie:
"; DROP TABLE users; --"
SELECT COUNT(*) FROM users
WHERE name=; DROP TABLE users;
Prepared Statement
– dodatkowa funkcjonalność
●
A użytkownik wpisuje jako login:
●
Czyli baza danych dostaje zapytanie:
"; DROP TABLE users; --"
SELECT COUNT(*) FROM users WHERE name=;
DROP TABLE users;
Zwróci informacje o błędzie.
Usunie tabelę “users”.
"; DROP TABLE users; --"
SELECT COUNT(*) FROM users WHERE name=;
DROP TABLE users; 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.
// Łą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
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
QUIZ
Czym jest?
● DBMS
● H2
● SQL
● JDBC
●
Język zapytań
●
System zarządzania bazą danych
●
Biblioteka umożliwiająca łączenie się z bazą danych za pomocą Javy
●
Baza danych
Czym jest?
● DBMS
● H2
● SQL
● JDBC
●
Język zapytań – do porozumiewania się z bazą danych
●
System zarządzania bazą danych
(np. MySQL, Oracle, H2)
●
Biblioteka umożliwiająca łączenie się z bazą danych za pomocą Javy
●
Baza danych (przykład DBMS)
Czym jest?
●
Kwerenda (query)
●
Krotka (tuple)
●
Relacja
●
Klucz podstawowy
●
Tabela
●
Wiersz z tabeli
(uporządkowany ciąg wartości)
●
Zapytanie mające na celu np.
pobranie danych, usuwanie, modyfikację.
●
Minimalny zestaw atrybutów
jednoznacznie identyfikujący
każdą krotkę
Czym jest?
●
Kwerenda (query)
●
Krotka (tuple)
●
Relacja
●
Klucz podstawowy
●
Tabela
●
Wiersz z tabeli
(uporządkowany ciąg wartości)
●
Zapytanie mające na celu np.
pobranie danych, usuwanie, modyfikację.
●
Minimalny zestaw atrybutów
jednoznacznie identyfikujący
każdą krotkę
Do czego służy?
●
INSERT INTO
●
SELECT * FROM
●
DROP TABLE
●
CREATE TABLE
●
UPDATE
Do czego służy?
●
INSERT INTO
●
SELECT * FROM
●
DROP TABLE
●
CREATE TABLE
●
UPDATE
●
Dodanie wiersza do tabeli
●
Wyciągnięcie danych z bazy danych
●
Usunięcie tabeli
●
Stworzenie tabeli
●