8. diel - Programovanie databázového Wrapper v Jave - Dokončenie
V minulom dieli seriálu tutoriálov o databázach v Jave sme rozpísali databázový wrapper v Jave. V tomto poslednom diele si dorobíme metódu select, vďaka ktorej si budeme načítavať dáta z databázy. Potom všetky doterajšie metódy otestujeme a nakoniec si ukážeme, ako by sme mohli náš wrapper rozšíriť.
Dokončenie Wrapper - metóda select
Táto metóda bude pracovať inak ako metódy save, delete a update. Nebude využívať metódu query, pretože v tej voláme metódu executeUpdate, ktorá vracia počet ovplyvnených riadkov. V metóde naopak budeme vracať ResultSet, ktorý vytvoríme za pomoci metódy executeQuery.
public class Database { //atribut třídy //metody tříd /** * Vrací údaje z databázové tabulky * @param table * @param columns * @param params * @return * @throws SQLException */ public ResultSet select(String table, Object[] columns, Object[] params) throws SQLException{ return this.select(table, columns, "", params); } /** * Vrací údaje z databázové tabulky * @param table * @param columns * @param requirement * @param params * @return * @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; } }
Metóda select je posledná metóda, ktorú v našom wrapper implementujeme. Nájdeme tu jedno preťaženia. Môžeme volať metódu select s podmienkou a alebo bez nej.
Testovanie Wrapper
Tak triedu Database máme hotovú a teraz sa presunieme do triedy Wrapper, ktorú nám vygeneroval NetBeans. Všetky vykonané zmeny môžete pozorovať vo svojom grafickom vývojovom databázovom prostredí. Najprv otestujeme pripojenie:
package wrapper; import DB.Database; import java.sql.SQLException; public class Wrapper { /** * @param args the command line arguments */ public static void main(String[] args) { try { Database database = new Database("osoby", "root", ""); } catch (SQLException ex) { System.out.println("error - "+ex.getMessage()); } } }
Kód otestujte. Všetko by malo byť v poriadku. Nemala by sa vám zobraziť žiadna chybová hláška. Odteraz budeme pripisovať kód len do metódy main. Budem teda písať iba obsah metódy main. Zvyšok triedy nebudem v ďalších častiach vypisovať.
Zápis
try { Database database = new Database("osoby", "root", ""); Object[] firstParams = {22, "Galí", 43, "PHP"}; int uspech1 = database.insert("programatori", firstParams); System.out.println("Uložení uživatele = "+uspech1); } catch (SQLException ex) { System.out.println("error - "+ex.getMessage()); }
Mali by ste dostať výsledok:
Uložení uživatele = 1 BUILD SUCCESSFUL (total time: 1 second)*
Postup (Metódy insert a values v triede Query)
V prvom kroku po skončení cyklu for, dostaneme nasledujúce podobu SQL dotazu:
INSERT INTO programatori VALUES(?,?,?,?,
Vďaka metóde deleteCharAt, ktoré posielame ako parameter index posledného výskytu čiarky v poli STRING, ktorý získame pomocou metódy sb.lastIndexOf, vymažeme posledný čiarku. A nakoniec pridáme koniec zátvorky a bodkočiarka. Potom bude dotaz kompletný a bude vyzerať nasledovne:
INSERT INTO programatori VALUES(?,?,?,?);
Dotaz sa následne spustí metódou query.
Vymazanie užívateľa
Database database = new Database("osoby", "root", ""); Object[] params2 = {"Galí"}; int uspech2 = database.delete("programatori", "jmeno = ?", params2); System.out.println("Smazání uživatele Gali = "+uspech2);
výstup:
Smazání uživatele Gali = 1 BUILD SUCCESSFUL (total time: 1 second)
Prepísanie užívateľa
Database database = new Database("osoby", "root", ""); String[] columns = {"jmeno","vek","jazyk"}; Object[] params = {"Galileo", 18, "Java", 6}; int uspech4 = database.update("programatori", columns, "id = ?", params); System.out.println("Přepsání uživate = "+uspech4);
výstup:
Přepsání uživate = 1 BUILD SUCCESSFUL (total time: 1 second)
postup:
Metóda pred cyklom for vygereruje nasledujúce sql dotaz:
UPDATE osoby SET
Po cykle for bude vyzerať otázka takto:
UPDATE osoby SET jmeno = ? ,vek = ? ,
A po odstránení poslednej čiarky a po pridaní podmienky bude dotaz v konečnej podobe:
UPDATE osoby SET jmeno = ? ,vek = ? where id = ?
Výpis
String[] columns3 = {"jmeno","jazyk"}; Object[] params3 = {"Java"}; ResultSet rs = database.select("programatori", columns3, "jazyk = ?", params3); }
Táto metóda pracuje trochu inak, než ostatné metódy. Jej návratová hodnota ResultSet ak vypísanie užívateľov použijeme cyklus. Takto by vyzeralo vypísanie:
while(rs.next()){ System.out.println(rs.getString("jmeno")+" - "+rs.getString("jazyk")); }
výstup:
James - java Danna - java Galileo - Java Amy - java BUILD SUCCESSFUL (total time: 1 second)
Vylepšenia Wrapper
Takto vyzerajúci knižnica by nám v aplikáciách na mnoho vecí stačila. Poďme si ale ukázať ako našej triedu ešte vylepšiť
Metóda count - počet riadkov v databázovej tabuľke:
public class Database { //atribut třídy //metody tříd /** * * @param table * @return * @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); } }
Tabuľku tam musíme dosadiť natvrdo "SELECT COUNT (*) FROM" + table. Meno tabuľky totiž nemôžeme dať ako parameter metóde setString.
Test celej triedy Database
public static void main(String[] args) { try { Database database = new Database("osoby", "root", ""); Object[] firstParams = {22, "Galí", 43, "PHP"}; int uspech1 = database.insert("programatori", firstParams); System.out.println("Uložení uživatele = "+uspech1); Object[] params2 = {"Galí"}; int uspech2 = database.delete("programatori", "jmeno = ?", params2); System.out.println("Smazání uživatele Gali = "+uspech2); String[] columns = {"jmeno","vek","jazyk"}; Object[] params = {"Galileo", 18, "Java", 6}; int uspech4 = database.update("programatori", columns, "id = ?", params); System.out.println("Přepsání uživate = "+uspech4); String[] columns3 = {"jmeno","jazyk"}; Object[] params3 = {"Java"}; ResultSet rs = database.select("programatori", columns3, "jazyk = ?", params3); while(rs.next()){ System.out.println(rs.getString("jmeno")+" - "+rs.getString("jazyk")); } System.out.println(database.count("programatori")); } catch (SQLException ex) { System.out.println("error - "+ex.getMessage()); } }
Tak a to je k našej aplikácii všetko. Wrapper môžete otestovať na vašich aplikáciách a potom mi určite napíšte spätnú väzbu. Napríklad čo by ste do Wrapper doplnili alebo čo by ste urobili inak. Hotovú knižnicu si môžete stiahnuť dole pod článkom aj so zdrojovými kódmi.
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í.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 383x (23.52 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java