Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

14. diel - Derby DB - Ukladanie / získanie jednoduchých dátových typu

V minulej lekcii, Derby DB - Práva prístupu k databáze - Prístup niekomu , sme sa naučili prideliť práva konkrétnemu užívateľovi. V tomto DerbyDB tutoriále si preberieme jednoduché dátové typy.

Diel to bude jeden z tých jednoduchších, pretože ukladanie / načítanie jednoduchých dátových typov je skutočne jednoduché. Je to prakticky iba o Setter / Getter, ktoré poznáte z OOP ako zapuzdrenie. Niekedy býva problém s formátom syntaxe (ako správne má dátový typ vyzerať), či ako sa má definovať pri tvorbe tabuľky. Preto som vytvoril tento príklad, v ktorom si ukážeme ako sa popisuje daný typ údajov a ako vyzerá. V článku neriešim ukladania s JTA (Java Transaction API) či JPA (Java Perzistencia API).

Táto tabuľka je veľmi povrchné, ale pre väčšinu implementácií postačí. Ak si chcete preštudovať originálny manuál, informácie o podporovaných dátových typoch sa nachádza v Derby Reference Manual.pdf, v kapitole "Data types" (Dátové typy). Počas prehliadky dátových typov si môžete všimnúť že Derby DB má špecifické dátové typy aj pre FOR BIT DATA. Čo to je? V prípade, že sa jedná o FOR BIT DATA dátový typ, dátový typ sa ukladá binárne tzn. vo forme byte hodnôt. Ak je vložená dátová hodnota menšia ako definovaná, zvyšok dát sa doplní 0x20 byte hodnotou. Uvediem príklad: ak definujeme CHAR 20 FOR BIT DATA, a vložíme String, ktorý bude mať menej ako 20 znakov, napr. 15 znakov, tak zvyšných 5 znakov sa naplní 0x20 byte.

Dátový typ Java Syntax Dátový typ Derby JDBC metatyp (java.sql.Types) Najmenšia hodnota: Najväčšia hodnota:
long java.lang.Long BIGINT viz. JAVA API java.lang.Lon­g.MIN_VALUE java.lang.Lon­g.MAX_VALUE
boolean java.lang.Boolean BOOLEAN viz. JAVA API true, false, null
string java.lang.String CHAR viz. JAVA API minimálne 1 znak maximálne 254 znakov
string java.lang.String CHAR FOR BIT DATA viz. JAVA API minimálne 1 znak maximálne 254 znakov
date java.sql.Date DATE viz. JAVA API
BigDecimal java.math.Big­Decimal DECIMAL viz. JAVA API
double java.lang.Double DOUBLE alebo DOUBLE PRECISION viz. JAVA API java.lang.Dou­ble.MIN_VALUE java.lang.Dou­ble.MAX_VALUE
float java.lang.Float REAL alebo FLOAT viz. JAVA API java.lang.Flo­at.MIN_VALUE java.lang.Flo­at.MAX_VALUE
integer java.lang.Integer INTEGER viz. JAVA API java.lang.Inte­ger.MIN_VALUE java.lang.Inte­ger.MAX_VALUE
string java.lang.String LONG VARCHAR viz. JAVA API minimálne 1 znak maximálne 32 700 znakov
string java.lang.String LONG VARCHAR FOR BIT DATA viz. JAVA API minimálne 1 znak maximálne 32 700 znakov
BigDecimal java.math.Big­Decimal NUMERIC viz. JAVA API
short java.lang.Short SMALLINT viz. JAVA API java.lang.Shor­t.MIN_VALUE java.lang.Shor­t.MAX_VALUE
Time java.sql.Time TIME viz. JAVA API
Time + Date java.sql.Timestamp TIMESTAMP viz. JAVA API
string java.lang.String VARCHAR viz. JAVA API minimálne 1 znak maximálne 32 672 znakov
string java.lang.String VARCHAR FOR BIT DATA viz. JAVA API minimálne 1 znak maximálne 32 672 znakov
Odkazy sú na Java 11 API, ale samozrejme sa vždy prepnite na aktuálny API.

Pokus o zápis cez IJ

