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í.

