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.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á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.BigDecimal | DECIMAL | viz. JAVA API | ||
double | java.lang.Double | DOUBLE alebo DOUBLE PRECISION | viz. JAVA API | java.lang.Double.MIN_VALUE | java.lang.Double.MAX_VALUE |
float | java.lang.Float | REAL alebo 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á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.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á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 |
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.
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
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.
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