Najskôr si zas predvedieme zápis cez konfiguračný príkaz IJ. Postupnosť príkazov je identická ako vždy. Najskôr sa prihlásime ako uzivatel10, vytvoríme tabuľku a naplníme ju dátami. Kvôli zvýšeniu prehľadnosti si v IJ tabuľku rozdelíme na 4 tabuľky. Tieto tabuľky v Java príklade budú spojené v jednu. Problémom sa môžu javiť dátové typy FOR BIT DATA. Dané String y je nutné previesť do HEX.

ij version 10.13
ij>connect 'jdbc:derby:databaze10;user=uzivatel10;password=heslo10';
//  prevod Stringu na hex  : MojeZnaky >>    4d6f6a655a6e616b79
ij>create table DatoveTypy1(id INT not null primary key GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1),velkecislo BIGINT,volba boolean, znak char(1), znakBitData CHAR(10) FOR BIT DATA,aktualDatum DATE,nastavDatum DATE);
ij>INSERT INTO DatoveTypy1(velkecislo,volba,znak,znakBitData,aktualDatum,nastavDatum)  VALUES(1145646546843654,'true','A',X'4d6f6a655a6e616b79','21.11.2018','17.3.1999');
ij>SELECT * FROM DatoveTypy1 order by id;

ij>create table DatoveTypy2(id INT not null primary key GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1),decCislo decimal(15,5), cisloD Double, cisloDP DOUBLE PRECISION, cisloFloat FLOAT, cisloINT INT,retezecDlouhy LONG VARCHAR);
ij>INSERT INTO DatoveTypy2(decCislo,cisloD,cisloDP,cisloFloat,cisloINT,retezecDlouhy)  VALUES(5435353.54656,45643546.45654,5645645645643546.45654,155.56,4564,'Muj String');
ij>SELECT * FROM DatoveTypy2 order by id;

//  prevod Stringu na hex  : Jiny retezec Big Date >>    4a696e7920726574657a6563204269672044617465
ij>create table DatoveTypy3(id INT not null primary key GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1),retezecBitDate LONG VARCHAR FOR BIT DATA,cisloReal REAL, cisloSHORT SMALLINT, cisloNum NUMERIC(15,5), cas TIME);
ij>INSERT INTO DatoveTypy3(retezecBitDate,cisloReal,cisloSHORT,cisloNum,cas)  VALUES(X'4a696e7920726574657a6563204269672044617465',155.56,445,151564564.5486,'21:11:33');
ij>SELECT * FROM DatoveTypy3 order by id;

//  prevod Stringu na hex  : Zde je String pro Big Data    >>    5a6465206a6520537472696e672070726f204269672044617461
ij>create table DatoveTypy4(id INT not null primary key GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1),datumcas TIMESTAMP,retezec VARCHAR(128),retetezBitData VARCHAR (128) FOR BIT DATA);
ij>INSERT INTO DatoveTypy4(datumcas,retezec,retetezBitData)  VALUES('1999-12-23 16:42:21.459','Zde je muj novy text',X'5a6465206a6520537472696e672070726f204269672044617461');
ij>SELECT * FROM DatoveTypy4 order by id;
ij>disconnect;
ij>exit;

Ako vidíte na priloženej konzolu, tak vzorové uloženie do tabuľky DatoveTypy4 prebehlo v poriadku.

TestIJ - DerbyDb

Vytvorenie tabuľky programovo ako uzivatel10

Vytvoríme testovacie príklad v Java SE ako projekt v IDE. V menu zvolíme File -> New -> Java Project. Pomenujeme projekt a nastavíme JRE Java8. Pridáme opäť externé knižnice do nášho projektu do CLASSPATH. Ide o tieto externé knižnice:

  • derbyclient.jar
  • derby.jar
  • derbytools.jar
  • derbyoptionaltools.jar
nastavenie projektu - DerbyDb

V tomto kóde sa prihlásime ako uzivatel10 a vytvoríme tabuľku DatoveTypy. Tú naplníme dátami a otestujeme získanie dát. Cestu k databáze si samozrejme upravte podľa seba:

