NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

Výpis MySQL tabulky v IntelliJ - Databáze v Javě - JDBC

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

 

Předchozí článek
Kvíz - Základy práce s databází v Java JDBC
Všechny články v sekci
Databáze v Javě - JDBC
Přeskočit článek
(nedoporučujeme)
Programování databázového Wrapperu v Javě - Příprava
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
73 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity