NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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 7 - Programování databázového Wrapperu v Javě - Třída Database

V minulém dílu, Databázový wrapper v Javě - Tvorba třídy Query, jsme začali náš wrapper programovat a vytvořili si třídu Query.

V dnešním tutoriálu budeme pracovat na třídě Database, která je sice okomentovaná, ale i tak vám k určitým částem povím pár slov. Ještě předtím si ale otestujeme třídu Query.

Testování třídy Query

Ve třídě Wrapper si do metody main() vložíme následující kód, kterým otestujeme jednotlivé dotazy na třídě Query:

Query query = new Query();

query.delete("programatori").where("jmeno = ?");
System.out.println(query.getQuery());
// Výstup: DELETE FROM programatori WHERE jmeno = ?

String[] updateColumns = {"jmeno","jazyk"};
query.update("programatori").set(updateColumns).where("where id = ?");
System.out.println(query.getQuery());
// Výstup: UPDATE programatori SET jmeno = ?,jazyk = ? WHERE where id = ?

query.select(null).from("programatori").where("jazyk = ?");
System.out.println(query.getQuery());
// Výstup: SELECT * FROM programatori WHERE jazyk = ?

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

Třídu Query je potřeba do třídy Wrapper importovat!

Tvorba třídy Database

Nyní již přejděme ke třídě Database, která zastřešuje celý wrapper.

Konstruktor - připojení k databázi

V konstruktoru se připojíme k databází a toto spojení 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);
    }
}

Pokud bychom wrapper používali ve webové aplikaci místo v desktopové, nebyl by tento přístup vhodný kvůli velkému počtu aktivních spojení s databází. V tomto případě bychom se měli připojit v každé metodě znovu a pomocí bloku try-with-resources, jak to známe z předchozích tutoriálů.

Obecná metoda query()

Tato metoda bude privátní a bude to pomocná metoda pro metody delete(), save() a update(), které si vytvoříme v dalších částech:

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

Metoda přijímá jako první parametr SQL dotaz a dále může přijmout jakýkoli počet parametrů různého typu.

Dále stojí za povšimnutí metoda setObject() třídy PreparedStatement. Díky této metodě můžeme uložit hodnoty, aniž bychom dopředu věděli, jaký mají datový typ. Tato metoda je pro nás záchrana a velmi nám ulehčí práci.

Metoda vrací počet ovlivněných řádků. Výjimka, která může při dotazu vzniknout, je automaticky propagována díky použití klíčového slova throws v hlavičce metody. Datový typ výjimky je v tomto případě SQLException.

Vymazání záznamů - metoda delete()

Do třídy Database nyní doplníme metodu pro mazání záznamů:

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

Metodě delete() můžeme předat podmínku a parametry a vymažou se pouze ty záznamy, které splní námi stanovená kritéria.

Výjimky se v této metodě taktéž vyvolávají automaticky a jejich ošetření přenecháváme až na třídě, ze které metodu budeme volat.

Metoda dále vrací počet ovlivněných řádků. Pomocí této hodnoty poté zjistíme, zda se dotaz vykonal správně. Tuto návratovou hodnotu vrací také metody save() a update().

Je důležité nezapomenout, že výsledný SQL dotaz nám vrací metoda getQuery(). Častou chybou je, že se metodě query() předá pouze instance třídy Query. Viz příklad:

// Tento kód nebude fungovat
return query(query, param);

Zápis údajů - metoda insert()

Doplňme nyní kód metody 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);
    }
}

Metoda insert() třídy Database má dva parametry. Název tabulky a údaje které se mají do tabulky zapsat. Metoda je jednoduchá a není k ní moc co dodat.

Aktualizace údajů - metoda update()

Nakonec si dnes doplníme metodu pro úpravu databázových záznamů:

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

První tři parametry této metody jsou:

  • název databázové tabulky,
  • pole názvu sloupců a
  • podmínka.

Dále může mít metoda ještě další parametry typu Object, kde uvedeme údaje, které se do tabulky zapíšou namísto těch starých.

Ve všech metodách ve třídě Database můžete vidět výhody plynulého rozhraní ze třídy Query. Kód je velmi jednoduchý, čitelný a dá se snadno pochopit.

Napříště nám zbyla na doplnění třídy Database ještě metoda select().

V následujícím kvízu, Kvíz - Práce s databází a wrapper v Java JDBC, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.


 

Předchozí článek
Databázový wrapper v Javě - Tvorba třídy Query
Všechny články v sekci
Databáze v Javě - JDBC
Přeskočit článek
(nedoporučujeme)
Kvíz - Práce s databází a wrapper v Java JDBC
Článek pro vás napsal Milan Gallas
Avatar
Uživatelské hodnocení:
56 hlasů
Autor se věnuje programování, hardwaru a počítačovým sítím.
Aktivity