5. díl - Programování databázového Wrapperu v Javě - Příprava

Java Databáze Programování databázového Wrapperu v Javě - Příprava

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 úloho 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 Aplication 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.

Nový Java balíček

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ě, kdy se konečně naplno pustíme do programování vlastního wrapperu.


 

  Aktivity (1)

Článek pro vás napsal Milan Gallas
Avatar
Autor se věnuje programování, hardwaru a počítačovým sítím.

Jak se ti líbí článek?
Celkem (2 hlasů) :
55555


 



 

 

Komentáře

Avatar
Silvinios
Redaktor
Avatar
Silvinios:

Díky za článek. Zajímalo by mě, proč se tabulka jmenuje programatori a ne programator. Jaký smysl má používat množné číslo u názvů tabulek?

 
Odpovědět  +1 27.6.2014 17:59
Avatar
Milan Gallas
Redaktor
Avatar
Odpovídá na Silvinios
Milan Gallas:

tabulka programatori, protože je v ní uloženo několik programátorů a přijde mi to tak prostě logické. Jestli používáš jednotná čísla u názvů tabulek, tak to tak dělej, to už je na tobě :D A jinak s množným číslem co se týče databázových tabulek, se setkávám úplně všude. Naopak mi přijde naprosto nepochopitelné jak se může tabulka obsahující informace několika uživatelů jmenovat uživatel. Ale to je asi podle vkusu no.

 
Odpovědět 27.6.2014 23:24
Avatar
coells
Redaktor
Avatar
Odpovídá na Milan Gallas
coells:

Stejně tak můžeš tvrdit, že třídu v Javě pojmenuješ Programatori, protože je to šablona pro více instancí programátora.

MySQL databáze staví na tzv. Entity-Relationship Modelu. Tabulka je pouze fyzickou reprezentací entity, stejně jako sloupec je fyzickou reprezentací vztahu. Celý formální model za ERM a SQL by v množném čísle vypadal divně a jednotná čísla jsou naopak velice přirozená. To, že bys měl pojmenovávat tabulky v množném čísle, plyne pouze z toho, že chápeš modelování pouze intuitivně bez nutné teorie, která za ním skrývá.

 
Odpovědět  +2 28.6.2014 0:02
Avatar
coells
Redaktor
Avatar
Odpovídá na Milan Gallas
coells:

Abys měl lepší představu, jak modelování probíhá, podívej se na obrázek sem http://en.wikipedia.org/…onship_model

 
Odpovědět 28.6.2014 0:04
Avatar
Radim H.
Člen
Avatar
Radim H.:

Fungovalo vám zkopírování Testovacích dat a jejich vytvoření? Mě to šlo pouze, když jsem odstranil '' u null, chyba někde u mě nebo v článku? :)

 
Odpovědět 16.7.2014 13:24
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.