Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

8. diel - Programovanie databázového Wrappera v Jave - Dokončenie

V predchádzajúcom kvíze, Kvíz - Práca s databázou a wrapper v Java JDBC, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.

V tomto poslednom tutoriále kurzu Databázy v Jave si do triedy Database doplníme metódu select(), vďaka ktorej budeme načítavať dáta z databázy. Potom všetky doterajšie metódy otestujeme a nakoniec si ukážeme, ako by sme mohli náš wrapper rozšíriť.

Dokončenie triedy Database

V triede Database máme pripravené metódy na mazanie, vkladanie a úpravu záznamov. Teraz do triedy doplníme poslednú metódu na výber záznamov.

Metóda select()

Metóda select() bude pracovať inak ako metódy save(), delete() a update(). Nebude využívať metódu query(), pretože v tej voláme metódu executeUpdate(), ktorá vracia počet ovplyvnených riadkov. V metóde naopak budeme vracať kolekciu ResultSet, ktorú vytvoríme pomocou metódy executeQuery():

// ...
import java.sql.ResultSet;

public class Database {

    // ...

    /**
     * Returns data from a database table
     *
     * @param table   Db table
     * @param columns Columns to select
     * @param params  Query params
     * @return ResultSet that contains the query results from the database.
     * @throws SQLException
     */
    public ResultSet select(String table, Object[] columns, Object[] params) throws SQLException {
        return this.select(table, columns, "", params);
    }

    /**
     * Returns data from a database table
     *
     * @param table       Db table
     * @param columns     Columns to select
     * @param requirement Condition
     * @param params      Query params
     * @return ResultSet that contains the query results from the database.
     * @throws SQLException
     */
    public ResultSet select(String table, Object[] columns, String requirement, Object[] params) throws SQLException {
        query = new Query();
        query.select(columns).from(table).where(requirement);

        PreparedStatement ps = connection.prepareStatement(query.getQuery());
        if (params != null) {
            int index = 1;
            for (Object param : params) {
                ps.setObject(index, param);
                index++;
            }
        }

        ResultSet rs = ps.executeQuery();
        return rs;
    }
}

Metóda select() je posledná metóda, ktorú v našom wrapperi implementujeme. Nájdeme tu jedno preťaženie. Môžeme volať metódu select() s podmienkou alebo bez nej.

Testovanie wrappera

Triedu Database máme týmto hotovú a presunieme sa do triedy Wrapper s metódou main(). Všetky vykonané zmeny môžeme pozorovať vo svojom grafickom vývojovom databázovom prostredí.

Pripojenie k databáze

Najprv otestujeme pripojenie:

import DB.Database;
import java.sql.SQLException;


public class Wrapper {

    public static void main(String[] args) {
        try {
            Database database = new Database("persons", "root", "");
        } catch (SQLException ex) {
            System.out.println("Error - " + ex.getMessage());
        }
    }

}

Aplikáciu spustíme a otestujeme spojenie. Nemali by sa vám zobraziť žiadne chybové hlásenia:

Konzolová aplikácia
Process finished with exit code 0

Odteraz budeme pripisovať kód iba do metódy main() triedy Wrapper. Všetok ďalší kód budeme dopĺňať do bloku try, vo vetve catch zostane odchytenie výnimky SQLException a výpis správy do konzoly, ako máme uvedené v predošlej ukážke.

Vloženie záznamu

Teraz do našej databázy vložíme z Java kódu nový záznam:

try {
    Database database = new Database("persons", "root", "");

    Oject[] firstParams = {22, "Galí", 43, "PHP"};
    int success1 = database.insert("programmers", firstParams);
    System.out.println("Insert a user = " + success1);

} catch // ...

Po spustení aplikácie dostaneme tento výsledok:

Konzolová aplikácia
Insert a user = 1

Process finished with exit code 0

Postup metódy insert() a values() z triedy Query je nasledujúci:

  • V prvom kroku po skončení cyklu for, dostaneme tento SQL dotaz:
