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 6 - Databázový wrapper v Javě - Tvorba třídy Query

V minulém dílu, Programování databázového Wrapperu v Javě - Příprava, jsme započali tvorbu databázového wrapperu, který nám zjednoduší práci s databází.

Dnešní díl bude hlavně o programování. Ještě než začneme programovat samotnou třídu Database, tak si připravíme třídu Query, která bude znázorňovat samotný SQL dotaz.

Třída Query

V balíčku DB si vytvoříme novou třídu Query. V ní budeme pomocí metod postupně sestavovat SQL dotaz. Po tomto kroku bude náš projekt vypadat asi takto:

Diagram JDBC wrapperu v Javě - Databáze v Javě - JDBC

Ve třídě si vytvoříme metodu delete a metodu where, kterou budeme používat velmi často.

public class Query {
    private StringBuilder query;

    /**
     *
     * @param table
     * @return
     */
    public Query delete(String table){
        query = new StringBuilder();
        query.append("DELETE FROM ");
        query.append(table);
        return this;
    }

    /**
     * Přidá podmínku do sql dotazu
     * @param requirement
     * @return
     */
    public Query where(String requirement){
    query.append(" WHERE ");
        query.append(requirement);
        return this;
    }

   /**
     *
     * @param table
     * @return
     */
    public Query from(String table){
        query.append(" FROM ");
        query.append(table);
        return this;
    }
}

Díky třídě StringBuilder můžeme snadněji poskládat naše SQL dotazy a uložit je do instanční proměnné query. Metoda append jednoduše přidá část textu, znak, nebo proměnou do pole. Proměnná může být jakéhokoli datového typu (Object, String, char, boolean, double, int, float, atd.).

Instanci třídy StringBuilder můžeme přeměnit na textový řetězec za pomoci metody toString.

Důležitá pro nás je metoda where, protože tu využijeme nejčastěji.

Metody update a set

Podobně přidáme i metody update a set:

public class Query {
    //proměnné třídy
    //metody třídy
    /**
     *
     * @param table
     * @return
     */
    public Query update(String table){
        query = new StringBuilder();
        query.append("UPDATE ");
        query.append(table);
        query.append(" SET ");
        return this;
    }

    /**
     * Doplní sloupce
     * @param Columns
     */
    public Query set(String[] columns){
        int count = columns.length;
        if(count == 0)
            throw new IllegalArgumentException("Neplatný počet parametrů");

        for(String column : columns){
           query.append(column);
           query.append(" = ");
           query.append("?");
           query.append(",");
        }
        query.deleteCharAt(query.lastIndexOf(","));
        return this;
    }
}

Tak a teď si řekneme proč máme na konci každé metody return this; Je to jednoduché. Každá metoda ve třídě Query je datového typu Query. To znamená, že vrací instancí dané třídy. Má to tu výhodu, že můžeme zefektivnít kód. A místo takového kódu:

query.update(table);
query.set(columns);
query.where(requirement);

Můžeme efektivně napsat toto:

query.update(table).set(columns).where(requirement);

Takovému zápisu se říká plynulé rozhraní (Fluent Interface). Pomáhá nám to vytvářet aplikační rozhraní, které je velmi čitelné a pochopitelné. Plynulé rozhraní vytvořil Martin Fowler a je to technika objektové orientovaného programování, kde jak jsme si již výše ukázali, řetězíme po sobě jdoucí volání metod téhož objektu.

Dále stojí za povšimnutí, že v metodě set testujeme, zda-li neposíláme prázdný parametr. V případě, že pošleme neplatný parametr, tak se vyvolá výjimka IllegalArgumen­tException. Nakonec jen zmíním, že metoda deleteCharAt nám odebere poslední nežádoucí čárku, ale vnitřní logiku metod si i s příklady probereme v jiné části tohoto tutoriálu.

Metody insert a values

Přidejme metody insert a values:

public class Query {
    //proměnné třídy
    //metody třídy
    /**
     *
     * @param table
     * @return
     */
    public Query insert(String table){
        query = new StringBuilder();
        query.append("INSERT INTO ");
        query.append(table);
        return this;
    }

    /**
     *
     * @param params
     * @return
     */
    public Query values(Object[] params){
        query.append(" VALUES(");

        int count = params.length;

        if(count == 0)
            throw new IllegalArgumentException("Neplatný počet parametrů");

        for (int i = 0; i<count; i++) {
            query.append("?,");
        }
        //odstaníme poslední čárku
        query.deleteCharAt(query.lastIndexOf(","));
        query.append(");");
        return this;
    }
}

V metodě insert není nic nového. Metoda values bere jako parametr pole objektů a za každý prvek dosadí do SQL dotazu "?". Nakonec se odstraní poslední čárka a vrátí instance třídy Query. Pokud bude počet parametrů roven nule, vyvolá se výjimka IllegalArgumen­tException.

Metoda select a pomocné metody

public class Query {
    //proměnné třídy
    //metody třídy
    /**
     *
     * @param columns
     * @return
     */
    public Query select(Object[] columns){
        query = new StringBuilder();
        query.append("SELECT ");
        if(columns != null){
            for(Object column : columns){
                query.append(column);
                query.append(",");
            }
            //odstaníme poslední otazník
            query.deleteCharAt(query.lastIndexOf(","));
        }
        else
            query.append("*");

        return this;
    }
}

Metoda select bere jako parametr pole objektů, které reprezentují jednotlivé sloupce. Pokud dáme metodě select jako parametr hodnotu null, dosadí do SQL dotazu znak *, který vrací všechny sloupce z databázové tabulky.

Metoda getQuery

public class Query {
    //proměnné třídy
    //metody třídy
     /**
     * Vrátí sestavený sql dotaz
     * @return query
     */
    public String getQuery(){
        return query.toString();
    }
}

Nakonec budeme potřebovat výsledný SQL dotaz nějak získat. K tomuto účelu nám poslouží metoda getQuery, která nám vrací dotaz jako textový řetězec za pomocí metody toString.

V dalším díle, Programování databázového Wrapperu v Javě - Třída Database, si třídu Query otestujeme a vytvoříme si třídu Database.


 

Předchozí článek
Programování databázového Wrapperu v Javě - Příprava
Všechny články v sekci
Databáze v Javě - JDBC
Přeskočit článek
(nedoporučujeme)
Programování databázového Wrapperu v Javě - Třída Database
Článek pro vás napsal Milan Gallas
Avatar
Uživatelské hodnocení:
47 hlasů
Autor se věnuje programování, hardwaru a počítačovým sítím.
Aktivity