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
.