INSERT INTO programmers VALUES(?,?,?,?,
  • Vďaka metóde deleteCharAt(), ktorej posielame ako parameter index posledného výskytu čiarky v reťazci metódou lastIndexOf(), vymažeme poslednú čiarku.
  • Nakoniec metódou append() pridáme na koniec reťazca uzatváraciu zátvorku a bodkočiarku. Potom bude dotaz kompletný a bude vyzerať takto:
INSERT INTO programmers VALUES(?,?,?,?);

Dotaz sa následne spustí metódou query().

Vymazanie používateľa

Teraz otestujeme metódu delete(). Za existujúci kód prvej vetvy try-catch bloku doplníme tri riadky:

Object[] deleteParams = {"Galí"};
int success2 = database.delete("programmers", "name = ?", deleteParams);
System.out.println("Delete the user Gali = " + success2);

Kód pre vloženie nového používateľa zakomentujeme a po opätovnom spustení aplikácie dostaneme výstup:

Konzolová aplikácia
Delete the user Gali = 1

Process finished with exit code 0

Prepísanie používateľa

Funkčnosť metódy update() overíme spustením nasledujúceho kódu:

String[] columns = {"name", "age", "language"};
Object[] updateParams = {"Galileo", 18, "Java", 6};
int success3 = database.update("programmers", columns, "id = ?", updateParams);
System.out.println("Edit a user = " + success3);

Výstup:

Konzolová aplikácia
Edit a user = 1

Process finished with exit code 0

Metóda pred cyklom for vygereruje nasledujúci SQL dotaz:

UPDATE persons SET

Po cykle for bude dotaz vyzerať takto:

UPDATE persons SET name = ? ,age = ? ,

A po odstránení poslednej čiarky a po pridaní podmienky bude dotaz v konečnej podobe:

UPDATE persons SET user = ? ,age = ? where id = ?

Výpis položiek

Nakoniec otestujeme metódu select():

String[] searchedColumns = {"name", "language"};
Object[] searchedParams = {"Java"};
ResultSet rs = database.select("programmers", searchedColumns, "language = ?", searchedParams);
}

Už vieme, že táto metóda pracuje trochu inak ako ostatné metódy. Jej návratovou hodnotou je kolekcia ResultSet. Na vypísanie používateľov teda použijeme cyklus:

while(rs.next()){
     System.out.println(rs.getString("name")+" - " + rs.getString("language"));
}

Výstup:

Konzolová aplikácia
James - Java
Danna - Java
Galileo - Java
Amy - Java

Process finished with exit code 0

Vylepšenie wrappera

Takto vyzerajúca knižnica by nám v aplikáciách na mnoho vecí stačila. Poďme si ale ukázať ako našu triedu ešte vylepšiť.

Doplnenie metódy count() v triede Database

Do triedy Database si doplníme ďalšiu často používanú metódu, metódu count() na zistenie počtu riadkov vybranej tabuľky:

public class Database {

    // ...

    /**
     * @param table DB table
     * @return Number of table rows
     * @throws SQLException
     */
    public int count(String table) throws SQLException {
        PreparedStatement ps = connection.prepareStatement("SELECT COUNT(*) FROM " + table);
        ResultSet result = ps.executeQuery();
        result.next();
        return result.getInt(1);
    }
}

Tabuľku musíme do dotazu dosadiť zápisom "SELECT COUNT(*) FROM" + table. Meno tabuľky totiž nemôžeme dať ako parameter metóde setString().

Metódu count() otestujeme pridaním riadku:

System.out.println(database.count("programmers"));

Na koniec vetvy try v triede Wrapper a aplikáciu znovu spustíme:

Konzolová aplikácia
14

Process finished with exit code 0

Tak a to je k nášmu wrapperu všetko. Hotovú knižnicu si môžete stiahnuť dole pod článkom aj so zdrojovými kódmi.

V nasledujúcom cvičení, Riešené úlohy k 1.-8. lekcii práce s databázami v Jave, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

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é 5x (5.58 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Kvíz - Práca s databázou a wrapper v Java JDBC
Všetky články v sekcii
Databázy v Jave - JDBC
Preskočiť článok
(neodporúčame)
Riešené úlohy k 1.-8. lekcii práce s databázami v Jave
Článok pre vás napísal Milan Gallas
Avatar
Užívateľské hodnotenie:
2 hlasov
Autor se věnuje programování, hardwaru a počítačovým sítím.
Aktivity