5. diel - Programovanie databázového Wrappera v Jave - Príprava
V predchádzajúcej lekcii, Databázy v Java JDBC - INSERT, UPDATE, DELETE a COUNT, sme sa naučili základné
databázové operácie INSERT
, UPDATE
a
DELETE
.
Doposiaľ sme pri práci s databázou písali kód stále dookola a vznikali nám tak duplicitné časti kódu. V dnešnom diele si preto vytvoríme náš vlastný databázový wrapper, ktorý nám v aplikáciách ušetrí prácu a my sa budeme môcť sústrediť na logiku aplikácie a nebudeme sa tak musieť zaoberať jazykom SQL.
V tomto tutoriále ešte nebudeme vytvárať samotný wrapper, ale pripravíme si testovacie dáta, vytvoríme databázu, tabuľky a nakonfigurujeme náš projekt. Môžete teda brať tento úvodný diel ako prípravu do ďalších dielov, kde sa už budeme tvorbou wrappera plne zaoberať.
Založenie a príprava projektu
Vytvoríme si v IntelliJ nový projekt z kategórie Java - Maven s názvom
Wrapper
a balíčkom com.ictdemy
. IDE nám vytvorí
základnú štruktúru projektu s Main
triedou v balíčku
com.ictdemy
. Hlavná trieda bude neskôr obsahovať databázový
wrapper, preto ju premenujeme na Wrapper.java
. Do projektu postupne
doplníme triedy Database
a Query
, ktoré umiestnime
do samostatného balíčka s názvom DB
. Klikneme pravým
tlačidlom myši na priečinok java/
a balíček si do projektu
pridáme a vytvoríme v ňom obe uvedené triedy.
Nakoniec nesmieme zabudnúť k projektu cez súbor pom.xml
pridať ovládač MySQL JDBC Driver. Postup bol popísaný v
lekcii Databáza v
Java JDBC - Výpis dát a parametre.
Vizuálne prostredie databázy
Pre lepšie pochopenie a jednoduchšiu prácu s databázou MySQL môžeme používať niektoré z grafických prostredí. Na výber máme mnoho programov, napríklad phpMyAdmin alebo DatAdmin, môžeme tiež použiť IntelliJ plugin DB Browser, ktorý sme si popísali na začiatku kurzu.
Návrh databázy
Aby sme mali náš wrapper na čom vyskúšať, vytvoríme si databázu
persons
a v nej jednu jednoduchú tabuľku
programmers
, ktorá bude mať stĺpce id
,
name
, age
a language
. Buď využite
grafické prostredie a jednoducho si databázu a tabuľku naklikajte alebo
použite nasledujúci SQL dotaz:
CREATE DATABASE `persons`; CREATE TABLE `persons`.`programmers` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(30) NOT NULL, `age` INT NOT NULL, `language` VARCHAR(20) NOT NULL ) ENGINE = INNODB;
Testovacie dáta
Testovacie dáta sú dôležitou súčasťou každého projektu. Len riadne
otestovaná aplikácia (alebo trieda, knižnica) je správne fungujúca
aplikácia. Preto do tabuľky programmers
vložíme 14 testovacích
subjektov:
INSERT INTO `persons`.`programmers` ( `name`, `age`, `language` ) 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ážka
Teraz si ukážeme, ako by sme riešili 5 jednoduchých úloh bez wrappera a ako to bude vyzerať s ním.
Bežné riešenie
Vypísanie tabuľky:
try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/persons?user=root&password="); PreparedStatement statement = connection.prepareStatement("SELECT * FROM programmers"); ResultSet results = statement.executeQuery()) { while (results.next()) { System.out.println(results.getString("name") + " - " + results.getString("language")); } } catch (SQLException ex) { System.out.println("Error while communicating with the database"); }
Potom by sme niekde v aplikácii potrebovali vymazať jedného programátora z databázovej tabuľky:
try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/dictionary_db?user=root&password="); PreparedStatement statement = connection.prepareStatement("DELETE FROM programmers WHERE name = ?")) { statement.setString(1, "Jack"); int rows = statement.executeUpdate(); System.out.println("Number of rows deleted: " + rows); } catch (SQLException ex) { System.out.println("Error while communicating with the database"); }
Takéto riešenie (len 2 úloh) je veľmi dlhé a navyše, ak s databázou pracuje viacero tried, kód bude duplicitný (viď vyššie).
Riešenie s wrapperom
Nasledujúci kód vykonáva s databázou hneď 5 úloh:
try { System.out.println("Welcome"); Database database = new Database("persons", "root", ""); int success1 = database.delete("persons", "name = ?", "gali"); int success2 = database.delete("persons", "id = ?", 12); int success3 = database.save("persons", null, "Galí", 43, "PHP"); String[] columns = {"name", "age"}; int success = database.update("persons", columns, "where id = ?", "Galileo", 40, 30); System.out.println(success); System.out.println(success1); System.out.println(success2); System.out.println(success3); ResultSet results = database.select("SELECT * FROM `persons`", null); while (results.next()) { System.out.println(results.getString("name") + " - " + results.getString("language")); } } catch (SQLException ex) { System.out.println("Error - " + ex.getMessage()); }
Kód je oveľa kratší a prehľadnejší ako ten pôvodný. Zatiaľ vám to asi nič nepovie, ale nebojte sa, všetkých 5 úloh si pri tvorbe wrappera popíšeme a vysvetlíme.
V budúcej lekcii, Databázový wrapper v Jave - Tvorba triedy Query, sa konečne naplno pustíme do programovania vlastného wrappera.