Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

Lekce 8 - Programování databázového Wrapperu v Javě - Dokončení

V tomto posledním díle si doděláme metodu select, díky které si budeme načítat data z databáze. Poté všechny dosavadní metody otestujeme a nakonec si ukážeme, jak bychom mohli náš wrapper rozšířit.

Dokončení Wrapperu - metoda select

Tato metoda bude pracovat jinak než metody save, delete a update. Nebude využívat metodu query, protože v té voláme metodu executeUpdate, která vrací počet ovlivněných řádků. V metodě naopak budeme vracet ResultSet, který vytvoříme za pomoci metody 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;
    }
}

Metoda select je poslední metoda, kterou v našem wrapperu implementujeme. Najdeme zde jedno přetížení. Můžeme volat metodu select s podmínkou a nebo bez ní.

Testování wrapperu

Tak třídu Database máme hotovou a teď se přesuneme do třídy Wrapper, kterou nám vygeneroval NetBeans. Všechny provedené změny můžete pozorovat ve svém grafickém vývojovém databázovém prostředí. Nejprve otestujeme připojení:

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še by mělo být v pořádku. Neměla by se vám zobrazit žádná chybová hláška. Odteď budeme připisovat kód pouze do metody main. Budu tedy psát pouze obsah metody main. Zbytek třídy nebudu v dalších částech vypisovat.

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());
}

Měli byste dostat výsledek:

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

Postup (Metody insert a values v třídě Query)

V prvním kroku po skončení cyklu for, dostaneme následující podobu SQL dotazu:

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

Díky metodě deleteCharAt, které posíláme jako parametr index posledního výskytu čárky v poli Stringů, který získáme za pomoci metody sb.lastIndexOf, vymažeme poslední čárku. A nakonec přidáme konec závorky a středník. Poté bude dotaz kompletní a bude vypadat následovně:

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

Dotaz se následně spustí metodou query.

Vymazání uživatele

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)

Přepsání uživatele

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:

Metoda před cyklem for vygereruje následující sql dotaz:

UPDATE osoby SET

Po cyklu for bude vypadat dotaz takto:

UPDATE osoby SET jmeno = ? ,vek = ? ,

A po odstranění poslední čárky a po přidání podmínky bude dotaz v konečné podobě:

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

Výpis

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

Tato metoda pracuje trochu jinak, než ostatní metody. Její návratová hodnota je ResultSet a k vypsání uživatelů použijeme cyklus. Takto by vypadalo vypsání:

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šení wrapperu

Takhle vypadající knihovna by nám v aplikacích na mnoho věcí stačila. Pojďme si ale ukázat jak naší třídu ještě vylepšit

Metoda count - počet řádků v databázové tabulce:

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);
    }

}

Tabulku tam musíme dosadit natvrdo "SELECT COUNT(*) FROM "+table. Jméno tabulky totiž nemůžeme dát jako parametr metodě setString.

Test celé třídy 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ší aplikaci vše. Wrapper můžete otestovat na vašich aplikacích a poté mi určitě napište zpětnou vazbu. Například co by jste do wrapperu doplnili nebo co by jste udělali jinak. Hotovou knihovnu si můžete stáhnout dole pod článkem i se zdrojovými kódy.

V následujícím cvičení, Řešené úlohy k 1.-8. lekci práce s databázemi v Javě, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 382x (23.52 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Kvíz - Práce s databází a wrapper v Java JDBC
Všechny články v sekci
Databáze v Javě - JDBC
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 1.-8. lekci práce s databázemi v Javě
Článek pro vás napsal Milan Gallas
Avatar
Uživatelské hodnocení:
37 hlasů
Autor se věnuje programování, hardwaru a počítačovým sítím.
Aktivity