dodání ihned! nové
Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
BF

Lekce 26 - Derby DB - Teorie objektů dotazů Statement Nové

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.

Použitá tabulka

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

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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 příští lekci, Derby DB - Použití objektů dotazů Statement, vytvoříme projekt, ve kterém využijeme objekty dotazů Statement, PreparedStatement a CallableStatement.


 

Předchozí článek
Derby DB - Metadata databáze a tabulky
Všechny články v sekci
DerbyDb
Přeskočit článek
(nedoporučujeme)
Derby DB - Použití objektů dotazů Statement
Článek pro vás napsal Robert Michalovič
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
Programuji převážně v Javě SE,EE a trochu nativním C a CUDA. více viz.https://cz.linkedin.com/in/robert-michalovic
Aktivity

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!