NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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
derbyoptional­tools.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):

Kompilace - Derby DB

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:

JAR - Derby DB

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:

vlozeni do classpath - Derby DB

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:

vlozeni do DerbyDB - Derby DB

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ýsledek - Derby DB

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

 

Předchozí článek
Kvíz - SQuirreL SQL, schémata a metadata Derby DB v Javě
Všechny články v sekci
Derby DB
Přeskočit článek
(nedoporučujeme)
Kvíz - Derby DB v Javě
Článek pro vás napsal Robert Michalovič
Avatar
Uživatelské hodnocení:
1 hlasů
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