4. diel - Databázy v Java JDBC - INSERT, UPDATE, DELETE a COUNT
V predchádzajúcom kvíze, Kvíz - Základy práce s databázou v Java JDBC, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.
V dnešnom tutoriáli budeme pokračovať v práci s databázou MySQL z Java kódu a ukážeme si, ako editovať záznamy v našej tabuľke.
Vkladanie, mazanie a editácia hodnôt
Základné databázové operácie sa často označujú skratkou CRUD. Ide o operácie Create (vytvoriť), Read (čítať), Update (aktualizovať) a Delete (odstrániť).
Minule sme si ukázali čítanie dát. Už vieme, že dáta
z databázy čítame príkazom SELECT
a výsledky sa ukladajú do
kolekcie ResultSet
.
Vloženie nového záznamu
Vyzvime užívateľa na zadanie slovíčka španielsky a anglicky. Nové
slovíčko vložíme do databázy pomocou príkazu INSERT
:
Scanner scanner = new Scanner(System.in); System.out.println("Enter a new Spanish word:"); String spanish = scanner.nextLine(); System.out.println("Enter the word in English:"); String english = scanner.nextLine(); try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/dictionary_db?user=root&password="); PreparedStatement statement = connection.prepareStatement("INSERT INTO word (spanish, english) VALUES (?, ?)");) { statement.setString(1, spanish); statement.setString(2, english); int rows = statement.executeUpdate(); System.out.println(rows); } catch (SQLException ex) { System.out.println("Error while communicating with the database"); }
SQL dotaz pre vloženie nového riadka do tabuľky začína príkazom
INSERT INTO
, nasleduje názov tabuľky. V zátvorkách vypíšeme
názvy stĺpcov, do ktorých vkladáme hodnoty. Za klauzulu VALUES
vypíšeme do zátvorky vkladané hodnoty. Nemalo by nás prekvapiť, že
použijeme opäť parametre.
Dotaz spustíme metódou executeUpdate()
. Tá sa používa v
prípade, že meníme dáta v databáze. Metóda vracia
počet ovplyvnených riadkov, pre overenie, že vloženie prebehlo, si
ich vypíšme do konzoly:
Konzolová aplikácia
Enter a new Spanish word:
teclado
Enter the word in English:
keyboard
1
Metóda executeUpdate()
vrátila hodnotu 1
.
Môžeme spustiť pôvodný kód našej aplikácie, ktorý vypisoval všetky
slovíčka alebo na zobrazenie dát použiť IntelliJ. Vidíme, že klávesnica
je novo medzi slovíčkami:
Mazanie záznamov
Prejdime k ďalšiemu CRUD príkazu, ktorým bude DELETE
.
Použitie DELETE
v Java kóde bude v podstate totožné ako pri
príkaze INSERT
:
Scanner scanner = new Scanner(System.in); System.out.println("Enter the Spanish word you want to delete:"); String spanish = scanner.nextLine(); try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/dictionary_db?user=root&password="); PreparedStatement statement = connection.prepareStatement("DELETE FROM word WHERE spanish=?");) { statement.setString(1, spanish); int rows = statement.executeUpdate(); System.out.println(rows); } catch (SQLException ex) { System.out.println("Error while communicating with the database"); }
Vidíme, že Java kód sa skoro vôbec nezmenil. SQL dotaz začína
DELETE FROM
a pokračuje názvom tabuľky. Nasleduje podmienka
WHERE
, ktorú už dobre poznáme.
Nikdy na podmienku v príkaze DELETE
nesmieme
zabudnúť, inak dajte k vymazaniu všetkých záznamov v
tabuľke!
Aplikáciu opäť vyskúšajme:
Konzolová aplikácia
Enter the Spanish word you want to delete:
teclado
1
Opäť si skontrolujme, že klávesnica medzi slovíčkami už naozaj nie je.
Môžeme skúsiť zadať aj neexistujúce slovíčko na vymazanie, počet
ovplyvnených riadkov bude 0
:
Konzolová aplikácia
Enter the Spanish word you want to delete:
zorro
0
Editácia záznamu
Našu štvoricu dotazov zakončíme príkazom UPDATE
, ktorý
vyvolá zmenu. Naučme aplikáciu meniť anglický preklad nejakého
španielskeho slova:
Scanner scanner = new Scanner(System.in); System.out.println("Enter the Spanish word to change the meaning of:"); String spanish = scanner.nextLine(); System.out.println("Enter the new meaning:"); String english = scanner.nextLine(); try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/dictionary_db?user=root&password="); PreparedStatement statement = connection.prepareStatement("UPDATE word SET english=? WHERE spanish=?");) { statement.setString(1, english); statement.setString(2, spanish); int rows = statement.executeUpdate(); System.out.println(rows); } catch (SQLException ex) { System.out.println("Error while communicating with the database"); }
Java kód je opäť nezmenený (iba sme znova pridali parameter). SQL dotaz
začína príkazom UPDATE
, nasleduje názov tabuľky a ďalej
kľúčové slovo SET
. Po ňom uvedieme názov stĺpca, ktorý
chceme zmeniť, znamienko rovnosti a novú hodnotu. Pokiaľ by sme potrebovali
upravovať viac stĺpcov, zapíšeme to napr. takto:
UPDATE word SET english=?, spanish=? WHERE id=?
Rovnako ako pri príkaze DELETE
nikdy nesmieme
zabudnúť na klauzulu WHERE
, inak sa prepíšu všetky
riadky v tabuľke!
Aplikáciu opäť vyskúšajme:
Konzolová aplikácia
Enter the Spanish word to change the meaning of:
dog
Enter the new meaning:
espiar
1
Skontrolujme si, že sa preklad zmenil.
Počet riadkov
Často nás v našich aplikáciách bude zaujímať počet riadkov v
tabuľke. Slúži na to SQL funkcie COUNT
. Ukážme si,
ako sa používa:
try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/dictionary_db?user=root&password="); PreparedStatement statement = connection.prepareStatement("SELECT COUNT(*) FROM word");) { ResultSet result = statement.executeQuery(); result.next(); System.out.println(result.getInt(1)); } catch (SQLException ex) { System.out.println("Error while communicating with the database"); }
Na opýtanie sa na počet riadkov použijeme príkaz SELECT
.
Funkcia COUNT()
nám vráti tzv. agregovanú
hodnotu. Agregovaná znamená, že je získaná z viacerých stĺpcov.
Medzi také hodnoty patrí napr. počet, súčet a priemer.
Hviezdička v zátvorke označuje, že nás zaujímajú všetky stĺpce.
Pokiaľ by sme namiesto nej uviedli názov stĺpca, počítali
by sa len tie riadky, kde je tento stĺpec vyplnený (nie je v
ňom hodnota NULL
).
Do dotazu by sme samozrejme mohli dodať klauzulu
WHERE
a spočítať len tie riadky, ktoré spĺňajú nejakú
podmienku (napr. anglické slovo začína na A
).
Výsledok dotazu sa nám vráti ako ResultSet
. Metódou
next()
sa teda presunieme na prvý (a jediný) riadok a vypíšeme
prvý stĺpec.
Výsledok:
Konzolová aplikácia
6
Bez znalosti klauzuly COUNT
by vás možno napadlo napísať
takýto kód:
// This code is ineffective try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/dictionary_db?user=root&password="); PreparedStatement statement = connection.prepareStatement("SELECT * FROM word");) { ResultSet result = statement.executeQuery(); result.last(); System.out.println(result.getRow()); } catch (SQLException ex) { System.out.println("Error while communicating with the database"); }
Z databázy tu vyberieme všetky slovíčka, ktoré sa prenesú do našej
aplikácie. Metódou last()
sa v kolekcii ResultSet
presunieme na posledný riadok a potom vrátime jeho číslo. Nutne dostaneme
rovnaký počet riadkov v tabuľke ako pri predchádzajúcom výstupe.
Vrátený výsledok je síce rovnaký, takže by sa mohlo zdať, že všetko je v poriadku. Ale ono nie je. Prenos dát zaberie nejaký čas a tiež ich treba mať v pamäti. Nakoniec len riadky spočítame a dáta ani nepoužijeme. Predstavme si, že je v slovníčku milión slovíčok. To naozaj nie je efektívne riešenie.
Názvy stĺpcov a tabuliek
Ešte sme nespomenuli použitie spätných apostrofov v otázkach. Pokiaľ
názov nejakého stĺpca koliduje s kľúčovým slovom z SQL (napr. by sa
stĺpec volal WHERE
), obalíme ho spätnými apostrofmi, teda
znakmi `
. Býva dobrou praktikou takto označovať všetky názvy
tabuliek a stĺpcov:
UPDATE `word` SET `english`=?, `spanish`=? WHERE `id`=?
Dnešný projekt je so zdrojovými kódmi ako vždy v prílohe na stiahnutie.
V budúcej lekcii, Programovanie databázového Wrappera v Jave - Príprava, si databázu pripravíme na testovanie nášho wrappera.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 8x (2.31 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java