NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

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

V předchozím kvízu, Kvíz - Práce s databází a wrapper v Java JDBC, jsme si ověřili nabyté zkušenosti z předchozích lekcí.

V tomto posledním tutoriálu kurzu Databáze v Javě si do třídy Database doplníme metodu select(), díky které 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í třídy Database

Ve třídě Database máme připravené metody pro mazání, vkládání a úpravu záznamů. Nyní do třídy doplníme poslední metodu pro výběr záznamů.

Metoda select()

Metoda select() 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 kolekci ResultSet, kterou vytvoříme pomocí metody 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 be 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;
    }
}

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

Třídu Database máme tímto hotovou a přesuneme se do třídy Wrapper s metodou main(). Všechny provedené změny můžeme pozorovat ve svém grafickém vývojovém databázovém prostředí.

Připojení k databázi

Nejprve otestujeme připojení:

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


public class Wrapper {

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

}

Aplikaci spustíme a otestujeme spojení. Neměla by se vám zobrazit žádná chybová hláška:

Konzolová aplikace
Process finished with exit code 0

Odteď budeme připisovat kód pouze do metody main() třídy Wrapper. Veškerý další kód budeme doplňovat do bloku try, ve větvi catch zůstane odchycení výjimky SQLException a výpis zprávy do konzole, jak máme uvedeno v předešlé ukázce.

Vložení záznamu

Nyní do naší databáze vložíme z Java kódu nový záznam:

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

    Object[] insertParams = {22, "Galí", 43, "PHP"};
    int uspech1 = database.insert("programatori", insertParams);
    System.out.println("Uložení uživatele = " + uspech1);

} catch // ...

Po spuštění aplikace dostaneme tento výsledek:

Konzolová aplikace
Uložení uživatele = 1

Process finished with exit code 0

Postup metody insert() a values() ze třídy Query je následující:

  • V prvním kroku po skončení cyklu for, dostaneme tento SQL dotaz:
INSERT INTO programatori VALUES(?,?,?,?,
  • Díky metodě deleteCharAt(), které posíláme jako parametr index posledního výskytu čárky v řetězci metodou lastIndexOf(), vymažeme poslední čárku.
  • Nakonec metodou append() přidáme na konec řetězce uzavírací závorku a středník. Poté bude dotaz kompletní a bude vypadat takto:
INSERT INTO programatori VALUES(?,?,?,?);

Dotaz se následně spustí metodou query().

Vymazání uživatele

Nyní otestujeme metodu delete(). Za stávající kód první větve try-catch bloku doplníme tři řádky:

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

Kód pro vložení nového uživatele zakomentujeme a po opětovném spuštění aplikace dostaneme výstup:

Konzolová aplikace
Smazání uživatele Gali = 1

Process finished with exit code 0

Přepsání uživatele

Funkčnost metody update() ověříme spuštěním následujícího kódu:

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

Výstup :

Konzolová aplikace
Přepsání uživate = 1

Process finished with exit code 0

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 položek

Nakonec otestujeme metodu select():

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

Již víme, že tato metoda pracuje trochu jinak, než ostatní metody. Její návratovou hodnotou je kolekce ResultSet. K vypsání uživatelů tedy použijeme cyklus:

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

Výstup:

Konzolová aplikace
James - Java
Danna - Java
Galileo - Java
Amy - Java

Process finished with exit code 0

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.

Doplnění metody count() ve třídě Database

Do třídy Database si doplníme další často používanou metodu, metodu count() pro zjištění počtu řádku vybrané tabulky:

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

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

Metodu count() otestujeme přidáním řádku:

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

Na konec větve try ve třídě Wrapper a aplikaci znovu spustíme:

Konzolová aplikace
14

Process finished with exit code 0

Tak a to je k našemu wrapperu vše. 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 398x (5.35 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í:
44 hlasů
Autor se věnuje programování, hardwaru a počítačovým sítím.
Aktivity