Lekce 27 - Derby DB - Použití objektů dotazů Statement
V předchozím kvízu, Kvíz - SQuirreL SQL, schémata a metadata Derby DB v Javě, jsme si ověřili nabyté zkušenosti z předchozích lekcí.
V dnešním Java tutoriálu vytvoříme projekt, ve kterém použijeme
objekty dotazů Statement
, PreparedStatement
a
CallableStatement
.
Připojovat se budeme na databázi databazeE01
a tabulku
tabulkaE01
, kterou jsme vytvořili v této
lekci .
Založení projektu
Vytvoříme projekt v Java SE projekt v IDE. V menu zvolíme File –
New – Java Project. Pojmenujeme projekt a nastavíme
JRE Java8
. Do CLASSPATH
našeho projektu přidáme
tyto externí knihovny:
derbyclient.jar
derby.jar
derbytools.jar
derbyoptionaltools.jar
Třída UzivatelProcedure
Založíme POJO třídu UzivatelProcedure
:
package derbylib; import java.sql.*; public class UzivatelProcedure { }
Metoda vypisTabulky()
Do třídy UzivatelProcedure
napíšeme metodu
vypisTabulky()
. Metoda je typu IN/OUT a bude mít
vstupní IN parametry a návratový objekt OUT
ResultSet
:
public static void vypisTabulky(String tab,ResultSet[] vysledek) throws SQLException { String dbURL = "jdbc:default:connection"; Connection conn = DriverManager.getConnection(dbURL); String sql = "select * from "+tab+" order by id"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); vysledek[0] = rs; }
Metoda vypis2radku()
Do třídy UzivatelProcedure
dále napíšeme metodu
vypis2radku()
. I tato metoda je typu IN/OUT a bude
mít vstupní IN parametry a návratový objekt
OUT ResultSet
:
public static void vypis2radku(String tab,String jmeno,int hodnota, ResultSet[] vysledek) throws SQLException { String dbURL = "jdbc:default:connection"; Connection conn = DriverManager.getConnection(dbURL); String sql = "select * from "+tab+" where firstName=(?) OR hodnota=(?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1,jmeno); pstmt.setInt(2,hodnota); ResultSet rs = pstmt.executeQuery(); vysledek[0] = rs; } }
Kompilace
Kompilaci provedeme buď v IDE nebo přes příkazový řádek(např. Terminal v Eclipse CTRL + ALT + T nebo přímo v CMD):
Jelikož máme balíčky, kompilaci provedeme v adresáři
ProjektDERBY25Dotazy\src
standardním příkazem
javac derbylib\ *.java
.
Založení
*.jar
knihovny a nastavení CLASSPATH
pro DerbyDB
Tvorbu *.jar
jako knihovny, přes příkazový řádek, jsme si
vysvětlili v tomto článku.
Nejprve vytvoříme soubor manifest.man
, který umístíme do
adresáře ProjektDERBY25Dotazy\src
. Poté příkazem:
jar cmf manifest.man libproc.jar derbylib\*.class
vytvoříme knihovnu(library) s názvem libproc.jar
.
Obsah souboru manifest.man
:
Manifest-Version: 1.0 Created-By: 1.8.0_201 (Oracle Corporation)
Používám Java8 update201
. Upravte si podle
vaší verze.
Výsledek vypadá takto:
Export lze provést i přes IDE. Eclipse a ostatní IDE to podporují.
Nastavení naší knihovny přes CLASSPATH
jsme si vysvětlili v
této
lekci . Nastavení provedeme stejně. Vytvoříme systémovou proměnnou
CLASSPATH
s cestou k libproc.jar
:
Deklarace procedur
Spustíme DerbyDB. Přes IJ nástroj se připojíme k databázi. Nyní
nakonfigurujeme do DerbyDB naše metody
vypisTabulky()
a vypis2radku()
. Každou metodu musíme
nastavit samostatně. Ve vstupních parametrech používáme
databázové datové typy.
Přesná specifikace syntaxe nastavení je v Derby Reference Manual - Apache DB.
Konfigurace vypisTabulky()
Upravíme pouze první a poslední řádek. Do prvního řádku vložíme název procedury a nastavíme IN parametr. Do posledního řádku vložíme název balíčku.třídy.metody:
CREATE PROCEDURE vypisTabulky(IN tab VARCHAR(254)) PARAMETER STYLE JAVA LANGUAGE JAVA READS SQL DATA DYNAMIC RESULT SETS 1 EXTERNAL NAME 'derbylib.UzivatelProcedure.vypisTabulky';
Konfigurace vypis2radku()
I zde upravíme pouze první a poslední řádek. Do prvního řádku vložíme název procedury a nastavíme IN parametry. Do posledního řádku vložíme název balíčku.třídy.metody:
CREATE PROCEDURE vypis2radku(IN tab VARCHAR(254),IN jmeno VARCHAR(254),IN hodnota INTEGER) PARAMETER STYLE JAVA LANGUAGE JAVA READS SQL DATA DYNAMIC RESULT SETS 1 EXTERNAL NAME 'derbylib.UzivatelProcedure.vypis2radku';
Výpis procedur
Ověření vložených procedur provedeme příkazem
show procedures;
. Vypíší se všechny procedury:
Po konfiguraci provedeme reset DerbyDB.
Testování objektů dotazů
Vytvoříme program, ve kterém využijeme objekty dotazů
Statement
, PreparedStatement
a
CallableStatement
. Položíme dotazy databázím a výsledky
zobrazíme:
package derby; import java.sql.*; public class Dotazy { static { try { Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance(); } catch (Exception e) { System.out.println("Problém s driverem"); e.printStackTrace(); } } private static Connection connect = null; private static ResultSet vysledek = null; private static void pripojeniKDatabazi(){ try { connect = DriverManager.getConnection("jdbc:derby:D:\\JavaProjekty\\Java.DB.Derby\\X_DerbyDB\\bin\\databazeE01" + ";user=zaloha1;password=heslo1"); System.out.println("Podařilo se připojit databazeE01"); } catch (Exception e) { System.out.println("\nNepodařilo se připojit databazeE01"); e.printStackTrace(); } } private static void odpojimeDatabazi() { try { if (connect != null) connect.close(); else return; System.out.println("Podařilo se odpojit od databáze databazeE01"); } catch (SQLException e) { System.out.println("\nNepodařilo se odpojit od databáze databazeE01"); e.printStackTrace(); } } private static void vypisTabulky(ResultSet vysledek,String txt) throws SQLException { System.out.println("Vypis "+txt); while(vysledek.next()) { System.out.print("Id : "+vysledek.getInt(1)+"\t"); System.out.print("Jmeno : "+vysledek.getString(2)+"\t"); System.out.println("Id : "+vysledek.getString(3)); } } private static void statementDotaz() { try { if (connect == null) return; Statement statement = connect.createStatement(); vysledek = statement.executeQuery("SELECT * FROM tabulkaE01 ORDER BY id"); vypisTabulky(vysledek,"Statement"); } catch (SQLException e) { System.out.println("\nNepodařilo se získat data statement Dotaz-metoda"); e.printStackTrace(); } } private static void preparedDotaz() { try { if (connect == null) return; PreparedStatement statement = connect.prepareStatement("SELECT * FROM tabulkaE01 WHERE firstName=(?) OR firstName=(?) "); statement.setString(1,"Jmeno4"); statement.setString(2,"Jmeno6"); vysledek = statement.executeQuery(); vypisTabulky(vysledek,"Prepared"); } catch (SQLException e) { System.out.println("\nNepodařilo se získat data prepared Dotaz-metoda"); e.printStackTrace(); } } @SuppressWarnings("unused") private static void callDefaultniMetodyDerby() { try { if (connect == null) return; CallableStatement callDotaz = connect.prepareCall("? = CALL SYSCS_UTIL.SYSCS_GET_DATABASE_NAME()"); callDotaz.registerOutParameter(1, Types.VARCHAR); callDotaz.executeUpdate(); String hodnota = callDotaz.getString(1); System.out.println("\nInformace SYSCS_UTIL.SYSCS_GET_DATABASE_NAME : "+hodnota); } catch (SQLException e) { System.out.println("\nNepodařilo se získat data callable Dotaz-metoda"); e.printStackTrace(); } } private static void callVytvoreneMetodyDerby() { try { if(connect == null) return; // metoda 1 CallableStatement statement = connect.prepareCall("{call vypisTabulky(?)}"); statement.setString(1,"tabulkaE01"); vysledek = statement.executeQuery(); vypisTabulky(vysledek,"Callable1"); // metoda 2 statement = connect.prepareCall("{call vypis2radku(?,?,?)}"); statement.setString(1,"tabulkaE01"); statement.setString(2,"Jmeno6"); statement.setInt(3,222222); vysledek = statement.executeQuery(); vypisTabulky(vysledek,"Callable2"); } catch (SQLException e) { System.out.println("\nNepodařilo se získat data callable Dotaz-metoda"); e.printStackTrace(); } } public static void main(String[] args) { System.out.println("Start Programu "); pripojeniKDatabazi(); statementDotaz(); preparedDotaz(); //callDefaultniMetodyDerby(); callVytvoreneMetodyDerby(); odpojimeDatabazi(); System.out.println("Konec Programu "); } }
V metodě pripojeniKDatabazi()
provedeme připojení k naší
databázi databazeE01
.
Připravíme si metodu vypisTabulky()
, které předáme objekt
typu ResultSet
a název použitého objektu dotazu
typu String
. Metodě budeme předávat výsledky z
jednotlivých objektů dotazů.
V metodách statementDotaz()
, preparedDotaz()
a
callVytvoreneMetodyDerby()
si vyzkoušíme základní dotazový
objekt Statement
, poté dotazový objekt
PreparedStatement
a nakonec dotazový objekt
CallableStatement
.
Výstup dat vidíme zde:
V následujícím kvízu, Kvíz - Derby DB v Javě, si vyzkoušíme nabyté zkušenosti z kurzu.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 8x (14.36 kB)
Aplikace je včetně zdrojových kódů v jazyce Java