Programowanie Obiektowe
Java
Małgorzata Janik
Zakład Fizyki Jądrowej
malgorzata.janik@pw.edu.pl
Bazy danych DBMS H2
JDBC SQL
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 tabele
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:
– 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, → relacyjna.
Photo by: Selmer van Alten
Bazy danych
● Co robimy?
– Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Ł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, → relacyjna.
– Ustalamy jakiego DBMS będziemy używać.
Popularne możliwości:
→
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, → relacyjna.
– Ustalamy jakiego DBMS będziemy używać.
Popularne możliwości:
→
→ 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, → relacyjna.
– Ustalamy jakiego DBMS będziemy używać.
Np.
→ H2.
– Tworzymy w DBMS wszystkie potrzebne tabele i wypełniamy je. Jak? Musimy się → 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):
date / datetime int float
varchar(255)
CREATE TABLE pracownik ( id int,
imie varchar(100),
nazwisko varchar(100) );
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ść
(zestaw wartości) po którym możemy każdy wiersz rozróżnić.
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” :
pierwszą wartością będzie 1,
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.
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
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:
Id, data, USD EUR, GBP
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:
date int 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 (column2, column1, column3, ...) VALUES (value2, value1, 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) bądź będą miały wartość NULL.
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:
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
●
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:
http://www.h2database.com/html/quickstart.html
(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?
user=username&password=password”
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
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
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
●
Modyfikacja wiersza tabeli
GIT (System Kontroli Wersji)
oraz krótko o
Window Builder (automatyczne GUI)
Javadoc (dokumentacja)
System Kontroli Wersji
GIT
System Kontroli Wersji
●
System kontroli wersji to oprogramowanie które pomaga śledzić zmiany w kodzie na przestrzeni czasu.
●
System kontroli wersji zapamiętuje konkretny stan danego kodu - i pozwala później odzyskać zapamiętaną wersję.
– Dzięki temu, że ma zapisanych kilka wersji tego samego kodu razem z oznaczeniem czasowym, może również porównać wersje ze sobą i jasno wyszczególnić zmimany.
●
Pozwala na automatyczne przechowywanie, odzyskiwanie,
logowanie i scalanie wersji kodu.
System Kontroli Wersji
●
Prosty system kontroli wersji:
–
Stworzenie katalogu o nazwie “projekt”
–
Sukcesywne tworzenie wewnątrz podkatalogów z nazwami “projekt_v1”,
“projekt_v2” i umieszczanie w nim konkretnych wersji kodu
●
Można nawet profesjonalnie poprawić system, używając dat zamiast zwykłych v1,
v2 ... v223
System Kontroli Wersji
System Kontroli Wersji
●
System kontroli wersji pomaga z:
– Tworzeniem backup-ów
● Oczywiste i niezbędne. Jak komputer się spali albo dysk wysiądzie, mamy kopie zapasową.
– Odtwarzanie poprzednich wyników
● Pozwala zawsze wrócić i uruchomić poprzednią wersję programu.
– Porównywaniem konkretnej wersji
● “W wersji z piątku ten guzik jeszcze działał! Co zmieniliśmy?”
– Rozwój kilku wersji równocześnie
● Jeśli dwie osoby chcą pracować jednocześnie nad tym samym projektem, system kontroli wersji pomoże bezboleśnie scalić ich pracę
– Workfows – zachowywanie uprawnień oraz kontroli nad kodem
● W firmach zwykle dany kawałek kodu jest dołączany do programu dopiero po zrecenzowaniu przez starszego programistę.
http://www.ateam-oracle.com/version-control/
System Kontroli Wersji
/ trunk
Kontrola wersji
●
Lokalna kontrola wersji
Kontrola wersji
●
Lokalna kontrola wersji
●
Centralizowana kontrola wersji
– Subversion (SVN)
Kontrola wersji
●
Lokalna kontrola wersji
●
Centralizowana kontrola wersji
– Subversion (SVN)
●
Rozproszona kontrola wersji
– GIT
Kontrola wersji
●
Lokalna kontrola wersji
●
Centralizowana kontrola wersji
– Subversion (SVN)
●
Rozproszona kontrola wersji
– GIT
Każdy ma swoją replikę (klon) pu sh
pu ll
GIT w praktyce
●
Co zrobić aby używać GITa?
–
Zainstalować program GIT https://git-scm.com/downloads.
–
Wybrać serwer na którym będzie przechowywane centralne repozytorium
–
Stworzyć nowe repozytorium (centralne) dla projektu
–
Pobrać kod, tworząc przy okazji lokalne repozytorium
●
Korzystanie z GITa:
–
Dodawać, usuwać, modyfikować kod i pliki
–
Update lokalnego repozytorium
–
Update centralnego repozytorium
●
Więcej informacji można znaleźć w:
–
https://guides.github.com/activities/hello-world/
–
http://namiekko.pl/2016/03/05/no-i-git-kontrola-wersji-sluzy-nie-tylko-programistom/
–
http://namiekko.pl/2016/03/13/git-przedzieram-sie-przez-galezie/
–
http://namiekko.pl/2016/03/12/git-w-eclipse/
GIT w praktyce
●
Co zrobić aby używać GITa?
–
Zainstalować program GIT https://git-scm.com/downloads.
–
Wybrać serwer na którym będzie przechowywane centralne repozytorium
–
Stworzyć nowe repozytorium (centralne) dla projektu
–
Pobrać kod, tworząc przy okazji lokalne repozytorium
●
Korzystanie z GITa:
–
Dodawać, usuwać, modyfikować kod i pliki
–
Update lokalnego repozytorium
–
Update centralnego repozytorium
●
Więcej informacji można znaleźć w:
–
https://guides.github.com/activities/hello-world/
–
http://namiekko.pl/2016/03/05/no-i-git-kontrola-wersji-sluzy-nie-tylko-programistom/
–
http://namiekko.pl/2016/03/13/git-przedzieram-sie-przez-galezie/
–
http://namiekko.pl/2016/03/12/git-w-eclipse/
Serwery na repozytoria GITa
https://github.com/
https://gitlab.com/
https://bitbucket.org/
GIT w praktyce
●
Co zrobić aby używać GITa?
–
Zainstalować program GIT https://git-scm.com/downloads.
–
Wybrać serwer na którym będzie przechowywane centralne repozytorium
–
Stworzyć nowe repozytorium dla projektu
–
Pobrać kod, tworząc przy okazji lokalne repozytorium
●
Korzystanie z GITa:
–
Dodawać, usuwać, modyfikować kod i pliki
–
Update lokalnego repozytorium
–
Update centralnego repozytorium
●
Więcej informacji można znaleźć w:
–
https://guides.github.com/activities/hello-world/
–
http://namiekko.pl/2016/03/05/no-i-git-kontrola-wersji-sluzy-nie-tylko-programistom/
–
http://namiekko.pl/2016/03/13/git-przedzieram-sie-przez-galezie/
–
http://namiekko.pl/2016/03/12/git-w-eclipse/
Nowe
repozytorium
centralne
GIT w praktyce
●
Co zrobić aby używać GITa?
–
Zainstalować program GIT https://git-scm.com/downloads.
–
Wybrać serwer na którym będzie przechowywane centralne repozytorium
–
Stworzyć nowe repozytorium dla projektu
–
Pobrać kod, tworząc przy okazji lokalne repozytorium
●
Korzystanie z GITa:
–
Dodawać, usuwać, modyfikować kod i pliki
–
Update lokalnego repozytorium
–
Update centralnego repozytorium
●
Więcej informacji można znaleźć w:
–
https://guides.github.com/activities/hello-world/
–
http://namiekko.pl/2016/03/05/no-i-git-kontrola-wersji-sluzy-nie-tylko-programistom/
–
http://namiekko.pl/2016/03/13/git-przedzieram-sie-przez-galezie/
–
http://namiekko.pl/2016/03/12/git-w-eclipse/
Pobieranie kodu z repozytorium Tworzenie repozytorium lokalnego
●
Pobrać kod, tworząc repozytorium lokalne:
– Zdobywamy link URL do repozytorium
– clone – używamy polecenia clone w wybranym przez nas miejscu.
git clone https://github.com/login/NazwaProjektu
Clone URL
– Po wykonaniu klonowania mamy na
komputerze repozytorium lokalne
GIT w praktyce
●
Co zrobić aby używać GITa?
–
Zainstalować program GIT https://git-scm.com/downloads.
–
Wybrać serwer na którym będzie przechowywane centralne repozytorium
–
Stworzyć nowe repozytorium dla projektu
–
Pobrać kod, tworząc przy okazji lokalne repozytorium
●
Korzystanie z GITa:
–
Dodawać, usuwać, modyfikować kod i pliki
–
Update lokalnego repozytorium
–
Update centralnego repozytorium
●
Więcej informacji można znaleźć w:
–
https://guides.github.com/activities/hello-world/
–
http://namiekko.pl/2016/03/05/no-i-git-kontrola-wersji-sluzy-nie-tylko-programistom/
–
http://namiekko.pl/2016/03/13/git-przedzieram-sie-przez-galezie/
–
http://namiekko.pl/2016/03/12/git-w-eclipse/
Korzystanie z GITa
●
Dodawanie, usuwanie, modyfikacja plików
– Tak samo, jak zawsze: modyfikujemy pliki lokalnie na własnym komputerze
– Do śledzenia aktualnych zmian służy polecenie status
●
Update lokalnego repozytorium
– Żeby nasze zmiany zostały zauważone i zapamiętane przez lokalne repozytorium
– Polecenia add i commit
●
Update centralnego repozytorium
– Polecenie push
– Oraz ściągnięcie danych z centralnego repozytorium: pull
Korzystanie z GITa
●
Dodawanie, usuwanie, modyfikacja plików
– Tak samo, jak zawsze: modyfikujemy pliki lokalnie na własnym komputerze
– Do śledzenia aktualnych zmian służy polecenie status
●
Update lokalnego repozytorium
– Żeby nasze zmiany zostały zauważone i zapamiętane przez lokalne repozytorium
– Polecenia add i commit
●
Update centralnego repozytorium
– Polecenie push
– Oraz ściągnięcie danych z centralnego repozytorium: pull
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working dir Wprowadzam jakies zmiany lalala; README.md
Untracked files:
(use "git add <file>..." to include in what will be committed) test.txt
“master” - główna i domyślna
gałąź repozytorium
Korzystanie z GITa
●
Dodawanie, usuwanie, modyfikacja plików
– Tak samo, jak zawsze: modyfikujemy pliki lokalnie na własnym komputerze
– Do śledzenia aktualnych zmian służy polecenie status
●
Update lokalnego repozytorium
– Żeby nasze zmiany zostały zauważone i zapamiętane przez lokalne repozytorium
– Polecenia add i commit
●
Update centralnego repozytorium
– Polecenie push
– Oraz ściągnięcie danych z centralnego repozytorium: pull
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working dir Wprowadzam jakies zmiany lalala; README.md
Untracked files:
(use "git add <file>..." to include in what will be committed) test.txt
Sugestie co zrobić ze zmianami:
add / checkout
Korzystanie z GITa
●
Dodawanie, usuwanie, modyfikacja plików
– Tak samo, jak zawsze: modyfikujemy pliki lokalnie na własnym komputerze
– Do śledzenia aktualnych zmian służy polecenie status
●
Update lokalnego repozytorium
– Żeby nasze zmiany zostały zauważone i zapamiętane przez lokalne repozytorium
– Polecenia add i commit
●
Update centralnego repozytorium
– Polecenie push
– Oraz ściągnięcie danych z centralnego repozytorium: pull
Korzystanie z GITa
●
Dodawanie, usuwanie, modyfikacja plików
– Tak samo, jak zawsze: modyfikujemy pliki lokalnie na własnym komputerze
– Do śledzenia aktualnych zmian służy polecenie status
●
Update lokalnego repozytorium
– Żeby nasze zmiany zostały zauważone i zapamiętane przez lokalne repozytorium
– Polecenia add i commit
●
Update centralnego repozytorium
– Polecenie push
– Oraz ściągnięcie danych z centralnego repozytorium: pull
$ git add test.txt
$ git add *
$ git status
On branch master
Your branch is up-to-date with 'origin/
Changes to be committed:
(use "git reset HEAD <file>..." to un modified: README.md
new file: test.txt Jeśli:
●
Zmodyfikowałam plik README.md
●
Stworzyłam nowy plik test.txt
Chciałabym zapisać te zmiany w repozytorium, więc:
●
Używam “add” na wszystkich plikach których zmiany chcę zapisać
●
tzw. ‘Staging’ - przygotowywuję pliki
Korzystanie z GITa
●
Dodawanie, usuwanie, modyfikacja plików
– Tak samo, jak zawsze: modyfikujemy pliki lokalnie na własnym komputerze
– Do śledzenia aktualnych zmian służy polecenie status
●
Update lokalnego repozytorium
– Żeby nasze zmiany zostały zauważone i zapamiętane przez lokalne repozytorium
– Polecenia add i commit
●
Update centralnego repozytorium
– Polecenie push
– Oraz ściągnięcie danych z centralnego repozytorium: pull git commit
●
Używam “commit” żeby zapisać te zmiany
$ git commit -m "Moj pierwszy commit z lokalnego repo"
[master 09ba074] Moj pierwszy commit z lokalnego repo 2 files changed, 2 insertions(+), 1 deletion(-)
●
lub ‘commit -m “komentarz” ‘ żeby dodać komentarz
Korzystanie z GITa
●
Dodawanie, usuwanie, modyfikacja plików
– Tak samo, jak zawsze: modyfikujemy pliki lokalnie na własnym komputerze
– Do śledzenia aktualnych zmian służy polecenie status
●
Update lokalnego repozytorium
– Żeby nasze zmiany zostały zauważone i zapamiętane przez lokalne repozytorium
– Polecenia add i commit
●
Update centralnego repozytorium
– Polecenie push
– Oraz ściągnięcie danych z centralnego repozytorium: pull
$ git push
$ git pull
Korzystanie z GITa
●
Zmieniłam lokalnie plik test1.txt oraz dodałam nowy plik test2.txt. Chcę je wypchnąć do
centralnego repozytorium. Co robię?
$ git status
$ git add test1.txt
$ git add test2.txt
$ git status
$ git commit -m "Test changes”
$ git pull
$ git push
$ git add *
”$” oznacza nowe polecenie w konsoli; nie należy go wpisywać.
Git w Eclipse - EGit
Help->Install New Software->http://download.eclipse.org/egit/updates/
Stworzenie nowego projektu w oparciu o istniejące repozytorium.
Git w Eclipse - EGit
Import… →
Projects from Git
Mamy dwie opcje: stworzyć projekt na podstawie istniejącego, lokalnego
repozytorium
(bo np. użyliśmy clone w lini komand jak było pokazane wcześniej)….
Git w Eclipse - EGit
Git w Eclipse - EGit
Albo klonować bezpośrednio z repozytorium centralnego
Mamy dwie opcje: stworzyć projekt na podstawie istniejącego, lokalnego
repozytorium
(bo np. użyliśmy clone w lini komand
jak było pokazane wcześniej)….
Musimy wybrać gałęzie do sklonowania z repozytorium.
Domyślnie będzie to główna gałąź
“master”.
Git w Eclipse - EGit
Import z projektu Gita przeprowadza nas przez kolejne okienka
kreatora…
Odkliknij „use default location”
i wybierz katalog
w którym znajduje się repozytorium!
(inaczej import zwróci błąd)
“General project” dobrze zadziała dla wszystkich
repozytoriów, gdzie nie mamy i nie chcemy mieć projektu
eclipse’a.
“Import using the New Project Wizard” jeśli w stworzonym
repozytorium centralnym chcemy utworzyć nowy projekt eclipse.
(1)
(2)
A jeśli już mam mój projekt?
Jeśli nie chcę importować projektu z zewnątrz, tylko chcę “wypchnąć”
istniejący projekt do repozytorium: Projekt Team Share Project... → →
Ponownie eclipse przeprowadzi nas
przez kolejne okienka kreatora…
Commit, push...
Git natychmiast bardzo wyraźnie ( > ) sygnalizuje te zmiany.
Wyświetlenie menu kontroli wersji (Team w menu kontekstowym projektu).
Jeśli wybierzemy “Commit...” pojawi nam się przyjazne okienko wktórym
wybieramy pliki które chcielibyśmy wypchnąć do repozytorium:
- lokalnego (Commit)
- zarówno lokalnego i centralnego (Commit and Push)
GIT w praktyce
●
Co zrobić aby używać GITa?
– Zainstalować program GIT https://git-scm.com/downloads
– Wybrać serwer na którym będzie przechowywane centralne repozytorium https://github.com/
– Zainstalować odpowiednią wtyczkę do eclipse’a
Help→ Install New Software →http://download.eclipse.org/egit/updates/
●
Więcej informacji można znaleźć w:
–
https://guides.github.com/activities/hello-world/
–
http://namiekko.pl/2016/03/05/no-i-git-kontrola-wersji-sluzy-nie-tylko-programistom /
–
http://namiekko.pl/2016/03/13/git-przedzieram-sie-przez-galezie/
–
http://namiekko.pl/2016/03/12/git-w-eclipse/
Window Builder
Eclipse Help Eclipse Marketplace “windowbuilder” → → →
Window Builder
https://www.eclipse.org/windowbuilder/