26. diel - Derby DB - Statement, PreparedStatement a CallableStatement 1
V minulej lekcii, Derby DB - Metadáta databázy a tabuľky , sme si predviedli získanie informácií z objektov metadát databázy a tabuľky.
V dnešnom Java tutoriálu si preberieme objekty otázok
Statement, PreparedStatement a
CallableStatement.
Objekty otázok sú v databázach dôležité. Ide o štandardné objekty, ktoré sú dostupné vJava API balíčkoch. Tieto objekty dotazov sú popísané v dokumentáciách Java API a DerbyDB (referencie Derby).
Objekty dotazov vykonáva dotaz v SQL syntax nad databázami, z ktorých tak získajú odpoveď väčšinou vo forme objektu ResultSet.
Postupne si tu preberieme všetky dotazových objekty. Nižšie uvedené
príklady si vyskúšame na našu databázu DerbyDatabE01 a
tabuľke TABULKAE01.

Statement
Štandardné, najjednoduchšie a najčastejšie používaný je objekt dotazu
Statement.
Objekt dotazu Statement je hlavný dopytovať
objekt a zvyšné objekty z neho vychádza a rozširujú ho. Je
výhodný pre použitie statických (nemenných)
dotazov, čiže otázok bez modifikovateľných parametrov.
Príklad 1
Vyskúšame si tento príklad použitia dotazového objektu Statement:if(connect == null) return; Statement statement = connect.createStatement(); ResultSet odpoved = statement.executeQuery("SELECT * FROM tabulkaE01 ORDER BY id");
Otázka uloží do ResultSet všetky
riadky tabuľky TABULKAE01 zotriedené podľa
id.
Príklad 2
Teraz si vyskúšame iný príklad použitia dotazového objektu Statement:if(connect == null) return; Statement statement = connect.createStatement(); ResultSet odpoved = statement.executeQuery("SELECT * FROM tabulkaE01 WHERE firstName='Jmeno3'");
Otázka uloží do ResultSet iba
riadky, kde sa nachádza v stĺpci FIRSTNAME hodnota
Jmeno3.
PreparedStatement
Objekt dotazu PreparedStatement
je predpripraveným dotazom, ktorý je predkompilované a
uložený v objekte. Pri jeho opakovanom volaní netreba nová
inicializácia, čím ušetríme strojový čas a beh programu je
efektívnejšie. Otázka vracia objekt typu PreparedStatement.
Rozhranie PreparedStatement umožnuje meniť
parametre za behu. Kľúčové výberové kritérium môžeme dosadiť
neskôr, než vytvoríme objekt dotazu. To si teraz vyskúšame.
Príklad 1
Vyskúšame si otázku, ktorý doResultSet uloží riadky našej
tabuľky TABULKAE01, ktoré obsahujú v stĺpci
FIRSTNAME hodnotu Jmeno6. Skúsime dodať výberové
kritérium až po vytvorení objektu dotazu. Namiesto hľadané
hodnoty Jmeno6 vložíme do dotazu výraz (?). Hodnotu
Jmeno6 dosadíme do objektu dotazu statement miesto
(?) Až v nasledujúcom riadku:
if(connect == null) return; ResultSet odpoved = null; PreparedStatement statement = connect.prepareStatement("SELECT * FROM tabulkaE01 WHERE firstName=(?) "); statement.setString(1,"Jmeno6"); odpoved = statement.executeQuery();
Príklad 2
Teraz si vyskúšame komplikovanejšia dotaz, ktorý doResultSet
uloží riadky našej tabuľky TABULKAE01, ktoré obsahujú v
stĺpci FIRSTNAME hodnotu Jmeno4 a zároveň v stĺpci
HODNOTA hodnotu 444444:
if(connect == null) return; ResultSet odpoved = null; PreparedStatement statement = connect.prepareStatement("SELECT * FROM tabulkaE01 WHERE firstName=(?) AND hodnota=(?) "); statement.setString(1,"Jmeno4"); statement.setInt(2,444444); odpoved = statement.executeQuery();
Príklad 3
Nakoniec si vyskúšame dotaz, ktorý doResultSet uloží riadky
našej tabuľky TABULKAE01, ktoré obsahujú v stĺpci
FIRSTNAME hodnotu Jmeno4, alebo hodnotu
Jmeno6:
if(connect == null) return; ResultSet odpoved = null; PreparedStatement statement = connect.prepareStatement("SELECT * FROM tabulkaE01 WHERE firstName=(?) OR firstName=(?) "); statement.setString(1,"Jmeno4"); statement.setString(2,"Jmeno6"); odpoved = statement.executeQuery();
CallableStatement
Objekt dopytu CallableStatement
umožnuje volať defaultný, alebo nami vytvorené procedúry a
funkcie, ktoré sú súčasťou databázy.
CallableStatement môže vrátiť nielen
primitívne dátové typy, ale aj
objekty, alebo viac objektov (pole, kolekcia), či
ResultSet.
CallableStatement môžeme rozdeliť na:
- OUT s návratovým typom
- IN / OUT so vstupným parametrom a návratovým typom
Ukážeme si oba prípady.
OUT
Najprv si vyskúšameCallableStatement s návratovým typom.
Zavoláme defaultný integrovanú procedúru, ktorá nám
vráti názov databázy:
if(connect == null) return; CallableStatement statement = connect.prepareCall("? = CALL SYSCS_UTIL.SYSCS_GET_DATABASE_NAME()"); statement.registerOutParameter(1, Types.VARCHAR); statement.executeUpdate(); String hodnota = statement.getString(1); System.out.println("Informácie SYSCS_UTIL.SYSCS_GET_DATABASE_NAME : "+hodnota);
IN / OUT
NaCallableStatement so vstupným parametrom a návratovým typom
si ukážeme dva príklady.
Príklad 1
V prvom príklade odovzdáme vstupný parameter s hodnotouDataDictionaryVersion defaultný integrovanej
procedúre, ktorá nám vráti hodnotu databázové
vlastnosti DataDictionaryVersion:
if(connect == null) return; CallableStatement statement = connect.prepareCall("? = CALL SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTY(?)"); statement.registerOutParameter(1, Types.VARCHAR); statement.setString(2,"DataDictionaryVersion"); statement.executeUpdate(); String hodnota = statement.getString(1); System.out.println("Informace SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTY - DataDictionaryVersion : "+hodnota);
Príklad 2
V druhom príklade odovzdáme tri vstupné parametre užívateľské procedúre, ktorá nám vráti hodnoty v objekteResultSet:
if(connect == null) return; CallableStatement statement = connect.prepareCall("{call vypis2radku(?,?,?)}"); statement.setString(1,"tabulkaE01"); statement.setString(2,"Jmeno6"); statement.setInt(3,222222); ResultSet odpoved = statement.executeQuery(); while(odpoved.next()) { System.out.print("Id : "+odpoved.getInt(1)+"\t"); System.out.print("Jmeno : "+odpoved.getString(2)+"\t"); System.out.print("Primeni : "+odpoved.getString(3)+"\t"); System.out.print("Informace : "+odpoved.getString(4)+"\t"); System.out.println("Cislo : "+odpoved.getInt(5)); }
V budúcej lekcii, Derby DB - Použitie objektov dotazov Statement , vytvoríme projekt, v ktorom využijeme objekty
otázok Statement, PreparedStatement a
CallableStatement.
