NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Použitá tabulka - Derby DB

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


 

Předchozí článek
Derby DB - Metadata databáze a tabulky
Všechny články v sekci
Derby DB
Přeskočit článek
(nedoporučujeme)
Kvíz - SQuirreL SQL, schémata a metadata Derby DB v Javě
Č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