IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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

Dnes budeme s JDBC pokračovat.

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), Delete (odstranit). Minule jsme si ukázali operaci Read. Již víme, že data z databáze čteme příkazem SELECT a z Java kolekce ResultSet.

INSERT

Vyzvěme uživatele k zadání slovíčka anglicky a česky. Nové slovíčko vložíme do databáze.

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 opět do závorky hodnoty. Nemělo by vás překvapit, že použijeme opět parametry.

Dotaz spustíme metodou executeUpdate(). Ta se používá v případě, kdy 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.

Vložení řádku do MySQL databáze v Javě pomocí JDBC - Databáze v Javě - JDBC

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 NetBeans. Vidíme, že klávesnice je nově mezi slovíčky:

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

DELETE

Přejděme k mazání záznamů. Oproti vkládání není v podstatě žádný rozdíl, jen jsem chtěl, abychom si pro úplnost ukázali všechny dotazy z CRUD.

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í");
}

Java kód se 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 nezapomeňte, jinak dojte k vymazání všech záznamů v tabulce! Aplikaci opět vyzkoušejme:

Vymazání záznamu v MySQL databáze v Javě pomocí JDBC - Databáze v Javě - JDBC

Zkontrolujte si, že klávesnice mezi slovíčky již opravdu není. Můžeme zkusit i zadat neexistující slovíčko k vymazání, počet ovlivněných řádků bude 0.

Vymazání záznamu v MySQL databáze v Javě pomocí JDBC - Databáze v Javě - JDBC

UPDATE

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 přidali parametr). SQL dotaz začíná UPDATE, následuje název tabulky a dále klauzule SET. Po ní název sloupce, rovnítko a nová hodnota. Pokud bychom potřebovali updatovat více sloupců, zapíšeme to např. takto:

UPDATE slovo SET cesky=?, anglicky=? WHERE id=?

Stejně jako u DELETE nikdy nesmíme zapomenout na kaluzuli WHERE, jinak se updatují všechny řádky v tabulce.

Aplikaci opět vyzkoušejme:

Update MySQL databáze v Javě JDBC - Databáze v Javě - JDBC

Zkontrolujte 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 klauzule 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. Klauzule COUNT nám vrátí tzv. agregovanou hodnotu. Agregovaná znamená, že je získaná z více sloupců. Takové hodnoty jsou 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). Samozřejmě bychom 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 jednoduše uložíme do ResultSetu, metodou next() se přesuneme na první řádek a vypíšeme první sloupec.

Výsledek:

Získání počtu záznamů v MySQL databází v Javě JDBC - Databáze v Javě - JDBC

Bez znalosti klauzule COUNT by vá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 vybereme všechna slovíčka, která se přenesou do naší aplikace. Metodou last() se v ResultSetu přesuneme na poslední řádek a poté vrátíme jeho číslo. Nutně dostaneme počet řádků v tabulce.

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ředstavte si, že je ve slovníčku milion slovíček. To opravdu není efektivní řešení.

Ještě jsme nezmínili použití zpětných uvozovek v dotazech. Pokud název nějakého sloupce koliduje s klíčovým slovem z SQL (např. se sloupec jmenuje where), dáme ho do zpětných uvozovek. Píší se tou klávesou pod escape. Často se setáte s konvencí, kde se takto označují všechny názvy:

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 287x (17.35 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í:
57 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