• Nie Znaleziono Wyników

Programowanie Obiektowe Java

N/A
N/A
Protected

Academic year: 2021

Share "Programowanie Obiektowe Java"

Copied!
88
0
0

Pełen tekst

(1)

Programowanie Obiektowe

Java

Małgorzata Janik

Zakład Fizyki Jądrowej

(2)

Bazy danych DBMS

SQL H2

JDBC

(3)

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

(4)

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)

(5)

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

(6)

Bazy danych

Relacyjne bazy danych

– w modelu relacyjnym dane grupowane są w

relacje, które reprezentowane są przez tablice

(7)

Bazy danych

● Relacyjne bazy danych

https://pl.wikipedia.org/wiki/Model_relacyjny#/

media/File:Relational_model_concepts_PL.png

(8)

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

(9)

Bazy danych

● Relacyjne bazy danych

– związki pomiędzy relacjami

zapewniają integralność referencyjną

danych i pozwalają modelować

odpowiednią

logikę naszej

struktury

(10)

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

(11)

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.

(12)

Bazy danych

Mamy np.

wspomnianą książkę

telefoniczną

Chcemy ją zapisać w

postaci cyfrowej

Co robimy?

Photo by: Selmer van Alten

(13)

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)

(14)

Bazy danych

● Co robimy?

– Ustalamy rodzaj bazy danych, w jakiej chcemy ją zapisać. Łatwe, → Łatwe, relacyjna.

Photo by: Selmer van Alten

(15)

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

(16)

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

(17)

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

(18)

Baza danych H2

(19)

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.

(20)

Baza danych H2

http://www.h2database.com

(21)

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

(22)

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.

(23)

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

(24)

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 ( ; )

(25)

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ń)

(26)

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)

(27)

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

(28)

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ść

(29)

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ć.

(30)

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” :

(31)

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.

(32)

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:

(33)

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

(34)

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

(35)

Id imie nazwisko data_urodzenia

1 Małgorzata Janik 1887

2 Helena Nowak 1984

osoby

Język SQL – tworzenie przykładowej tabeli

(36)

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

(37)

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

(38)

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

(39)

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

(40)

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

(41)

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:

(42)

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-02

4.1267 4.2232 6.7571

2

2018-04-03

4.1299 4.2797 6.776

(43)

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

(44)

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.

(45)

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)

(46)

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:

(47)

Język SQL – komenda UPDATE

Zmiana wierszy tabeli: UPDATE

Składnia:

UPDATE table_name SET column1 = ‘value1’, column2 = ‘value2’, ...

WHERE condition

);

(48)

Język SQL – komenda UPDATE

Zmiana wierszy tabeli: UPDATE

Przykład:

UPDATE Osoby

SET imie = ‘Katarzyna’,

nazwisko = ‘Kwiatkowska’

WHERE id=2;

);

(49)

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

(50)

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)

(51)
(52)

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.

(53)

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.

(54)

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

(55)

// Łą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

(56)

// Łą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

(57)

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

(58)

// Łą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

(59)

// Łą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

(60)

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

(61)

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");

(62)

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.

(63)

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);");

(64)

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();

(65)

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:

(66)

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;

(67)

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;

(68)

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”.

(69)

"; DROP TABLE users; --"

SELECT COUNT(*) FROM users WHERE name=;

DROP TABLE users; Usunie tabelę “users”.

(70)

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.

(71)

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.

(72)

// Łą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

(73)

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().

(74)

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();

}

(75)

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.

(76)

WypisywanieTabeli.java

(77)

QUIZ

(78)

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

(79)

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)

(80)

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ę

(81)

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ę

(82)

Do czego służy?

INSERT INTO

SELECT * FROM

DROP TABLE

CREATE TABLE

UPDATE

(83)

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

(84)

Dziękuję za Uwagę!

To już ostatni wykład.

Dziękuję wszystkim za uczestnictwo i

powodzenia na laboratoriach!

(85)

Informacje dodatkowe

(86)

Nomenklatura obiektów

w różnych terminologiach

Teoria relacyjna Model ER (Entity-

Relationship)

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

(87)

Struktura

JDBC

(88)

Klasy i interfejsy JDBC

Cytaty

Powiązane dokumenty

public void actionPerformed(ActionEvent arg0) {  setTitle(&#34;Anonimowa klasa wewnetrzna&#34;);  . } }

Programowanie Obiektowe (Wykład) Małgorzata Janik (WF PW) 80/116 public class MenuWindow extends JFrame {.

strumieniowych związanych z plikami podaliśmy jako argument nazwę pliku → 4 klasy strumieni abstrakcyjnych. ● można także utworzyć strumień plikowy podając jako

protected void done() - wywoływana po zakończeniu zadania, wykonywana w EDT, można w niej przeprowadzić „sprzątanie” i zaprezentować w GUI główny rezultat wykonywanego

Ćwiczenia poświęcone są różnym odcinkom kręgosłupa, a wiemy ile czasu spędzacie teraz w pozycji siedzącej.Jeżeli chcesz rozluźnić, rozciągnąć ale także wzmocnić

javax.sql.rowset.serial Provides utility classes to allow serializable mappings be- tween SQL types and data types in the Java programming language.. javax.sql.rowset.spi The

Każdy zbiór jest kolekcją tych obiektów, które pomyślnie przeszły test przynależności określony przez pojęcie. • Gdy stwierdzamy, że pojęcie stosuje się do

Relacyjna baza danych tym różni się od innych metod pozyskiwania danych, że jej użytkownik musi mieć pojęcie jedynie o danych, a nie o sposobie ich pobierania.. Relacyjna baza