Lekce 5 - Programování databázového Wrapperu v Javě - Příprava
V předchozí lekci, Databáze v Java JDBC - INSERT, UPDATE, DELETE a COUNT, jsme se naučili základní databázové operace INSERT, UPDATE a DELETE.
Dosud jsme při práci s databází psali kód stále dokola a vznikaly nám tak duplicitní části kódu. V dnešním díle si proto vytvoříme náš vlastní databázový wrapper, který nám v aplikacích ušetří práci a my se budeme moci soustředit na logiku aplikace a nebudeme se muset tolik zabývat jazykem SQL.
V tomto tutoriálu ještě nebudeme vytvářet samotný wrapper, ale připravíme si testovací data, vytvoříme databázi, tabulky a nakonfigurujeme náš projekt. Můžete tedy brát tento úvodní díl jako přípravu do dalších dílů, kde se již budeme tvorbou wrapperu plně zabývat.
Založení a příprava projektu
Vytvoříme si v IntelliJ nový projekt z kategorie Java - Maven s názvem
Wrapper
a balíčkem cz.itnetwork
. IDE nám vytvoří
základní strukturu projektu s Main
třídou v balíčku
cz.itnetwork
. Hlavní třída bude později obsahovat databázový
wrapper, proto ji přejmenujeme na Wrapper.java
. Do projektu
postupně doplníme třídy Database
a Query
, které
umístíme do samostatného balíčku s názvem DB
. Klikneme
pravým tlačítkem myši na složku java/
a balíček si do
projektu přidáme a vytvoříme v něm obě uvedené třídy.
Nakonec nesmíme zapomenout k projektu přes soubor pom.xml
přidat ovladač MySQL JDBC Driver. Postup byl popsán v lekci
Databáze v Java
JDBC - Výpis dat a parametry.
Vizuální prostředí databáze
Pro lepší pochopení a snadnější práci s databází MySQL můžeme používat některé z grafických prostředí. Na výběr máme mnoho programů, například phpMyAdmin nebo DatAdmin, můžeme též použít IntelliJ plugin DB Browser, který jsme si popsali na začátku kurzu.
Návrh databáze
Abychom měli náš wrapper na čem vyzkoušet, tak si vytvoříme databázi
osoby
a v ní jednu jednoduchou tabulku programatori
,
která bude mít sloupce id
, jmeno
, vek
a
jazyk
. Buďto využijte grafického prostředí a jednoduše si
databázi a tabulku naklikejte nebo použijte následující SQL dotaz:
CREATE DATABASE `osoby`; CREATE TABLE `osoby`.`programatori` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `jmeno` VARCHAR(30) NOT NULL, `vek` INT NOT NULL, `jazyk` VARCHAR(20) NOT NULL ) ENGINE = INNODB;
Testovací data
Testovací data jsou důležitou součástí každého projektu. Jen řádně
otestovaná aplikace (nebo třída, knihovna) je správně fungující aplikace.
Proto do tabulky programatori
vložíme 14 testovacích
subjektů:
INSERT INTO `osoby`.`programatori` ( `jmeno`, `vek`, `jazyk` ) VALUES ('James', 23, 'Java'), ('Danna', 32, 'Java'), ('Kaitlin', 41, 'Python'), ('Daniel', 18, 'PHP'), ('Jack', 51, 'Delphi'), ('Kaitlin', 26, 'C#'), ('Kate', 52, 'Modula-3'), ('Amy', 38, 'Java'), ('Josh', 66, 'PHP'), ('Joe', 39, 'Python'), ('Matthew', 37, 'F#'), ('Gabriel', 21, 'PHP'), ('Lara', 20, 'C++'), ('Samantha', 16, 'VB.NET');
Ukázka
Nyní si ukážeme, jak bychom řešili 5 jednoduchých úloh bez wrapperu a jak to bude vypadat s ním.
Běžné řešení
Vypsání tabulky:
try (Connection spojeni = DriverManager.getConnection("jdbc:mysql://localhost/osoby?user=root&password="); PreparedStatement dotaz = spojeni.prepareStatement("SELECT * FROM programatori"); ResultSet vysledky = dotaz.executeQuery()) { while (vysledky.next()) { System.out.println(vysledky.getString("jmeno") + " - " + vysledky.getString("jazyk")); } } catch (SQLException ex) { System.out.println("Chyba při komunikaci s databází: " + ex.getMessage()); }
Poté bychom někde v aplikaci potřebovali vymazat jednoho programátora z databázové tabulky :
try (Connection spojeni = DriverManager.getConnection("jdbc:mysql://localhost/slovnicek_db?user=root&password="); PreparedStatement dotaz = spojeni.prepareStatement("DELETE FROM programatori WHERE jmeno = ?")) { dotaz.setString(1, "Jack"); int radku = dotaz.executeUpdate(); System.out.println("Počet smazaných řádků: " + radku); } catch (SQLException ex) { System.out.println("Chyba při komunikaci s databází: " + ex.getMessage()); }
Takovéto řešení (pouze 2 úloh) je hodně dlouhé a navíc, pokud s databází pracuje více tříd, bude kód duplicitní (viz výše).
Řešení s wrapperem
Následující kód provádí s databází hned 5 úloh:
try { System.out.println("Vítejte"); Database database = new Database("osoby", "root", ""); int uspech1 = database.delete("osoby", "jmeno = ?", "gali"); int uspech2 = database.delete("osoby", "id = ?", 12); int uspech3 = database.save("osoby", null, "Galí", 43, "PHP"); String[] columns = {"jmeno", "vek"}; int uspech = database.update("osoby", columns, "where id = ?", "Galileo", 40, 30); System.out.println(uspech); System.out.println(uspech1); System.out.println(uspech2); System.out.println(uspech3); ResultSet vysledky = database.select("SELECT * FROM `osoby`", null); while (vysledky.next()) { System.out.println(vysledky.getString("jmeno") + " - " + vysledky.getString("jazyk")); } } catch (SQLException ex) { System.out.println("Chyba - " + ex.getMessage()); }
Kód je mnohem kratší a přehlednější něž ten původní. Zatím vám to asi nic neřekne, ale nebojte, všech 5 úkolů si při tvorbě wrapperu popíšeme a vysvětlíme.
V příští lekci, Databázový wrapper v Javě - Tvorba třídy Query, se konečně naplno pustíme do programování vlastního wrapperu.