package datab;
import java.sql.*;
import java.time.LocalDateTime;

public class DatoveTypyPrimitivni {

    private static Connection connect = null;
    private static PreparedStatement statement = null;

    static {
        try {
            Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            System.out.println("Problem s nactenim driveru - nutne pridat do CLASSPATH - derbyclient.jar");
        }
    }

    private static void pripojeniDatabaze(String jmeno,String heslo) {
        try {
            connect = DriverManager.getConnection("jdbc:derby:C:/Program Files/JavaJDK08/db/bin/databaze10;user="+jmeno+";password="+heslo+";");
            System.out.println("Podarilo se pripojit k databazi10");
        } catch (Exception e) {
            System.err.println("Nepodarilo se pripojit k databazi10");
            if (connect == null) {
                System.exit(1);
            }
        }
    }

    private static void odpojimeDatabazi() {
        try {
            if (statement != null) {
                statement.close();
            }
            if (connect != null) {
                connect.close();
            }
            System.out.println("Podarilo se odpojit od databaze");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    private static void vytvoreniTabulky(String s){
        try {
            statement = connect.prepareStatement("create table "+s+" (id INT not null primary key GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1), "
                    + " velkecislo BIGINT,volba boolean, znak char(1), znakBitData CHAR(10) FOR BIT DATA, aktualDatum DATE, "
                    + " nastavDatum DATE,decCislo decimal(15,5), cisloD Double, cisloDP DOUBLE PRECISION, cisloFloat FLOAT, cisloINT INT,retezecDlouhy LONG VARCHAR, "
                    + " retezecBitDate LONG VARCHAR FOR BIT DATA,cisloReal REAL, cisloSHORT SMALLINT, cisloNum NUMERIC(15,5), cas TIME, datumcas TIMESTAMP,"
                    + " retezec VARCHAR(128),retetezBitData VARCHAR (128) FOR BIT DATA)");
            statement.execute();
            System.out.println("Podarilo se vytvorit tabulku : "+s);
        }
        catch (SQLException e) {
            System.out.println("Nepovedlo se vytvorit tabulku :");
            e.printStackTrace();    }
    }

    @SuppressWarnings("deprecation")
    private static void naplneniDatTabulky(String s){
        java.lang.Long bigint = new Long(-15556645646l);
        byte [] znakyBitData = new String("MojeZnaky").getBytes();
        LocalDateTime today = LocalDateTime.now();
        Date datum1 = new Date(today.getYear()-1900,today.getMonthValue(),today.getDayOfMonth());
        Date datum2 = new Date(1535-1900,11,17);
        java.math.BigDecimal cisloBigDecimal = new java.math.BigDecimal("5435353.54656");
        double cisloD = 45643546.45654;
        double cisloDP = 5645645645643546.45654;
        float cislof = 155.56f;
        int cisloi = 4564;
        short cislos = (short)445;
        Time cas = new Time(today.getHour(),today.getMinute(),today.getSecond());
        Timestamp timestamp = new Timestamp(today.getYear()-1900,today.getMonthValue(),today.getDayOfMonth(),today.getHour(),today.getMinute(),today.getSecond(),today.getNano());
        try {
            statement = connect.prepareStatement("INSERT INTO "+s+"(velkecislo,volba,znak,znakBitData,aktualDatum,nastavDatum,decCislo,"
                    + "cisloD,cisloDP,cisloFloat,cisloINT,retezecDlouhy,retezecBitDate,cisloReal,cisloSHORT,cisloNum,cas,datumcas,retezec,retetezBitData)"
                    +" VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");      //  20 datovych typu = 20 otazniku
            statement.setLong(1,bigint);
            statement.setBoolean(2,true);
            statement.setString(3,"A");
            statement.setBytes(4, znakyBitData);
            statement.setDate(5, datum1);
            statement.setDate(6, datum2);
            statement.setBigDecimal(7,cisloBigDecimal);
            statement.setDouble(8,cisloD);
            statement.setDouble(9,cisloDP);
            statement.setFloat(10,cislof);
            statement.setInt(11,cisloi);
            statement.setString(12,"Muj String");
            statement.setBytes(13,"Jiny retezec Big Date".getBytes());
            statement.setFloat(14,cislof);
            statement.setShort(15,cislos);
            statement.setBigDecimal(16,new java.math.BigDecimal("151564564.5486"));
            statement.setTime(17, cas);
            statement.setTimestamp(18,timestamp);
            statement.setString(19,"Zde je muj novy text");
            statement.setBytes(20,"Zde je String pro Big Data".getBytes());
            statement.execute();
            System.out.println("Podarilo se ulozit data");
        }
        catch (SQLException e) {
            System.out.println("Nepovedlo se ulozit data");
            e.printStackTrace();    }
    }

    private static void vypisemeDatabazi(String s) throws Exception{
        try {
            // gettery v Developer Guide.pdf str. 56
            Statement statement = connect.createStatement();
            ResultSet odpoved = statement.executeQuery("SELECT * FROM "+s+" ORDER BY id");
            System.out.println("Podarilo se ziskat data");
            while(odpoved.next()) {
                System.out.println("VelkeCislo (BIGINT) :"+odpoved.getLong(2));
                System.out.println("Boolean : "+odpoved.getBoolean(3));
                System.out.println("Char : "+odpoved.getString(4));
                System.out.println("Chary pro Bit Data : "+ new String(odpoved.getBytes(5)));
                System.out.println("Datum dnesni : "+ odpoved.getDate(6)+"\t datum nastaveny : "+odpoved.getDate(7));
                System.out.println("Big Decimal : "+ odpoved.getBigDecimal(8));
                System.out.println("Double : "+ odpoved.getDouble(9)+"\tDouble Precision : "+odpoved.getDouble(10));
                System.out.println("Float : "+ odpoved.getFloat(11)+"\tInteger : "+odpoved.getInt(12));
                System.out.println("Long Varchar : "+ odpoved.getString(13)+"\tLong VarChar pro BitDate : "+new String(odpoved.getBytes(14)));
                System.out.println("Real : "+odpoved.getFloat(15)+"\t Short : "+odpoved.getShort(16)+"\tNumeric : "+ odpoved.getBigDecimal(17));
                System.out.println("Time : "+odpoved.getTime(18)+"\tTimestamp : "+odpoved.getTimestamp(19));
                System.out.println("Varchar : "+odpoved.getString(20)+"\t Varchar BitData : "+new String(odpoved.getBytes(21)));
            }
        }
        catch (SQLException e) {
            System.out.println("Nepovedlo se ziskat data :");
            e.printStackTrace();    }
    }

    private static void smazemeTabulku(String s) {
        try {
            statement = connect.prepareStatement("DROP TABLE "+s);
            statement.execute();
            System.out.println("Podarilo se smazat tabulku : "+s);
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("Nepodarilo se smazat tabulku : "+s);
        }
    }

    public static void main(String [] args) throws Exception{
        System.out.println("Start programu");
        pripojeniDatabaze("uzivatel10","heslo10");
        vytvoreniTabulky("DatoveTypy");
        naplneniDatTabulky("DatoveTypy");
        vypisemeDatabazi("DatoveTypy");
        smazemeTabulku("DatoveTypy");
        odpojimeDatabazi();
        System.out.println("Konec programu");
    }
}

Program je veľmi jednoduchý. Najskôr sa prihlási do zvolenej databázy, vytvorí tabuľku so stĺpcami ktorý predstavujú rôzne dátové typy, potom vytvorí dané dátové typy a tie uloží. V ďalšej fáze dátové typy načítame a vypíšeme do konzoly. Tabuľku potom zmažeme.

test programu - DerbyDb

Ako vidíte program prebehol bez chyby. Nabudúce, v lekcii Derby DB - Ukladanie / Získanie súborov , si predvedieme ukladanie súborov (napr. CLOB, BLOB, XML).


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 8x (9.15 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Derby DB - Práva prístupu k databáze - Prístup niekomu
Všetky články v sekcii
DerbyDb
Preskočiť článok
(neodporúčame)
Derby DB - Ukladanie / Získanie súborov
Článok pre vás napísal Robert Michalovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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