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 INSTERT, 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 úvodním dí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.
Vizuální prostředí databáze
Pro lepší pochopení a snadnější práci s databází MySQL můžete používat některé z grafických prostředí. Na výběr máme mnoho programů. Já vám mohu doporučit například phpMyAdmin, nebo DatAdmin. Určitě existuje mnoho dalších vývojových prostředí. Jestli znáte nějaké jiné grafické prostředí a vyhovuje vám více, než tyto nástroje, klidně jej používejte.
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
Ta 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` ( `id` , `jmeno` , `vek` , `jazyk` ) VALUES ( 'null', 'James', '23', 'java' ), ( 'null', 'Danna', '32', 'java' ), ( 'null', 'Kaitlin', '41', 'Pythor' ), ( 'null', 'Daniel', '18', 'php' ), ( 'null', 'Jack', '51', 'Delphi' ), ( 'null', 'Kaitlin', '26', 'c#' ), ( 'null', 'Kate', '52', 'Modula-3' ), ( 'null', 'Amy', '38', 'java' ), ( 'null', 'Josh', '66', 'php' ), ( 'null', 'Joe', '39', 'Pythor' ), ( 'null', 'Matthew', '37', 'f#' ), ( 'null', 'Gabriel', '21', 'php' ), ( 'null', 'Lara', '20', 'c++' ), ( 'null', '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:
// 1) 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(vysledek.getString("jmeno")+" - "+vysledek.getString("jazyk")); } } catch (SQLException ex) { System.out.println("Chyba při komunikaci s databází"); }
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(radku); } catch (SQLException ex) { System.out.println("Chyba při komunikaci s databází"); }
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 vysledek = database.select("SELECT * FROM `osoby`", null); while(vysledek.next()) { System.out.println(vysledek.getString("jmeno")+" - "+vysledek.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.
Založení a příprava projektu
Vytvoříme si v NetBeans nový projekt z kategorie Java - Java Application s názvem Wrapper. Zatím máme v aplikaci jen jeden balíček s názvem Wrapper. Vytvoříme si proto nový balíček DB a v tomto balíčku si vytvoříme třídu Database.
Postup
Klikneme na složku Source Packages pravým tlačítkem myši a zvolíme new -> Java Package. Package nazveme DB.
Poté na tento balíček klikneme pravým tlačítkem myši a zvolíme new -> Java Class. Třídě dáme jméno Database.
Nakonec si nesmíme zapomenout k projektu přidat ovladač MySQL JDBC Driver. Postup byl popsán v jednom z minulých tutoriálů. Můžete jej najít zde
V dnešním dílu je to vše a já se na vás budu těšit příště.
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.