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ále 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 používateľa na zadanie slovíčka po španielsky a po 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 už 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 dôjde 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. Ak 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 funkcia 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. Ak
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 dotazoch. Ak 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é 10x (2.31 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

David sa informačné technológie naučil na