Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

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:

Výpis MySQL tabuľky v IntelliJ - Databázy v Jave - JDBC

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

 

Predchádzajúci článok
Kvíz - Základy práce s databázou v Java JDBC
Všetky články v sekcii
Databázy v Jave - JDBC
Preskočiť článok
(neodporúčame)
Programovanie databázového Wrappera v Jave - Príprava
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
2 hlasov
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 sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity