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í.