Lekce 26 - Derby DB - Teorie objektů dotazů Statement
V minulé lekci, Derby DB - Metadata databáze a tabulky, jsme si předvedli získání informací z objektů metadat databáze a tabulky.
V dnešním Java tutoriálu si probereme objekty dotazů
Statement
, PreparedStatement
a
CallableStatement
.
Objekty dotazů jsou v databázích důležité. Jedná se o standardní objekty, které jsou dostupné v Java API balíčcích. Tyto objekty dotazů jsou popsány v dokumentacích Java API a DerbyDB (reference Derby).
Objekty dotazů provádí dotaz v SQL syntaxi nad databázemi, z kterých tak získají odpověď většinou ve formě objektu ResultSet.
Postupně si zde probereme všechny dotazové objekty. Níže uvedené
příklady si vyzkoušíme na naši databázi DerbyDatabE01
a
tabulce TABULKAE01
.
Statement
Standardní, nejjednodušší a nejčastěji používaný je objekt dotazu Statement.
Objekt dotazu Statement
je hlavní dotazový
objekt a zbývající objekty z něho vychází a rozšiřují ho. Je
výhodný pro použití statických (neměnných)
dotazů, neboli dotazů bez modifikovatelných parametrů.
Příklad 1
Vyzkoušíme si tento příklad použití dotazového objektu Statement:
if (connect == null) return; Statement statement = connect.createStatement(); ResultSet odpoved = statement.executeQuery("SELECT * FROM tabulkaE01 ORDER BY id");
Dotaz uloží do ResultSet
všechny
řádky tabulky TABULKAE01
setříděné podle
id
.
Příklad 2
Nyní si vyzkoušíme jiný příklad použití dotazového objektu Statement:
if (connect == null) return; Statement statement = connect.createStatement(); ResultSet odpoved = statement.executeQuery("SELECT * FROM tabulkaE01 WHERE firstName='Jmeno3'");
Dotaz uloží do ResultSet
pouze
řádky, kde se nachází ve sloupci FIRSTNAME
hodnota
Jmeno3
.
PreparedStatement
Objekt dotazu PreparedStatement
je předpřipraveným dotazem, který je předkompilovaný a
uložený v objektu. Při jeho opakovaném volání není
třeba nová inicializace, čímž ušetříme strojový čas a běh programu je
efektivnější. Dotaz vrací objekt typu PreparedStatement
.
Rozhraní PreparedStatement
umožnuje měnit
parametry za běhu. Klíčové výběrové kritérium můžeme dosadit
později, než vytvoříme objekt dotazu. To si nyní vyzkoušíme.
Příklad 1
Vyzkoušíme si dotaz, který do ResultSet
uloží řádky
naší tabulky TABULKAE01
, které obsahují ve sloupci
FIRSTNAME
hodnotu Jmeno6
. Zkusíme dodat výběrové
kritérium až po vytvoření objektu dotazu. Místo hledané
hodnoty Jmeno6
vložíme do dotazu výraz (?)
. Hodnotu
Jmeno6
dosadíme do objektu dotazu statement
místo
(?)
až v následujícím řádku:
if (connect == null) return; ResultSet odpoved = null; PreparedStatement statement = connect.prepareStatement("SELECT * FROM tabulkaE01 WHERE firstName=(?)"); statement.setString(1, "Jmeno6"); odpoved = statement.executeQuery();
Příklad 2
Nyní si vyzkoušíme komplikovanější dotaz, který do
ResultSet
uloží řádky naší tabulky TABULKAE01
,
které obsahují ve sloupci FIRSTNAME
hodnotu Jmeno4
a
zároveň ve sloupci 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();
Příklad 3
Nakonec si vyzkoušíme dotaz, který do ResultSet
uloží
řádky naší tabulky TABULKAE01
, které obsahují ve sloupci
FIRSTNAME
hodnotu Jmeno4
nebo 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 dotazu CallableStatement
umožnuje volat defaultní nebo námi vytvořené procedury a
funkce, které jsou součástí databáze.
CallableStatement
může vrátit nejenom
primitivní datové typy, ale i
objekty, nebo více objektů (pole, kolekce), či
ResultSet
.
CallableStatement
můžeme rozdělit na:
- OUT s návratovým typem
- IN/OUT se vstupním parametrem a návratovým typem
Ukážeme si oba případy.
OUT
Nejprve si vyzkoušíme CallableStatement
s návratovým typem.
Zavoláme defaultní integrovanou proceduru, která nám
vrátí název databáze:
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("Informace SYSCS_UTIL.SYSCS_GET_DATABASE_NAME : " + hodnota);
IN/OUT
Na CallableStatement
se vstupním parametrem a návratovým
typem si ukážeme dva příklady.
Příklad 1
V prvním příkladu předáme vstupní parametr s hodnotou
DataDictionaryVersion
defaultní integrované
proceduře, která nám vrátí 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);
Příklad 2
V druhém příkladu předáme tři vstupní parametry uživatelské
proceduře, která nám vrátí hodnoty v objektu
ResultSet
:
if (connect == null) return; CallableStatement statement = connect.prepareCall("{call statement(?, ?, ?)}"); statement.setString(1, "tabulkaE01"); statement.setString(2, "Jmeno2"); statement.setInt(3, 222222); ResultSet odpoved = statement.executeQuery(); while(odpoved.next()) { System.out.print("Id : " + odpoved.getInt(1)+"\t"); System.out.print("Jméno: " + odpoved.getString(2) + "\t"); System.out.print("Příjmení: " + odpoved.getString(3) + "\t"); System.out.print("Informace: " + odpoved.getString(4) + "\t"); System.out.println("Číslo: " + odpoved.getInt(5)); }
V následujícím kvízu, Kvíz - SQuirreL SQL, schémata a metadata Derby DB v Javě, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.