Geek tričko zdarma Python týden
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Pouze tento sleva až 80% na kurzy Python

Lekce 14 - Derby DB - Ukládání/získání jednoduchých datových typu

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Derby DB - Práva přístupu k databázi - Přístup někomu, jsme se naučili přidělit práva konkrétnímu uživateli. V tomto DerbyDB tutoriálu si probereme jednoduché datové typy.

Díl to bude jeden z těch jednodušších, protože ukládání/načtení jednoduchých datových typů je skutečně snadné. Je to prakticky pouze o setterech / getterech , které znáte z OOP jako zapouzdření. Někdy bývá problém s formátem syntaxe (jak správně má datový typ vypadat), či jak se má definovat při tvorbě tabulky. Proto jsem vytvořil tento příklad, ve kterém si ukážeme jak se popisuje daný datový typ a jak vypadá. V článku neřeším ukládání s JTA (Java Transaction API) či JPA (Java Perzistence API).

Tato tabulka je velmi povrchní, ale pro většinu implementací postačí. Pokud si chcete prostudovat originální manuál, informace o podporovaných datových typech se nachází v Derby Reference Manual.pdf, v kapitole "Data types" (Datové typy). Během prohlídky datových typů si můžete všimnout že Derby DB má specifické datové typy i pro FOR BIT DATA. Co to je? V případě, že se jedná o FOR BIT DATA datový typ, datový typ se ukládá binárně tzn. ve formě byte hodnot. Pokud je vložená datová hodnota menší než definovaná, zbytek dat se doplní 0x20 byte hodnotou. Uvedu příklad: pokud definujeme CHAR 20 FOR BIT DATA, a vložíme String, jenž bude mít méně než 20 znaků, např. 15 znaků, tak zbývajících 5 znaků se naplní 0x20 byte.

Datový typ Java Syntaxe Datový typ Derby JDBC metatyp(java.sql­.Types) Nejmenší hodnota : Největší 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álně 1 znak maximálně 254 znaků
String java.lang.String CHAR FOR BIT DATA viz. JAVA API minimálně 1 znak maximálně 254 znaků
Date java.sql.Date DATE viz. JAVA API    
BigDecimal java.math.Big­Decimal DECIMAL viz. JAVA API    
double java.lang.Double DOUBLE nebo DOUBLE PRECISION viz. JAVA API java.lang.Dou­ble.MIN_VALUE java.lang.Dou­ble.MAX_VALUE
float java.lang.Float REAL nebo 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álně 1 znak maximálně 32 700 znaků
String java.lang.String LONG VARCHAR FOR BIT DATA viz. JAVA API minimálně 1 znak maximálně 32 700 znaků
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álně 1 znak maximálně 32 672 znaků
String java.lang.String VARCHAR FOR BIT DATA viz. JAVA API minimálně 1 znak maximálně 32 672 znaků

Odkazy jsou na Java 11 API, ale samozřejmě se vždy přepněte na aktuální API.

Pokus o zápis přes IJ

Nejdříve si zas předvedeme zápis přes konfigurační příkaz IJ. Posloupnost příkazů je identická jako vždy. Nejdříve se přihlásíme jako uzivatel10, vytvoříme tabulku a naplníme ji daty. Kvůli zvýšení přehlednosti si v IJ tabulku rozdělíme na 4 tabulky. Tyto tabulky v Java příkladu budou spojené v jednu. Problémem se mohou jevit datové typy FOR BIT DATA. Dané Stringy je nutné převést 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;

Jak vidíte na přiložené konzoli, tak vzorové uložení do tabulky DatoveTypy4 proběhlo v pořádku.

TestIJ

Vytvoření tabulky programově jako uzivatel10

Vytvoříme testovací příklad v Java SE jako projekt v IDE. V menu zvolíme File -> New -> Java Project. Pojmenujeme projekt a nastavíme JRE Java8. Přidáme opět externí knihovny do našeho projektu do CLASSPATH. Jedná se o tyto externí knihovny:

  • derbyclient.jar
  • derby.jar
  • derbytools.jar
  • derbyoptionaltools.jar
Nastavení projektu

V tomto kódu se přihlásíme jako uzivatel10 a vytvoříme tabulku DatoveTypy. Tu naplníme daty a otestujeme získání dat. Cestu k databázi si samozřejmě upravte podle sebe:

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 velmi jednoduchý. Nejdříve se přihlásí do zvolené databáze, vytvoří tabulku se sloupci jenž představují různé datové typy, pak vytvoří dané datové typy a ty uloží. V další fázi datové typy načteme a vypíšeme do konzole. Tabulku pak smažeme.

Test programu

Jak vidíte program proběhl bez chyby. Příště, v lekci Derby DB - Ukládání/Získání souborů, si předvedeme ukládání souborů (např. CLOB, BLOB, XML).


 

Stáhnout

Staženo 5x (9.15 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

 

Článek pro vás napsal Robert Michalovič
Avatar
Jak se ti líbí článek?
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
Předchozí článek
Derby DB - Práva přístupu k databázi - Přístup někomu
Všechny články v sekci
DerbyDb
Miniatura
Následující článek
Derby DB - Ukládání/Získání souborů
Aktivity (2)

 

 

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