Teória 27: Databázy¶
Databázy patria medzi najdôležitejšie technológie pri vývoji moderných aplikácií. Umožňujú trvalé uchovávanie údajov, ich efektívne vyhľadávanie, úpravu a správu. Príkladmi údajov ukladaných do databázy sú:
- používateľské účty, objednávky v e-shope,
- knižničné katalógy,
- výsledky meraní, údaje zo senzorov.
Prečo databázy v Jave?¶
Väčšina reálnych Java aplikácií potrebuje perzistenciu dát. Hlavné dôvody sú:
- Dlhodobé uloženie dát (aj po reštarte aplikácie)
- Súbežný prístup viacerých používateľov/procesov
- ACID vlastnosti (Atomicity, Consistency, Isolation, Durability)
- Výkonné dotazovanie a reporting
ACID je skratka pre 4 vlastnosti databáz:
- Atomicita - Viaceré zmeny v databáza sa vykonajú ako jedna tranzakcia, buď sa vykonajú všetky, alebo ani jedna
- Konzistencia - Zmeny v databáze neporušia databázový invariant, napr. nepovolenie duplicitných hodnôt
- Izolácia - Pri súčasnom prístupe k databáze od viacerých užívateľov títo nebudú nikdy vidieť nedokončené zmeny od ostatných
- Durability - Po úspešnom prevedení zmeny sa táto zmena zachová aj pri reštarte aleo chybe systému
Relačné databázy¶
Najčastejšie sa v Jave pracuje s relačnými databázami. Údaje sú organizované do tabuliek pozostávajúcich z riadkov a stĺpcov.
| id | nazov | autor | rok |
|---|---|---|---|
| 1 | Java Programovanie | Ján Novák | 2023 |
| 2 | Databázy | Peter Horváth | 2022 |
Každý riadok predstavuje jeden záznam a každý stĺpec určitý atribút záznamu. Medzi najznámejšie relačné databázy patria:
- PostgreSQL
- SQLite
- MySQL / MariaDB
- Oracle Database
- Microsoft SQL Server
SQL Jazyk¶
Na komunikáciu s relačnými databázami sa používa jazyk SQL (Structured Query Language). Najčastejšie príkazy:
CREATE TABLE kniha (
id INTEGER PRIMARY KEY,
nazov TEXT,
autor TEXT,
rok INTEGER
);
INSERT INTO kniha(nazov, autor, rok)
VALUES ('Java Programovanie', 'Ján Novák', 2023);
Spôsoby prístupu k databázam¶
V Jave existujú tri hlavné druhy prístupu k databázam:
- JDBC - nízkoúrovňový, plná kontrola nad SQL
- ORM (Object-Relational Mapping) - automatické mapovanie Java objektov na tabuľky
- Vyššie abstrakcie - Spring Data JPA, jOOQ, Querydsl (nad ORM)
JDBC¶
JDBC je štandardné API jazyka Java určené na komunikáciu s databázami. Predstavuje vrstvu medzi Java aplikáciou a databázovým serverom. Vďaka JDBC môže programátor používať rovnaké rozhranie pre rôzne databázové systémy.
Každá databáza poskytuje vlastný JDBC ovládač (driver), ktorý zabezpečuje komunikáciu medzi aplikáciou a databázou.
JDBC driver je teda knižnica implementujúca JDBC rozhranie pre konkrétnu databázu. O pripojenie ku konkrétnej databáza sa v JDBC stará trieda DriverManager.
Pri práci s databázou sa v JDBC najčastejšie používajú tieto triedy:
Trieda Connection¶
Objekt triedy Connection reprezentuje otvorené spojenie s databázou.
Príklad vytvorenia spojenia so SQLite:
Po úspešnom vytvorení spojenia môže aplikácia vykonávať SQL príkazy.
Trieda Statement¶
Objekt triedy Statement slúži na vykonávanie jednoduchých SQL príkazov.
Používa sa najmä v jednoduchých príkladoch a pri SQL príkazoch bez parametrov.
Trieda PreparedStatement¶
PreparedStatement je rozšírením triedy Statement. Výhody:
- vyššia bezpečnosť,
- ochrana proti SQL Injection (little bobby tables),
- lepší výkon pri opakovanom vykonávaní,
- automatické ošetrenie (escapovanie) špeciálnych znakov.
Príklad:
String sql =
"SELECT * FROM kniha WHERE id = ?";
PreparedStatement pstmt =
conn.prepareStatement(sql);
pstmt.setInt(1, 5);
ResultSet rs = pstmt.executeQuery();
Vo väčšine reálnych aplikácií sa odporúča používať práve PreparedStatement.
Trieda ResultSet¶
Objekt triedy ResultSet obsahuje výsledok SQL dotazu.
while (rs.next()) {
int id = rs.getInt("id");
String nazov = rs.getString("nazov");
System.out.println(id + " " + nazov);
}
Metóda next() posúva kurzor na ďalší riadok výsledku. Najčastejšie používané metódy tejto triedy:
getInt()getLong()getDouble()getString()getBoolean()getDate()
SQLite¶
SQLite je najrozšírenejšia embedovaná relačná databáza na svete. Embedovaná znamená, že nepotrebujeme žiaden samostatný server, ale databáza beží priamo v našom programe.
Celá databáza je jeden súbor na disku. SQLite je napísaná v jazyku C, je veľmi rýchla a malá. Podporuje väčšinu SQL-92 + niektoré rozšírenia.
graph TD
A[Java aplikácia] -->|JDBC API| B[sqlite-jdbc Driver]
B --> C[SQLite C engine]
C --> D[library.db<br/>alebo :memory:]
Kedy SQLite používať?:
- Desktopové aplikácie
- Mobilné aplikácie (Android používa SQLite natívne)
- IoT / embedded systémy
- Lokálne úložisko v desktopových nástrojoch
- Testovanie a prototypovanie (rýchle vytvorenie DB v pamäti)
- Aplikácie s nízkou až strednou záťažou
Kedy SQLite nepoužívať?:
- Vysoká konkurencia zápisov (SQLite zamyká celú databázu pri zápise)
- Veľké dáta a komplexná analytika
- Distribuované systémy s viacerými nodmi
Túto databázu budeme používať aj my v našich ďalších úlohách.
Zhrnutie teórie¶
- Prečo databázy v Jave?
- Dlhodobé uloženie dát (aj po reštarte aplikácie)
- Súbežný prístup viacerých používateľov/procesov
- ACID vlastnosti (Atomicity, Consistency, Isolation, Durability)
- Výkonné dotazovanie a reporting
- ACID
- Atomicita - Viaceré zmeny v databáza sa vykonajú ako jedna tranzakcia, buď sa vykonajú všetky, alebo ani jedna
- Konzistencia - Zmeny v databáze neporušia databázový invariant, napr. nepovolenie duplicitných hodnôt
- Izolácia - Pri súčasnom prístupe k databáze od viacerých užívateľov títo nebudú nikdy vidieť nedokončené zmeny od ostatných
- Durability - Po úspešnom prevedení zmeny sa táto zmena zachová aj pri reštarte aleo chybe systému
- Relačné databázy
- Údaje sú organizované do tabuliek pozostávajúcich z riadkov a stĺpcov.
- Každý riadok predstavuje jeden záznam a každý stĺpec určitý atribút záznamu.
- Medzi najznámejšie relačné databázy patria: PostgreSQL, SQLite, MySQL / MariaDB, Oracle Database a Microsoft SQL Server
- Spôsoby prístupu k databázam
- JDBC - nízkoúrovňový, plná kontrola nad SQL
- ORM (Object-Relational Mapping) - automatické mapovanie Java objektov na tabuľky
- Vyššie abstrakcie - Spring Data JPA, jOOQ, Querydsl (nad ORM)
- JDBC
- Predstavuje vrstvu medzi Java aplikáciou a databázovým serverom, vďaka ktorej môže programátor používať rovnaké rozhranie pre rôzne databázové systémy.
- JDBC driver je teda knižnica implementujúca JDBC rozhranie pre konkrétnu databázu. O pripojenie ku konkrétnej databáza sa v JDBC stará trieda DriverManager.
- Objekt triedy Connection reprezentuje otvorené spojenie s databázou.
- Objekt triedy Statement alebo PreparedStatement slúži na vykonávanie SQL príkazov.
- Objekt triedy ResultSet obsahuje výsledok SQL dotazu.
- SQLite
- Populárna embedovaná relačná databáza. Nepotrebujeme žiaden samostatný server, ale databáza beží priamo v našom programe.
- Celá databáza je jeden súbor na disku.
- Oblasti použitia: Desktopové aplikácie, Mobilné aplikácie, IoT / embedded systémy
- Nie je vhodná v týchto prípadoch: Vysoká konkurencia zápisov, veľké dáta a komplexná analytika alebo Distribuované systémy s viacerými nodmi