Lekce 14 - Derby DB - Ukládání/získání jednoduchých datových typu
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.Long.MIN_VALUE | java.lang.Long.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.BigDecimal | DECIMAL | viz. JAVA API | ||
double | java.lang.Double | DOUBLE nebo DOUBLE PRECISION | viz. JAVA API | java.lang.Double.MIN_VALUE | java.lang.Double.MAX_VALUE |
float | java.lang.Float | REAL nebo FLOAT | viz. JAVA API | java.lang.Float.MIN_VALUE | java.lang.Float.MAX_VALUE |
integer | java.lang.Integer | INTEGER | viz. JAVA API | java.lang.Integer.MIN_VALUE | java.lang.Integer.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.BigDecimal | NUMERIC | viz. JAVA API | ||
short | java.lang.Short | SMALLINT | viz. JAVA API | java.lang.Short.MIN_VALUE | java.lang.Short.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é String
y 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.

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

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.

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).
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 (9.15 kB)
Aplikace je včetně zdrojových kódů v jazyce Java