Lekce 8 - Programování databázového Wrapperu v Javě - Dokončení
V předchozím kvízu, Kvíz - Práce s databází a wrapper v Java JDBC, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V tomto posledním díle si doděláme metodu select, díky které si budeme načítat data z databáze. Poté všechny dosavadní metody otestujeme a nakonec si ukážeme, jak bychom mohli náš wrapper rozšířit.
Dokončení Wrapperu - metoda select
Tato metoda bude pracovat jinak než metody save, delete a update. Nebude využívat metodu query, protože v té voláme metodu executeUpdate, která vrací počet ovlivněných řádků. V metodě naopak budeme vracet ResultSet, který vytvoříme za pomoci metody 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; } }
Metoda select je poslední metoda, kterou v našem wrapperu implementujeme. Najdeme zde jedno přetížení. Můžeme volat metodu select s podmínkou a nebo bez ní.
Testování wrapperu
Tak třídu Database máme hotovou a teď se přesuneme do třídy Wrapper, kterou nám vygeneroval NetBeans. Všechny provedené změny můžete pozorovat ve svém grafickém vývojovém databázovém prostředí. Nejprve otestujeme připojení:
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še by mělo být v pořádku. Neměla by se vám zobrazit žádná chybová hláška. Odteď budeme připisovat kód pouze do metody main. Budu tedy psát pouze obsah metody main. Zbytek třídy nebudu v dalších částech vypisovat.
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()); }
Měli byste dostat výsledek:
Uložení uživatele = 1 BUILD SUCCESSFUL (total time: 1 second)*
Postup (Metody insert a values v třídě Query)
V prvním kroku po skončení cyklu for, dostaneme následující podobu SQL dotazu:
INSERT INTO programatori VALUES(?,?,?,?,
Díky metodě deleteCharAt, které posíláme jako parametr index posledního výskytu čárky v poli Stringů, který získáme za pomoci metody sb.lastIndexOf, vymažeme poslední čárku. A nakonec přidáme konec závorky a středník. Poté bude dotaz kompletní a bude vypadat následovně:
INSERT INTO programatori VALUES(?,?,?,?);
Dotaz se následně spustí metodou query.
Vymazání uživatele
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)
Přepsání uživatele
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:
Metoda před cyklem for vygereruje následující sql dotaz:
UPDATE osoby SET
Po cyklu for bude vypadat dotaz takto:
UPDATE osoby SET jmeno = ? ,vek = ? ,
A po odstranění poslední čárky a po přidání podmínky bude dotaz v konečné podobě:
UPDATE osoby SET jmeno = ? ,vek = ? where id = ?
Výpis
String[] columns3 = {"jmeno","jazyk"}; Object[] params3 = {"Java"}; ResultSet rs = database.select("programatori", columns3, "jazyk = ?", params3); }
Tato metoda pracuje trochu jinak, než ostatní metody. Její návratová hodnota je ResultSet a k vypsání uživatelů použijeme cyklus. Takto by vypadalo vypsání:
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šení wrapperu
Takhle vypadající knihovna by nám v aplikacích na mnoho věcí stačila. Pojďme si ale ukázat jak naší třídu ještě vylepšit
Metoda count - počet řádků v databázové tabulce:
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); } }
Tabulku tam musíme dosadit natvrdo "SELECT COUNT(*) FROM "+table. Jméno tabulky totiž nemůžeme dát jako parametr metodě setString.
Test celé třídy 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ší aplikaci vše. Wrapper můžete otestovat na vašich aplikacích a poté mi určitě napište zpětnou vazbu. Například co by jste do wrapperu doplnili nebo co by jste udělali jinak. Hotovou knihovnu si můžete stáhnout dole pod článkem i se zdrojovými kódy.
V následujícím cvičení, Řešené úlohy k 1.-8. lekci práce s databázemi v Javě, si procvičíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 383x (23.52 kB)
Aplikace je včetně zdrojových kódů v jazyce Java