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 tutoriálu kurzu Databáze v
Javě si do třídy Database
doplníme metodu
select()
, díky které 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í třídy
Database
Ve třídě Database
máme připravené metody pro mazání,
vkládání a úpravu záznamů. Nyní do třídy doplníme poslední metodu pro
výběr záznamů.
Metoda select()
Metoda select()
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 kolekci ResultSet
, kterou vytvoříme
pomocí metody executeQuery()
:
// ... import java.sql.ResultSet; public class Database { // ... /** * Returns data from a database table * * @param table Db table * @param columns Columns to select * @param params Query params * @return ResultSet that contains the query results from the database. * @throws SQLException */ public ResultSet select(String table, Object[] columns, Object[] params) throws SQLException { return this.select(table, columns, "", params); } /** * Returns data from a database table * * @param table Db table * @param columns Columns to be select * @param requirement Condition * @param params Query params * @return ResultSet that contains the query results from the database. * @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
Třídu Database
máme tímto hotovou a přesuneme se do třídy
Wrapper
s metodou main()
. Všechny provedené změny
můžeme pozorovat ve svém grafickém vývojovém databázovém
prostředí.
Připojení k databázi
Nejprve otestujeme připojení:
import DB.Database; import java.sql.SQLException; public class Wrapper { public static void main(String[] args) { try { Database database = new Database("osoby", "root", ""); } catch (SQLException ex) { System.out.println("Error - " + ex.getMessage()); } } }
Aplikaci spustíme a otestujeme spojení. Neměla by se vám zobrazit žádná chybová hláška:
Konzolová aplikace
Process finished with exit code 0
Odteď budeme připisovat kód pouze do metody main()
třídy
Wrapper
. Veškerý další kód budeme doplňovat do bloku
try
, ve větvi catch
zůstane odchycení výjimky
SQLException
a výpis zprávy do konzole, jak máme uvedeno v
předešlé ukázce.
Vložení záznamu
Nyní do naší databáze vložíme z Java kódu nový záznam:
try { Database database = new Database("osoby", "root", ""); Object[] insertParams = {22, "Galí", 43, "PHP"}; int uspech1 = database.insert("programatori", insertParams); System.out.println("Uložení uživatele = " + uspech1); } catch // ...
Po spuštění aplikace dostaneme tento výsledek:
Konzolová aplikace
Uložení uživatele = 1
Process finished with exit code 0
Postup metody insert()
a values()
ze třídy
Query
je následující:
- V prvním kroku po skončení cyklu
for
, dostaneme tento SQL dotaz:
INSERT INTO programatori VALUES(?,?,?,?,
- Díky metodě
deleteCharAt()
, které posíláme jako parametr index posledního výskytu čárky v řetězci metodoulastIndexOf()
, vymažeme poslední čárku. - Nakonec metodou
append()
přidáme na konec řetězce uzavírací závorku a středník. Poté bude dotaz kompletní a bude vypadat takto:
INSERT INTO programatori VALUES(?,?,?,?);
Dotaz se následně spustí metodou query()
.
Vymazání uživatele
Nyní otestujeme metodu delete()
. Za stávající kód první
větve try-catch
bloku doplníme tři řádky:
Object[] deleteParams = {"Galí"}; int uspech2 = database.delete("programatori", "jmeno = ?", deleteParams); System.out.println("Smazání uživatele Gali = " + uspech2);
Kód pro vložení nového uživatele zakomentujeme a po opětovném spuštění aplikace dostaneme výstup:
Konzolová aplikace
Smazání uživatele Gali = 1
Process finished with exit code 0
Přepsání uživatele
Funkčnost metody update()
ověříme spuštěním
následujícího kódu:
String[] columns = {"jmeno", "vek", "jazyk"}; Object[] updateParams = {"Galileo", 18, "Java", 6}; int uspech3 = database.update("programatori", columns, "id = ?", updateParams); System.out.println("Přepsání uživatele = " + uspech3);
Výstup :
Konzolová aplikace
Přepsání uživate = 1
Process finished with exit code 0
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 položek
Nakonec otestujeme metodu select()
:
String[] searchedColumns = {"jmeno","jazyk"}; Object[] searchedParams = {"Java"}; ResultSet rs = database.select("programatori", searchedColumns, "jazyk = ?", searchedParams); }
Již víme, že tato metoda pracuje trochu jinak, než ostatní metody. Její
návratovou hodnotou je kolekce ResultSet
. K vypsání uživatelů
tedy použijeme cyklus:
while (rs.next()) { System.out.println(rs.getString("jmeno") + " - " + rs.getString("jazyk")); }
Výstup:
Konzolová aplikace
James - Java
Danna - Java
Galileo - Java
Amy - Java
Process finished with exit code 0
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.
Doplnění metody
count()
ve třídě Database
Do třídy Database
si doplníme další často používanou
metodu, metodu count()
pro zjištění počtu řádku vybrané
tabulky:
public class Database { // ... /** * @param table DB table * @return Number of table rows * @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 musíme do dotazu dosadit zápisem
"SELECT COUNT(*) FROM " + table
. Jméno tabulky totiž nemůžeme
dát jako parametr metodě setString()
.
Metodu count()
otestujeme přidáním řádku:
System.out.println(database.count("programatori"));
Na konec větve try
ve třídě Wrapper
a aplikaci
znovu spustíme:
Konzolová aplikace
14
Process finished with exit code 0
Tak a to je k našemu wrapperu vše. 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 398x (5.35 kB)
Aplikace je včetně zdrojových kódů v jazyce Java