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 308x (2.64 kB)
Aplikace je včetně zdrojových kódů v jazyce Java