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í.

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 diele si dorobíme metódu select, vďaka ktorej si budeme načítať 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 Wrappera - metóda select

Táto metóda 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ť ResultSet, ktorý vytvoríme za pomoci metódy executeQuery.

public class Database {
    //atribut třídy
    //metody tříd
    /**
     * Vrací údaje z databázové tabulky
     * @param table
     * @param columns
     * @param params
     * @return
     * @throws SQLException
     */
    public ResultSet select(String table, Object[] columns, Object[] params) throws SQLException{
        return this.select(table, columns, "", params);
    }

    /**
     * Vrací údaje z databázové tabulky
     * @param table
     * @param columns
     * @param requirement
     * @param params
     * @return
     * @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

Tak triedu Database máme hotovú a teraz sa presunieme do triedy Wrapper, ktorú nám vygeneroval NetBeans. Všetky vykonané zmeny môžete pozorovať vo svojom grafickom vývojovom databázovom prostredí. Najprv otestujeme pripojenie:

package wrapper;


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


public class Wrapper {


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            Database database = new Database("osoby", "root", "");
        } catch (SQLException ex) {
            System.out.println("error - "+ex.getMessage());
        }
    }

}

Kód otestujte. Všetko by malo byť v poriadku. Nemala by sa vám zobraziť žiadna chybová hláška. Odteraz budeme pripisovať kód iba do metódy main. Budem teda písať iba obsah metódy main. Zvyšok triedy nebudem v ďalších častiach vypisovať.

Zápis

try {
    Database database = new Database("osoby", "root", "");
            Object[] firstParams = {22, "Galí", 43, "PHP"};
            int uspech1 = database.insert("programatori", firstParams);
            System.out.println("Uložení uživatele = "+uspech1);
} catch (SQLException ex) {
         System.out.println("error - "+ex.getMessage());
}

Mali by ste dostať výsledok:

Uložení uživatele = 1
BUILD SUCCESSFUL (total time: 1 second)*

Postup (Metódy insert a values v triede Query)

V prvom kroku po skončení cyklu for, dostaneme nasledujúcu podobu SQL dotazu:

INSERT INTO programatori VALUES(?,?,?,?,

Vďaka metóde deleteCharAt, ktoré posielame ako parameter index posledného výskytu čiarky v poli Stringov, ktorý získame za pomoci metódy sb.lastIndexOf, vymažeme poslednú čiarku. A nakoniec pridáme koniec zátvorky a bodkočiarku. Potom bude otázka kompletná a bude vyzerať nasledovne:

INSERT INTO programatori VALUES(?,?,?,?);

Otázka sa následne spustí metódou query.

Vymazanie užívateľa

Database database = new Database("osoby", "root", "");

Object[] params2 = {"Galí"};
        int uspech2 = database.delete("programatori", "jmeno = ?", params2);
        System.out.println("Smazání uživatele Gali = "+uspech2);

Výstup:

Smazání uživatele Gali = 1
BUILD SUCCESSFUL (total time: 1 second)

Prepísanie používateľa

Database database = new Database("osoby", "root", "");

String[] columns = {"jmeno","vek","jazyk"};
            Object[] params = {"Galileo", 18, "Java", 6};
            int uspech4 = database.update("programatori", columns, "id = ?", params);
            System.out.println("Přepsání uživate = "+uspech4);

Výstup:

Přepsání uživate = 1
BUILD SUCCESSFUL (total time: 1 second)

Postup:

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

UPDATE osoby SET

Po cykle for bude vyzerať dotaz takto:

UPDATE osoby SET jmeno = ? ,vek = ? ,

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

UPDATE osoby SET jmeno = ? ,vek = ? where id = ?

Výpis

String[] columns3 = {"jmeno","jazyk"};
            Object[] params3 = {"Java"};
            ResultSet rs = database.select("programatori", columns3, "jazyk = ?", params3);
}

Táto metóda pracuje trochu inak, než ostatné metódy. Jej návratová hodnota je ResultSet a na vypísanie užívateľov použijeme cyklus. Takto by vyzeralo vypísanie:

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

Výstup:

James - java
Danna - java
Galileo - Java
Amy - java
BUILD SUCCESSFUL (total time: 1 second)

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ť

Metóda count - počet riadkov v databázovej tabuľke:

public class Database {
    //atribut třídy
    //metody tříd

    /**
     *
     * @param table
     * @return
     * @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 tam musíme dosadiť natvrdo "SELECT COUNT(*) FROM "+table. Meno tabuľky totiž nemôžeme dať ako parameter metóde setString.

Test celej triedy Database

public static void main(String[] args) {
    try {
            Database database = new Database("osoby", "root", "");
            Object[] firstParams = {22, "Galí", 43, "PHP"};
            int uspech1 = database.insert("programatori", firstParams);
            System.out.println("Uložení uživatele = "+uspech1);

            Object[] params2 = {"Galí"};
            int uspech2 = database.delete("programatori", "jmeno = ?", params2);
            System.out.println("Smazání uživatele Gali = "+uspech2);

            String[] columns = {"jmeno","vek","jazyk"};
            Object[] params = {"Galileo", 18, "Java", 6};
            int uspech4 = database.update("programatori", columns, "id = ?", params);
            System.out.println("Přepsání uživate = "+uspech4);

            String[] columns3 = {"jmeno","jazyk"};
            Object[] params3 = {"Java"};
            ResultSet rs = database.select("programatori", columns3, "jazyk = ?", params3);

            while(rs.next()){
                System.out.println(rs.getString("jmeno")+" - "+rs.getString("jazyk"));
            }
        System.out.println(database.count("programatori"));
    } catch (SQLException ex) {
        System.out.println("error - "+ex.getMessage());
    }
}

Tak a to je k našej aplikácii všetko. Wrapper môžete otestovať na vašich aplikáciách a potom mi určite napíšte spätnú väzbu. Napríklad čo by ste do wrappera doplnili alebo čo by ste urobili inak. 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. lekciu 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é 383x (23.52 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. lekciu práce s databázami v Jave
Článok pre vás napísal Milan Gallas
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor se věnuje programování, hardwaru a počítačovým sítím.
Aktivity