Lekce 4 - Databáze v Java JDBC - INSERT, UPDATE, DELETE a COUNT
V předchozím kvízu, Kvíz - Základy práce s databází v Java JDBC, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V dnešním tutoriálu budeme pokračovat v práci s databází MySQL z Java kódu a ukážeme si, jak editovat záznamy v naší tabulce.
Vkládání, mazání a editace hodnot
Základní databázové operace se často označují zkratkou CRUD. Jedná se o operace CREATE (vytvořit), READ (číst), UPDATE (aktualizovat) a DELETE (odstranit).
Minule jsme si ukázali čtení dat. Již víme, že data z
databáze čteme příkazem SELECT a výsledky se ukládají do
kolekce ResultSet.
Vložení nového záznamu
Vyzvěme uživatele k zadání slovíčka anglicky a česky. Nové slovíčko
vložíme do databáze pomocí příkazu INSERT:
Scanner scanner = new Scanner(System.in, "Windows-1250"); System.out.println("Zadej nové slovíčko anglicky:"); String anglicky = scanner.nextLine(); System.out.println("Zadej nové slovíčko česky:"); String cesky = scanner.nextLine(); try (Connection spojeni = DriverManager.getConnection("jdbc:mysql://localhost/slovnicek_db?user=root&password="); PreparedStatement dotaz = spojeni.prepareStatement("INSERT INTO slovo (anglicky, cesky) VALUES (?, ?)")) { dotaz.setString(1, anglicky); dotaz.setString(2, cesky); int radku = dotaz.executeUpdate(); System.out.println(radku); } catch (SQLException ex) { System.out.println("Chyba při komunikaci s databází"); }
SQL dotaz pro vložení nového řádku do tabulky začíná příkazem
INSERT INTO, následuje název tabulky. V závorkách vypíšeme
názvy sloupců, do kterých vkládáme hodnoty. Za klauzuli VALUES
vypíšeme do závorky vkládané hodnoty. Nemělo by nás překvapit, že
použijeme opět parametry.
Dotaz spustíme metodou executeUpdate(). Ta se používá v
případě, že měníme data v databázi. Metoda
vrací počet ovlivněných řádků, pro ověření, že
vložení proběhlo, si je vypišme do konzole:
Konzolová aplikace
Zadej nové slovíčko anglicky:
keyboard
Zadej nové slovíčko česky:
klávesnice
1
Metoda executeUpdate() vrátila hodnotu 1. Můžeme
spustit původní kód naší aplikace, který vypisoval všechna slovíčka
nebo k zobrazení dat použít IntelliJ. Vidíme, že klávesnice je nově mezi
slovíčky:

Mazání záznamů
Přejděme k dalšímu CRUD příkazu, kterým bude DELETE.
Použití DELETE v Java kódu bude v podstatě totožné jako u
příkazu INSERT:
Scanner scanner = new Scanner(System.in, "Windows-1250"); System.out.println("Zadej anglické slovíčko, které chceš vymazat:"); String anglicky = scanner.nextLine(); try (Connection spojeni = DriverManager.getConnection("jdbc:mysql://localhost/slovnicek_db?user=root&password="); PreparedStatement dotaz = spojeni.prepareStatement("DELETE FROM slovo WHERE anglicky=?")) { dotaz.setString(1, anglicky); int radku = dotaz.executeUpdate(); System.out.println(radku); } catch (SQLException ex) { System.out.println("Chyba při komunikaci s databází"); }
Vidíme, že se Java kód skoro vůbec nezměnil. SQL dotaz začíná
DELETE FROM a pokračuje názvem tabulky. Následuje podmínka
WHERE, kterou již dobře známe.
Nikdy na podmínku v příkazu DELETE nesmíme
zapomenout, jinak dojte k vymazání všech záznamů v
tabulce!
Aplikaci opět vyzkoušejme:
Konzolová aplikace
Zadej anglické slovíčko, které chceš vymazat:
keyboard
1
Opět si zkontrolujme, že klávesnice mezi slovíčky již opravdu není.
Můžeme zkusit zadat i neexistující slovíčko k vymazání, počet
ovlivněných řádků bude 0:
Konzolová aplikace
Zadej anglické slovíčko, které chceš vymazat:
binary tree
0
Editace záznamu
Naši čtveřici dotazů zakončeme příkazem UPDATE, který
vyvolá změnu. Naučme aplikaci měnit český překlad nějakého anglického
slova:
Scanner scanner = new Scanner(System.in, "Windows-1250"); System.out.println("Zadej anglické slovíčko, u kterého chceš upravit překlad:"); String anglicky = scanner.nextLine(); System.out.println("Zadej nový překlad:"); String cesky = scanner.nextLine(); try (Connection spojeni = DriverManager.getConnection("jdbc:mysql://localhost/slovnicek_db?user=root&password="); PreparedStatement dotaz = spojeni.prepareStatement("UPDATE slovo SET cesky=? WHERE anglicky=?")) { dotaz.setString(1, cesky); dotaz.setString(2, anglicky); int radku = dotaz.executeUpdate(); System.out.println(radku); } catch (SQLException ex) { System.out.println("Chyba při komunikaci s databází"); }
Java kód je opět nezměněný (pouze jsme znovu přidali parametr). SQL
dotaz začíná příkazem UPDATE, následuje název tabulky a
dále klíčové slovo SET. Po něm uvedeme název sloupce, který
chceme změnit, rovnítko a novou hodnotu. Pokud bychom potřebovali upravovat
více sloupců, zapíšeme to např. takto:
UPDATE slovo SET cesky=?, anglicky=? WHERE id=?
Stejně jako u příkazu DELETE nikdy nesmíme
zapomenout na klauzuli WHERE, jinak se přepíšou všechny řádky v
tabulce!
Aplikaci opět vyzkoušejme:
Konzolová aplikace
Zadej anglické slovíčko, u kterého chceš upravit překlad:
dog
Zadej nový překlad:
stopovat
1
Zkontrolujme si, že se překlad změnil.
Počet řádků
Často nás v našich aplikacích bude zajímat počet řádků v
tabulce. Slouží k tomu SQL funkce COUNT(). Ukažme si,
jak se používá:
try (Connection spojeni = DriverManager.getConnection("jdbc:mysql://localhost/slovnicek_db?user=root&password="); PreparedStatement dotaz = spojeni.prepareStatement("SELECT COUNT(*) FROM slovo")) { ResultSet vysledek = dotaz.executeQuery(); vysledek.next(); System.out.println(vysledek.getInt(1)); } catch (SQLException ex) { System.out.println("Chyba při komunikaci s databází"); }
K dotázání na počet řádků použijeme příkaz SELECT.
Funkce COUNT() nám vrátí tzv. agregovanou
hodnotu. Agregovaná znamená, že je získaná z více sloupců. Mezi
takové hodnoty patří např. počet, součet a průměr.
Hvězdička v závorce označuje, že nás zajímají všechny sloupce. Pokud
bychom místo ní uvedli název sloupce, počítaly by se jen
ty řádky, kde je tento sloupec vyplněný (není v něm
hodnota NULL).
Do dotazu bychom samozřejmě mohli dodat klauzuli
WHERE a spočítat jen ty řádky, které splňují nějakou
podmínku (např. anglické slovo začíná na A).
Výsledek dotazu se nám vrátí jako ResultSet. Metodou
next() se tedy přesuneme na první (a jediný) řádek a
vypíšeme první sloupec.
Výsledek:
Konzolová aplikace
7
Bez znalosti funkce COUNT() by nás možná napadlo napsat
takovýto kód:
// Tento kód je neefektivní try (Connection spojeni = DriverManager.getConnection("jdbc:mysql://localhost/slovnicek_db?user=root&password="); PreparedStatement dotaz = spojeni.prepareStatement("SELECT * FROM slovo")) { ResultSet vysledek = dotaz.executeQuery(); vysledek.last(); System.out.println(vysledek.getRow()); } catch (SQLException ex) { System.out.println("Chyba při komunikaci s databází"); }
Z databáze zde vybereme všechna slovíčka, která se přenesou do naší
aplikace. Metodou last() se v kolekci ResultSet
přesuneme na poslední řádek a poté vrátíme jeho číslo. Nutně dostaneme
stejný počet řádků v tabulce jako u předešlého výstupu.
Vrácený výsledek je sice stejný, takže by se mohlo zdát, že je vše v pořádku. Ale ono není. Přenos dat zabere nějaký čas a také je potřeba je mít v paměti. Nakonec jen řádky spočítáme a data ani nepoužijeme. Představme si, že je ve slovníčku milion slovíček. To opravdu není efektivní řešení.
Názvy sloupců a tabulek
Ještě jsme nezmínili použití zpětných apostrofů v dotazech. Pokud
název nějakého sloupce koliduje s klíčovým slovem z SQL (např. by se
sloupec jmenoval WHERE), obalíme ho zpětnými apostrofy, tedy
znaky `. Bývá dobrou praktikou takto označovat všechny názvy
tabulek a sloupců:
UPDATE `slovo` SET `cesky`=?, `anglicky`=? WHERE `id`=?
Dnešní projekt je se zdrojovými kódy jako vždy v příloze ke stažení.
V příští lekci, Programování databázového Wrapperu v Javě - Příprava, si databázi připravíme k testování našeho wrapperu.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
            
                Staženo 313x (2.64 kB)
                                    
                     Aplikace je včetně zdrojových kódů                                            v jazyce Java                                                                        
        
 
				

 David se informační technologie naučil na
				David se informační technologie naučil na