8. diel - Programovanie databázového Wrappera v Jave - Dokončenie
V predchádzajúcom kvíze, Kvíz - Práca s databázou a wrapper v Java JDBC, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.
V tomto poslednom diele si dorobíme metódu select, vďaka ktorej si budeme načítať 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 Wrappera - 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 wrapperi implementujeme. Nájdeme tu jedno preťaženie. Môžeme volať metódu select s podmienkou alebo bez nej.
Testovanie wrappera
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 iba 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úcu podobu SQL dotazu:
INSERT INTO programatori VALUES(?,?,?,?,
Vďaka metóde deleteCharAt, ktoré posielame ako parameter index posledného výskytu čiarky v poli Stringov, ktorý získame za pomoci metódy sb.lastIndexOf, vymažeme poslednú čiarku. A nakoniec pridáme koniec zátvorky a bodkočiarku. Potom bude otázka kompletná a bude vyzerať nasledovne:
INSERT INTO programatori VALUES(?,?,?,?);
Otázka 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 použí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úci sql dotaz:
UPDATE osoby SET
Po cykle for bude vyzerať dotaz 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 je ResultSet a na 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šenie wrappera
Takto vyzerajúca knižnica by nám v aplikáciách na mnoho vecí stačila. Poďme si ale ukázať ako našu 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 wrappera 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 cvičení, Riešené úlohy k 1.-8. lekciu práce s databázami v Jave, si precvičíme 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