Cvičenie 19: Práca s databázou¶
Java poskytuje niekoľko rôznych spôsobov, ako pristupovať k databázam. Tým najzákladnejším je JDBC a s ním dnes budeme aj pracovať.
JDBC¶
Databáz je veľké množstvo a každá má svoj vlastný spôsob pripojenia. Java proces pripojenia a komunikácie s databázou zjednotila do jedného API s názvom JDBC (Java Database Connectivity).
Každá komunikácia s databázou v Jave sa realizuje cez JDBC driver.
Priame použitie JDBC API je však niekedy príliš nízkoúrovňové a komplikované,
preto Java aplikácie často používajú aj ďalšie nadstavby.
Vedieť pracovať s JDBC je však stále veľmi potrebné. JDBC je poskytovaná v rámci JDK, takže na jej použitie nie je potrebné inštalovať žiadnu knižnicu.
Hlavné triedy a rozhrania JDBC sú v balíku java.sql
| Trieda / Rozhranie | Účel |
|---|---|
DriverManager |
Získanie Connection |
Connection |
Spojenie s databázou + transakcie |
Statement |
Jednoduché SQL (riziko SQL injection) |
PreparedStatement |
Bezpečné parametrizované dotazy (?) |
ResultSet |
Výsledok SELECT (iterácia ako cursor) |
SQLException |
Výnimka pri chybe databázy |
Pomocou týchto tried vieme nadviazať spojenie s databázou a vykonať základné SQL príkazy.
Príklad vloženia údajov do existujúcej tabuľky:
String url = "jdbc:sqlite:library.db";
try (Connection conn = DriverManager.getConnection(url);
PreparedStatement ps = conn.prepareStatement(
"INSERT INTO books (title, author, published_year) VALUES (?, ?, ?)")) {
ps.setString(1, "Effective Java");
ps.setString(2, "Joshua Bloch");
ps.setInt(3, 2018);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
- Príkazy, ktoré menia databázu (CREATE, INSERT, UPDATE, DELETE) sa realizujú pomocou
executeUpdate - Príkazy, ktoré načítavajú dáta, sa realizujú pomocou
executeQuery
public List<Book> findAllBooks() {
List<Book> books = new ArrayList<>();
String sql =
"SELECT title, author, published_year FROM books";
try (
Connection conn = DriverManager.getConnection(URL);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)
) {
while (rs.next()) {
books.add(new Book(
rs.getString("title"),
rs.getString("author"),
rs.getInt("published_year")
));
}
} catch (SQLException e) {
e.printStackTrace();
}
return books;
}
Dôležité pravidlá¶
- Vždy používajte
try-with-resources(od Java 7) - Vždy používajte
PreparedStatementpri vstupe od používateľa - Obyčajný
Statementpoužívajte len na statické DDL (CREATE TABLE) - Mapovanie
ResultSetna objekty sa robí ručne, alebo sa použije ORM)
SQLite¶
Pre dnešné úlohy budeme používať databázu SQLite. Ide o populárnu a kvalitnú databázu, ktorá funguje priamo z vašej aplikácie a nie je potrebná žiadna inštalácia a konfigurácia.
Jediné, čo je potrebné vo vašom projekte urobiť, je použiť knižnicu org.xerial:sqlite-jdbc:3.53.1.0.
Celá SQLite databáza sa ukladá do jedného súboru na disku.
Na základe umiestnenia súboru si potom vytvoríte JDBC URL. Príklady:
- Súbor:
jdbc:sqlite:library.db - In-memory only (ideálne pre testy):
jdbc:sqlite::memory: - Read-only:
jdbc:sqlite:file:library.db?mode=ro
IDEA plugin na prehliadanie databázy¶
Obsah databázy si viete prezrieť aj priamo z nástroja IDEA po nainštalovaní pluginu Database Tools and SQL.
Úlohy¶
Úloha 19.1: Projekt telefónny zoznam
Vytvorte nový projekt a použite knižnicu SQLite.
Vytvorte triedu pre reprezentáciu osoby:
- Meno
- Priezvisko
- Telefónne číslo
Navrhnite štruktúru tabuľky pre osoby v telefónnom zozname. Pridajte aj jedinečný identifikátor a dátumy pridania a zmeny.
Vytvorte metódy na vytvorenie tabuľky a na pridanie nového kontaktu.
Vytvorte buď ovládanie pomocou konzoly alebo pomocou JavaFX.
Úloha 19.2: Naplnenie zoznamu
Vytvorte v tabuľke aspoň 50 záznamov.
Nainštalujte si Database Tools and SQL plugin a otvorte si v ňom SQLite databázu. Zobrazte v tomto nástroji štruktúru tabuľky a jej dáta.
Úloha 19.3: Výpis kontaktov
Pridajte do vašej aplikácie funkcionality na vypísanie kontaktov.
Úloha 19.4: Volanie a história hovorov
Pridajte do vašej aplikácie funkcionalitu na "volanie" a na výpis posledných hovorov.
Na zoznam hovorov si navrhnite a vytvorte novú tabuľku.
Zhrnutie cvičenia¶
- JDBC
- JDBC je poskytovaná v rámci JDK, takže na jej použitie nie je potrebné inštalovať žiadnu knižnicu.
-
DriverManager- ZískanieConnection -
Connection- Spojenie s databázou + transakcie -
Statement- Jednoduché SQL (riziko SQL injection) -
PreparedStatement- Bezpečné parametrizované dotazy (?) -
ResultSet- VýsledokSELECT(iterácia ako cursor) -
SQLException- Výnimka pri chybe databázy
- Príkazy
- Príkazy, ktoré menia databázu (CREATE, INSERT, UPDATE, DELETE) sa realizujú pomocou executeUpdate
- Príkazy, ktoré načítavajú dáta, sa realizujú pomocou executeQuery
- Dôležité pravidlá
- Vždy používajte
try-with-resources(od Java 7) - Vždy používajte
PreparedStatementpri vstupe od používateľa - Obyčajný
Statementpoužívajte len na statické DDL (CREATE TABLE) - Mapovanie
ResultSetna objekty sa robí ručne, alebo sa použije ORM)
- Vždy používajte
- SQLite
- Rýchla embedovaná databáza, ktorá ukladá celú databázu do jedného súboru
- Knižnica
org.xerial:sqlite-jdbc:3.53.1.0. - JDBC pre SQLite v súbore:
jdbc:sqlite:library.db - In-memory only JDBC (ideálne pre testy):
jdbc:sqlite::memory: - Read-only:
jdbc:sqlite:file:library.db?mode=ro
- IDEA plugin na prehliadanie databázy - Database Tools and SQL.