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 tutoriále kurzu Databáza v
Jave si do triedy Database
doplníme metódu
select()
, vďaka ktorej 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 triedy
Database
V triede Database
máme pripravené metódy na mazanie,
vkladanie a úpravu záznamov. Teraz do triedy doplníme poslednú metódu na
výber záznamov.
Metóda select()
Metóda select()
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ť kolekciu ResultSet
, ktorú vytvoríme
pomocou metódy 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 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; } }
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
Triedu Database
máme týmto hotovú a presunieme sa do triedy
Wrapper
s metódou main()
. Všetky vykonané zmeny
môžeme pozorovať vo svojom grafickom vývojovom databázovom prostredí.
Pripojenie k databáze
Najprv otestujeme pripojenie:
import DB.Database; import java.sql.SQLException; public class Wrapper { public static void main(String[] args) { try { Database database = new Database("persons", "root", ""); } catch (SQLException ex) { System.out.println("Error - " + ex.getMessage()); } } }
Aplikáciu spustíme a otestujeme spojenie. Nemali by sa vám zobraziť žiadne chybové hlásenia:
Konzolová aplikácia
Process finished with exit code 0
Odteraz budeme pripisovať kód iba do metódy main()
triedy
Wrapper
. Všetok ďalší kód budeme dopĺňať do bloku
try
, vo vetve catch
zostane odchytenie výnimky
SQLException
a výpis správy do konzoly, ako máme uvedené v
predošlej ukážke.
Vloženie záznamu
Teraz do našej databázy vložíme z Java kódu nový záznam:
try { Database database = new Database("persons", "root", ""); Oject[] firstParams = {22, "Galí", 43, "PHP"}; int success1 = database.insert("programmers", firstParams); System.out.println("Insert a user = " + success1); } catch // ...
Po spustení aplikácie dostaneme tento výsledok:
Konzolová aplikácia
Insert a user = 1
Process finished with exit code 0
Postup metódy insert()
a values()
z triedy
Query
je nasledujúci:
- V prvom kroku po skončení cyklu
for
, dostaneme tento SQL dotaz:
INSERT INTO programmers VALUES(?,?,?,?,
- Vďaka metóde
deleteCharAt()
, ktoré posielame ako parameter index posledného výskytu čiarky v reťazci metódoulastIndexOf()
, vymažeme poslednú čiarku. - Nakoniec metódou
append()
pridáme na koniec reťazca uzatváraciu zátvorku a bodkočiarku. Potom bude dotaz kompletný a bude vyzerať takto:
INSERT INTO programmers VALUES(?,?,?,?);
Dotaz sa následne spustí metódou query()
.
Vymazanie užívateľa
Teraz otestujeme metódu delete()
. Za existujúci kód prvej
vetvy try-catch
bloku doplníme tri riadky:
Object[] deleteParams = {"Galí"}; int success2 = database.delete("programmers", "name = ?", deleteParams); System.out.println("Delete the user Gali = " + success2);
Kód pre vloženie nového užívateľa zakomentujeme a po opätovnom spustení aplikácie dostaneme výstup:
Konzolová aplikácia
Delete the user Gali = 1
Process finished with exit code 0
Prepísanie používateľa
Funkčnosť metódy update()
overíme spustením nasledujúceho
kódu:
String[] columns = {"name", "age", "language"}; Object[] updateParams = {"Galileo", 18, "Java", 6}; int success3 = database.update("programmers", columns, "id = ?", updateParams); System.out.println("Edit a user = " + success3);
Výstup:
Konzolová aplikácia
Edit a user = 1
Process finished with exit code 0
Metóda pred cyklom for
vygereruje nasledujúci SQL dotaz:
UPDATE persons SET
Po cykle for
bude vyzerať dotaz takto:
UPDATE persons SET name = ? ,age = ? ,
A po odstránení poslednej čiarky a po pridaní podmienky bude dotaz v konečnej podobe:
UPDATE persons SET user = ? ,age = ? where id = ?
Výpis položiek
Nakoniec otestujeme metódu select()
:
String[] searchedColumns = {"name", "language"}; Object[] searchedParams = {"Java"}; ResultSet rs = database.select("programmers", searchedColumns, "language = ?", searchedParams); }
Už vieme, že táto metóda pracuje trochu inak ako ostatné metódy. Jej
návratovou hodnotou je kolekcia ResultSet
. Na vypísanie
užívateľov teda použijeme cyklus:
while(rs.next()){ System.out.println(rs.getString("name")+" - " + rs.getString("language")); }
Výstup:
Konzolová aplikácia
James - Java
Danna - Java
Galileo - Java
Amy - Java
Process finished with exit code 0
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ť.
Doplnenie metódy
count()
v triede Database
Do triedy Database
si doplníme ďalšiu často používanú
metódu, metódu count()
pre zistenie počtu riadkov vybranej
tabuľky:
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); } }
Tabuľku musíme do dotazu dosadiť zápisom
"SELECT COUNT(*) FROM" + table
. Meno tabuľky totiž nemôžeme
dať ako parameter metóde setString()
.
Metódu count()
otestujeme pridaním riadku:
System.out.println(database.count("programmers"));
Na koniec vetvy try
v triede Wrapper
a aplikáciu
znovu spustíme:
Konzolová aplikácia
14
Process finished with exit code 0
Tak a to je k nášmu wrapperovi všetko. 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é 4x (5.08 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java