IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

7. diel - Programovanie databázového Wrappera v Jave - Trieda Database

V minulom dieli, Databázový wrapper v Jave - Tvorba triedy Query, sme začali náš wrapper programovať a vytvorili si triedu Query.

V dnešnom tutoriále budeme pracovať na triede Database, ktorá je síce okomentovaná, ale aj tak vám k určitým častiam poviem pár slov. Ešte predtým si ale otestujeme triedu Query.

Testovanie triedy Query

V triede Wrapper si do metódy main() vložíme nasledujúci kód, ktorým otestujeme jednotlivé dotazy na triede Query:

Query query = new Query();

query.delete("programmers").where("name = ?");
System.out.println(query.getQuery());
// Output: DELETE FROM programmers WHERE name = ?

String[] updateColumns = {"name","language"};
query.update("programmers").set(updateColumns).where("where id = ?");
System.out.println(query.getQuery());
// Output: UPDATE programmers SET name = ?,language = ? WHERE id = ?

query.select(null).from("programmers").where("language = ?");
System.out.println(query.getQuery());
// Output: SELECT * FROM programmers WHERE language = ?

Object[] insertParams = {null, "Galí", 43, "PHP"};
query.insert("programmers").values(insertParams);
System.out.println(query.getQuery());
// Output: INSERT INTO programmers VALUES(?,?,?,?);

Triedu Query je potrebné do triedy Wrapper importovať!

Tvorba triedy Database

Teraz už prejdime k triede Database, ktorá zastrešuje celý wrapper.

Konštruktor - pripojenie k databáze

V konštruktore sa pripojíme k databáze a toto spojenie si uložíme:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Database {

    // Database connection
    protected Connection connection;

    // Instance of the Query class
    protected Query query;

    /**
     * Constructor of Database
     *
     * @param db       Db name
     * @param userName User name
     * @param password User password
     * @throws SQLException
     */
    public Database(String db, String userName, String password) throws SQLException {
        connection = DriverManager.getConnection("jdbc:mysql://localhost/" + db, userName, password);
    }
}

Pokiaľ by sme wrapper používali vo webovej aplikácii miesto v desktopovej, nebol by tento prístup vhodný kvôli veľkému počtu aktívnych spojení s databázou. V tomto prípade by sme sa mali pripojiť v každej metóde znova a pomocou bloku try-with-resources, ako to poznáme z predchádzajúcich tutoriálov.

Všeobecná metóda query()

Táto metóda bude privátna a bude to pomocná metóda pre metódy delete(), save() a update(), ktoré si vytvoríme v ďalších častiach:

// ...
import java.sql.PreparedStatement;

public class Database {

    // ...

    /**
     * @param query  SQL query
     * @param params Query params
     * @return The number of rows affected by the query.
     * @throws SQLException
     */
    private int query(String query, Object[] params) throws SQLException {
        PreparedStatement ps = connection.prepareStatement(query);
        if (params != null) {
            int index = 1;
            for (Object param : params) {
                ps.setObject(index, param);
                index++;
            }
        }
        return ps.executeUpdate();
    }
}

Metóda prijíma ako prvý parameter SQL dotaz a ďalej môže prijať akýkoľvek počet parametrov rôzneho typu.

Ďalej stojí za povšimnutie metóda setObject() triedy PreparedStatement. Vďaka tejto metóde môžeme uložiť hodnoty bez toho, aby sme dopredu vedeli aký majú dátový typ. Táto metóda je pre nás záchrana a veľmi nám uľahčí prácu.

Metóda vracia počet ovplyvnených riadkov. Výnimka, ktorá môže pri dotaze vzniknúť, je automaticky propagovaná vďaka použitiu kľúčového slova throws v hlavičke metódy. Dátový typ výnimky je v tomto prípade SQLException.

Vymazanie záznamov - metóda delete()

Do triedy Database teraz doplníme metódu na mazanie záznamov:

public class Database {

    // ...

    /**
     * Deletes data from the database table
     *
     * @param table       Db table
     * @param requirement Condition
     * @param param       Query params
     * @return The number of rows affected by the query.
     * @throws SQLException
     */
    public int delete(String table, String requirement, Object[] param) throws SQLException {
        query = new Query();
        query.delete(table).where(requirement);

        return query(query.getQuery(), param);
    }
}

Metóde delete() môžeme odovzdať podmienku a parametre a vymažú sa iba tie záznamy, ktoré splnia nami stanovené kritériá.

Výnimky sa v tejto metóde taktiež vyvolávajú automaticky a ich ošetrenie prenechávame až na triede, z ktorej metódu budeme volať.

Metóda ďalej vracia počet ovplyvnených riadkov. Pomocou tejto hodnoty potom zistíme, či sa dotaz vykonal správne. Túto návratovú hodnotu vracajú aj metódy save() a update().

Je dôležité nezabudnúť, že výsledný SQL dotaz nám vracia metóda getQuery(). Častou chybou je, že sa metóde query() odovzdá iba inštancia triedy Query. Pozri príklad:

// This code won't work
return query(query, param);

Zápis údajov - metóda insert()

Doplňme teraz kód metódy insert():

public class Database {

    // ...

    /**
     * Inserts one new record into the db table
     *
     * @param table  Db table
     * @param params Query params
     * @return The number of rows affected by the query.
     * @throws SQLException
     */
    public int insert(String table, Object[] params) throws SQLException {
        query = new Query();
        query.insert(table).values(params);

        return query(query.getQuery(), params);
    }
}

Metóda insert() triedy Database má 2 parametre. Názov tabuľky a údaje ktoré sa majú do tabuľky zapísať. Metóda je jednoduchá a nie je k nej veľmi čo dodať.

Aktualizácia údajov - metóda update()

Nakoniec si dnes doplníme metódu na úpravu databázových záznamov:

public class Database {

    // ...

    /**
     * Updates chosen database data
     *
     * @param table       Db table
     * @param columns     Columns to be updated
     * @param requirement Condition
     * @param params      Query params
     * @return The number of rows affected
     * @throws SQLException
     */
    public int update(String table, String[] columns, String requirement, Object[] params) throws SQLException {
        query = new Query();
        query.update(table).set(columns).where(requirement);

        return query(query.getQuery(), params);
    }
}

Prvé tri parametre tejto metódy sú:

  • názov databázovej tabuľky,
  • pole názvu stĺpcov a
  • podmienka.

Ďalej môže mať metóda ešte ďalšie parametre typu Object, kde uvedieme údaje, ktoré sa do tabuľky zapíšu namiesto tých starých.

Vo všetkých metódach v triede Database môžete vidieť výhody plynulého rozhrania z triedy Query. Kód je veľmi jednoduchý, čitateľný a dá sa ľahko pochopiť.

Nabudúce nám zostala na doplnenie triedy Database ešte metóda select().

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


 

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