Úvod do Javy, JDBC a multimediální databáze Marek Rychlý Vysoké uˇcení technické v Brneˇ Fakulta informaˇcních technologií Ústav informaˇcních systému˚
1. demonstraˇcní cviˇcení pro PDB 2. ˇríjen 2015
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
1 / 40
Obsah
1
Java, JDBC a pˇripojení k Oracle Database Úvod do jazyka Java Java Database Connectivity (JDBC)
2
Oracle Multimedia (interMedia) Uložení multimédií Práce s multimédii vˇc. vyhledávání
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
2 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Cíle cviˇcení
Úvod do jazyka Java. Ukázka práce s JDBC, pˇripojení na Oracle Database. Ukázka uložení multimédií v Oracle Multimedia (interMedia). Ukázka práce s multimédii pˇres Oracle JDBC vˇc. vyhledávání. ˇrešení. Diskuze k zadání projektu a zpusobu ˚
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
3 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Platforma Java a její edice Java ME (Micro Edition) – pro zaˇrízení s omezenou kapacitou (napˇr. mobilní zaˇrízení), Java SE (Standard Edition) – pro obecné použití na desktopech a serverech (základní knihovny), Java EE (Enterprise Edition) – rozšíˇrená Java SE o technologie pro vícevrstvé serverové aplikace.
Do Java SE 5 (vývoj. verze 1.5) oznaˇcení edicí J2ME, J2SE a J2EE. Aktuální verze jsou Java SE 8 (vývoj. verze 1.8) a Java EE 7. Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
5 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Vlastnosti jazyka Java ˇ Objektove-orientovaný jazyk, podobneˇ jako C++, ale . . . ˇ ˇ ˇ je zde obstaráno automaticky. Pˇridelování a uvolnování pameti (objekt, na který neexistují reference, muže ˚ být zrušen garbage collectorem)
Nejsou ukazatele, jen hodnoty a reference na objekty. (nelze „ukazovat“ mimo platná data, ale pozor na pˇrístup do neexistujících objektu) ˚
Mechanismus výjimek, runtime chyby je možné odchytit a zpracovat. (výjimky jsou objekty, specializací tˇríd výjimek tvoˇrí hierarchii)
Mechanismus vláken (threads) a jejich synchronizace pomocí monitoru. ˚ ˇ tˇrídy, vytváˇret objekty a provádet ˇ jejich reflexi. Lze dynamicky zavádet Statická typová kontrola (norma IEEE). (stejný výsledek v ruzných ˚ OS, používá Unicode)
Pˇrekládaná se do bytecodu, interpretuje v JVM. ˇ systémových knihovnách, atd.) (nezávislost na HW/OS platforme,
Velké množství standardních knihoven. (GUI, I/O, komunikace s RDBS, práce s textem, s komprimovanými soubory, atd.) Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
6 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Struktura zdrojového souboru package cz . v u t b r . f i t . pdb . demo1 . j a v a ; / / d i r " cz / v u t b r / f i t / pdb / demo1 / j a v a " import j a v a . i o . P r i n t W r i t e r ;
i n t e r f a c e Test { / no m o d i f i e r => package p r i v a t e public i n t t e s t ( P r i n t W r i t e r w r i t e r ) ; }
/
class MyTest implements Test { p r i v a t e S t r i n g getMessage ( ) { / p r i v a t e => c l a s s p r i v a t e / r e t u r n new S t r i n g ( " H e l l o , t h i s i s MyTest . t e s t method ! " ) ; } public i n t t e s t ( P r i n t W r i t e r w r i t e r ) { w r i t e r . p r i n t l n ( t h i s . getMessage ( ) ) ; r e t u r n 123; } }
public class Demo1Java { / / t h e f i l e n a m e should by " Demo1Java . j a v a " public s t a t i c void main ( S t r i n g args [ ] ) { int retVal ; MyTest myTest = new MyTest ( ) ; r e t V a l = myTest . t e s t (new P r i n t W r i t e r ( System . out , t r u e ) ) ; System . e r r . p r i n t l n ( " MyTest . t e s t r e t u r n s " + r e t V a l ) ; } } Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
7 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
ˇ Pˇreklad zdrojového souboru a spuštení 1
Pˇrepnout se do adresáˇre, kde zaˇcíná cesta podle balíku. (napˇr. cd ./PDB/Demo1)
2
Pˇreložit zdrojové soubory na bytecode. (javac -classpath . cz/vutbr/fit/pdb/demo1/java/Demo1Java.java)
3
Spustit bytecode tˇrídy s metodou main(...). (java -classpath . cz.vutbr.fit.pdb.demo1.java.Demo1Java)
Pˇredchozí pˇríklad: $ j a v a c c l a s s p a t h . cz / v u t b r / f i t / pdb / demo1 / j a v a / Demo1Java . j a v a $ j a v a c l a s s p a t h . cz . v u t b r . f i t . pdb . demo1 . j a v a . Demo1Java H e l l o , t h i s i s MyTest . t e s t method ! MyTest . t e s t r e t u r n s 123
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
8 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Jazyk Java Operátory jako v C++ (ale pouze rozšiˇrující auto-pˇretypování)
Programové struktury jako v C++ (if, switch, for, do, while, break, continue, return, try, catch, finally, throw, synchronized)
Datové typy . . . objektové (tˇrídy) (Integer, String, InputStream, Image, . . . )
nebo jednoduché (byte, short, int, long, char (Unicode), float, double, boolean)
Pole: int[][][] pole = new int[10][5][]; Klíˇcová slova pro . . . objekty: new, null, this, super tˇrídy a rozhraní: class, interface, implements, abstract omezení pˇrístupu: private, protected, public omezení platnosti: static, final atd. Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
9 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Konvence pro zdrojový kód v Javeˇ Správné názvy a koncovky zdrojových souboru, ˚ obsah v UTF-8. (Java source *.java vs. bytecode *.class, balíky cz.vutbr.fit.pdb. . . )
Zarovnání kódu s každým blokem {...} nebo zalomením ˇrádku. (odsazovat o tabulátor, pˇrípadneˇ 4 nebo 8 mezer)
Správná velikost písmen v názvech identifikátoru. ˚ ˇ balíky – jen malá písmena, složená jména oddeleny teˇckou (napˇr. java.io, cz.vutbr.fit.pdb.demo1)
tˇrídy, rozhraní a konstruktory – slova zaˇcínají velkým písmenem (napˇr. String, StringBuffer)
ˇ metody a promenné – první slovo zaˇcíná malým, další velkým pís. (napˇr. reader, getSize(), myWidth)
ˇ konstanty – jen velká písmena, složená jména oddeleny „_“ (napˇr. MIN_WIDTH, . . . ; deklarovat jako static final)
Strukturované komentáˇre pro JavaDoc. (napˇr. @param nazev komentar, @return komentar, @throws trida komentar, @author jmeno, @version oznaceni; komentáˇr uvodit /** . . . ) Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
10 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Literatura k Javeˇ
ˇ Kotala, Petr Toman: Java. Zdenek http://janoud.cz/sub/vyuka/java/javazcun.htm
Bruce Eckel: Thinking in Java. ISBN 0131872486 http://mindview.net/Books/TIJ4
Oracle: Java SE Documentation. http://www.oracle.com/technetwork/java/javase/documentation/
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
11 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Java Database Connectivity (JDBC)
Aplikaˇcní API pro volání SQL pˇríkazu˚ a dotazu. ˚ (unifikovaný pˇrístup k databázím)
Pro pˇrístup k databázi z Java SE/EE aplikace. Pro konkrétní databázi je potˇreba JDBC ovladaˇc. (pro vytvoˇrení spojení, pro dotazy a data specifické pro danou databázi)
JDBC API je nezávislé na konkrétním systému ˇrízení báze dat. (problém s kompatibilitou muže ˚ být na úrovni jazyka SQL)
Nejen pro pˇrístup k RDBS, ale k libovolným „sloupcovým“ datum. ˚ (napˇr. tabulkové soubory, textové soubory, atd.)
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
12 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Struktura zdrojového souboru s JDBC I package cz . v u t b r . f i t . pdb . demo1 . j d b c ; import import import import import
o r a c l e . j d b c . p o o l . OracleDataSource ; j a v a . s q l . Connection ; j a v a . s q l . Statement ; java . sql . ResultSet ; j a v a . s q l . SQLException ;
class Demo1JDBC { public s t a t i c void main ( S t r i n g args [ ] ) { try { / / c r e a t e a OracleDataSource i n s t a n c e OracleDataSource ods = new OracleDataSource ( ) ; ods . setURL ( " j d b c : o r a c l e : t h i n : @gort . f i t . v u t b r . cz : 1 5 2 1 : d b g o r t " ) ; ods . setUser ( System . g e t P r o p e r t y ( " l o g i n " ) ) ; ods . setPassword ( System . g e t P r o p e r t y ( " password " ) ) ; / / connect t o t h e database Connection conn = ods . getConnection ( ) ; try { / / c r e a t e a Statement Statement s t m t = conn . c r e a t e S t a t e m e n t ( ) ; try { / / s e l e c t something from t h e system ’ s d u a l t a b l e R e s u l t S e t r s e t = s t m t . executeQuery ( Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
13 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Struktura zdrojového souboru s JDBC II " s e l e c t 1+2 as col1 , 3 4 as c o l 2 from d u a l " ) ; try { / / i t e r a t e t h r o u g h t h e r e s u l t and p r i n t t h e v a l u e s while ( r s e t . n e x t ( ) ) { System . o u t . p r i n t l n ( " c o l 1 : ’ " + r s e t . g e t S t r i n g ( 1 ) + " ’\ tcol2 : ’ " + rset . getString (2) + " ’ " ) ; } } finally { r s e t . close ( ) ; / / close the ResultSet } } finally { s t m t . c l o s e ( ) ; / / c l o s e t h e Statement } } finally { conn . c l o s e ( ) ; / / c l o s e t h e c o n n e c t i o n } } catch ( SQLException sqlEx ) { System . e r r . p r i n t l n ( " SQLException : " + sqlEx . getMessage ( ) ) ; } } }
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
14 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
ˇ Pˇreklad s JDBC a spuštení 1
Získat ovladaˇc JDBC pro Oracle Database 12c pro Java 7/8. (http://www.oracle.com/technetwork/database/features/jdbc/ default-2280470.html)
2
ˇ Ovladaˇc pˇridat do CLASSPATH pro pˇreklad a spuštení. (javac -classpath .:./lib/ojdbc7.jar. . . )
3
V kódu odchytávat výjimky, uvolnit všechny alokované prostˇredky a uzavˇrít otevˇrená spojení. (pomocí catch a finally)
Pˇredchozí pˇríklad: $ j a v a c c l a s s p a t h . : . / l i b / ojdbc7 . j a r \ cz / v u t b r / f i t / pdb / demo1 / j d b c / Demo1JDBC . j a v a $ j a v a c l a s s p a t h . : . / l i b / ojdbc7 . j a r \ D l o g i n =xnovak99 Dpassword= \ cz . v u t b r . f i t . pdb . demo1 . j d b c . Demo1JDBC col1 : ’3 ’ col2 : ’ 1’
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
15 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Transakce a pˇríprava dotazu˚ ˇ ruˇcne. ˇ Je možno vypnout automatické ukonˇcení transakcí a delat (conn.setAutoCommit(false) a následneˇ conn.commit())
U transakcí je možno vytváˇret záchytné body. . . (napˇr. Savepoint svpt1 = conn.setSavepoint("SP1"))
. . . a následneˇ se k bodum ˚ vracet. (napˇr. conn.rollback(svpt1))
ˇ Je možno pˇredpˇripravit dotaz a pak doplnovat hodnoty. (zabrání útokum ˚ typu SQL injection) S t r i n g updateSQL = " update COFFEES s e t SALES = ? where COF_NAME l i k e ? " ; PreparedStatement pstmt = conn . prepareStatement ( updateSQL ) ; pstmt . s e t I n t ( 1 , 7 5 ) ; pstmt . s e t S t r i n g ( 2 , " Colombian " ) ; pstmt . executeUpdate ( ) ; pstmt . c l o s e ( ) ;
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
16 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Úvod do jazyka Java Java Database Connectivity (JDBC)
Literatura JDBC na Oracle Database
Trail: JDBC Database Access. http://download.oracle.com/javase/tutorial/jdbc/
JDK 7 JDBC-related APIs & Developer Guides. http://download.oracle.com/javase/7/docs/technotes/guides/jdbc/
Jan Šeda: Úvod do JDBC. Interval.cz. http://interval.cz/clanky/uvod-do-jdbc/
JDBC – FI WIKI. http://kore.fi.muni.cz/wiki/index.php/JDBC
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
17 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Oracle Multimedia (interMedia) Podpora pro správu multimediálních dat. ˇ tradiˇcních databázových systému˚ (doplnek
) post-relaˇcní databáze)
ˇ Zaruˇcují konzistenci, soubežnost, integritu. (nutné pro bezpeˇcnost a dostupnost dat)
Manipulace s multimediálními daty. ˇ (zmena velikosti obrázku, ˚ transformace, atp.)
Dotazování a získávání relevantních informací z velkých kolekcí dat. (dle popisu, dle multimediálního obsahu, dle vlastností objektu) ˚
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
19 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Oracle Multimedia – architektura
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
20 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Multimediální data v Oracle A) Nestrukturovaná multimédia (typy sloupcu, ˚ v prostoru ORDSYS): OrdImage – obrázková data ˇ formát souboru a obsahu, komprese; vˇc. metod pro manipulaci) (rozmery,
SI_StillImage – obrázková data, SQL/MM Still Image standard (pro dotazování na obsah, tzv. „image matching“; bez manipulace)
OrdAudio – audio data (kódování, poˇcet kanálu, ˚ velikost a frekvence vzorku, ˚ typ komprese, délka)
OrdVideo – video data ˇ rozlišení a poˇcet snímku, (rozmery, ˚ délka, komprese, poˇcet barev, bit-rate)
OrdDoc – libovolné multimédia (text, obrázek, audio a video)
B) Meta-data k multimediálním datum. ˚ (Exif, ID3, DICOM, MPEG-7, . . . )
ˇ Podporuje vetšinu formátu˚ (JPEG, MPEG, QT, RM, . . . ). Manipulace, zpracování obrazu, komprese, . . . Rozšiˇritelné o práci s medicínskými daty, zpracování ˇreˇci, atd. Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
21 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
SQL/MM Still Image Standard Standard „ISO/IEC 13249-5:2001 SQL MM Part5: StillImage“. ˇ OrdImageSignature je od Oracle 11g zavržen) (zaveden v Oracle 10g, dˇrívejší
ˇ Umožnuje uložit obrázek z dat typu BLOB do dat typu SI_StillImage. (z takových dat lze získat SI_... funkcemi výšku, šíˇrku cˇ i formát obrázku, BLOB ˇ u) obsah cˇ i SI_StillImage náhled daných rozmer ˚
Poskytuje SI_... objekty zachycující charakteristiku obrázku: ˇ SI_AverageColor prum ˚ erná (celková) barva obrázku SI_ColorHistogram histogram (statistické rozložení) barev obrázku ˇ (nejvýznamnejších) ˇ SI_PositionalColor umístení barev v obrázku ˇ v obrázku SI_Texture opakující se vzory, variace kontrastu a smery Možno sestavit objekt SI_FeatureList kombinující výše uvedené charakteristiky obrázku s danými vahami (váhy 0,0 až 1,0 pro každou). Funkce SI_ScoreByFtrList vyhodnotí, jak pasuje daná kombinace charakteristik SI_FeatureList na daný obrázek SI_StillImage. (používá se pro hledání podobných obrázku, ˚ jak bude popsáno dále)
Databáze neumí úpravy SI_StillImage obrázku a nenabízí Java API. ˇ velikost, atp.) (na rozdíl od obrázku˚ v OrdImage, které lze otáˇcet, menit Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
22 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Tvorba tabulky obrázku˚ a generování charakteristik DROP TABLE p r o d u c t s ; CREATE TABLE p r o d u c t s ( i d i n t e g e r primary key , photo ORDSYS. ORDImage , photo_ac ORDSYS. SI_AverageColor , photo_pc ORDSYS. S I _ P o s i t i o n a l C o l o r , );
p h o t o _ s i ORDSYS. S I _ S t i l l I m a g e , photo_ch ORDSYS. SI_ColorHistogram , p h o t o _ t x ORDSYS. S I _ T e x t u r e
CREATE OR REPLACE PROCEDURE p r o d u c t s _ g e n e r a t e F e a t u r e s IS cursor c i s select from p r o d u c t s f o r update ; s i ORDSYS. S I _ S t i l l I m a g e ; BEGIN f o r cp i n c l o o p s i : = new S I _ S t i l l I m a g e ( cp . photo . g e t C o n t e n t ( ) ) ; update p r o d u c t s p set p h o t o _ s i = s i , photo_ac = SI_AverageColor ( s i ) , photo_ch = SI_ColorHistogram ( s i ) , photo_pc = S I _ P o s i t i o n a l C o l o r ( s i ) , photo_tx = SI_Texture ( s i ) where p . i d = cp . i d ; end l o o p ; END; /
1 2 3
ˇ Získáme obrázek a jeho charakteristiky do promenných pomocí select ...for update. Použijeme konstruktory objektu˚ SI_... na BLOB obrázku. ˇ do tabulky k danému obrázku. Uložíme takto získané charakteristiky zpet
(napˇr. pomocí products_generateFeatures, ale lepší pˇrímo v Javeˇ pˇri vkládání obrázku) ˚ Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
23 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Práce s objekty Oracle Multimedia v Javeˇ ORDSYS.ORDImage (DB) vs. oracle.ord.im.OrdImage (Java) objekt: OrdImage je Java objekt. OrdImage je proxy pro databázový objekt. OrdImage musí být vytvoˇreno z db. ORDSYS.ORDImage. ˇ do databáze) (všechny operace s objektem jsou pˇrevádeny
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
24 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Vkládání obrázku˚ v Javeˇ I package cz . v u t b r . f i t . pdb . demo1 .mm; import import import import import
o r a c l e . j d b c . p o o l . OracleDataSource ; java . sql . ; oracle . jdbc . ; o r a c l e . ord . im . ; j a v a . i o . IOException ;
class Demo1MmInsert { public s t a t i c void main ( S t r i n g args [ ] ) throws IOException , SQLException { / / c r e a t e a OracleDataSource i n s t a n c e OracleDataSource ods = new OracleDataSource ( ) ; ods . setURL ( " j d b c : o r a c l e : t h i n : @gort . f i t . v u t b r . cz : 1 5 2 1 : d b g o r t " ) ; ods . setUser ( System . g e t P r o p e r t y ( " l o g i n " ) ) ; ods . setPassword ( System . g e t P r o p e r t y ( " password " ) ) ; / / connect t o t h e database Connection conn = ods . getConnection ( ) ; conn . setAutoCommit ( f a l s e ) ; / / f o r a l l p i c t u r e s car1 . j p g . . . car4 . j p g f o r ( i n t i d = 1 ; i d <= 4 ; i d ++) {
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
25 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Vkládání obrázku˚ v Javeˇ II / / i n s e r t a new r e c o r d w i t h an empty ORDImage o b j e c t Statement stmt1 = conn . c r e a t e S t a t e m e n t ( ) ; S t r i n g insertSQL = " i n s e r t i n t o p r o d u c t s ( i d , photo ) v a l u e s " + " ( " + i d + " , ordsys . ordimage . i n i t ( ) ) " ; stmt1 . executeUpdate ( insertSQL ) ; stmt1 . c l o s e ( ) ; / / r e t r i e v e t h e p r e v i o u s l y c r e a t e d ORDImage o b j e c t f o r f u t u r e u p d a t i n g Statement stmt2 = conn . c r e a t e S t a t e m e n t ( ) ; S t r i n g selSQL = " s e l e c t photo from p r o d u c t s where i d = " + i d + " f o r update " ; O r a c l e R e s u l t S e t r s e t = ( O r a c l e R e s u l t S e t ) stmt2 . executeQuery ( selSQL ) ; r s e t . next ( ) ; OrdImage imgProxy = ( OrdImage ) r s e t . getORAData ( " photo " , OrdImage . getORADataFactory ( ) ) ; r s e t . close ( ) ; stmt2 . c l o s e ( ) ; / / l o a d t h e media data from a f i l e t o t h e ORDImage Java o b j e c t imgProxy . loadDataFromFile ( " . / c a r " + i d + " . j p g " ) ; / / s e t t h e p r o p e r t i e s o f t h e Oracle Mm o b j e c t from t h e Java o b j e c t imgProxy . s e t P r o p e r t i e s ( ) ; / / update t h e t a b l e w i t h ORDImage Java o b j e c t ( data a l r e a d y loaded ) S t r i n g updateSQL1 = " update p r o d u c t s s e t " + " photo =? where i d = " + i d ; Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
26 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Vkládání obrázku˚ v Javeˇ III OraclePreparedStatement pstmt = ( OraclePreparedStatement ) conn . prepareStatement ( updateSQL1 ) ; pstmt . setORAData ( 1 , imgProxy ) ; pstmt . executeUpdate ( ) ; pstmt . c l o s e ( ) ; / / update t h e t a b l e w i t h S t i l l I m a g e o b j e c t and f e a t u r e s Statement stmt3 = conn . c r e a t e S t a t e m e n t ( ) ; S t r i n g updateSQL2 = " update p r o d u c t s p s e t " + " p . p h o t o _ s i = S I _ S t i l l I m a g e ( p . photo . g e t C o n t e n t ( ) ) where i d = " + i d ; stmt3 . executeUpdate ( updateSQL2 ) ; S t r i n g updateSQL3 = " update p r o d u c t s p s e t " + " p . photo_ac=SI_AverageColor ( p . p h o t o _ s i ) , " + " p . photo_ch= SI_ColorHistogram ( p . p h o t o _ s i ) , " + " p . photo_pc= S I _ P o s i t i o n a l C o l o r ( p . p h o t o _ s i ) , " + " p . p h o t o _ t x = S I _T e x t u r e ( p . p h o t o _ s i ) where i d = " + i d ; stmt3 . executeUpdate ( updateSQL3 ) ; stmt3 . c l o s e ( ) ; conn . commit ( ) ; / / commit t h e t h r a n s a c t i o n } conn . c l o s e ( ) ; / / c l o s e t h e c o n n e c t i o n } }
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
27 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
ˇ Pˇreklad s Oracle Multimedia a spuštení
1
Z webu cviˇcení stáhnout knihovny ordmi.jar a runtime12.jar. (https://www.fit.vutbr.cz/homes/rychly/private/pdb/lib/ oracle.ordim/ordim.jar a .../runtime12.jar)
2
ˇ Knihovny pˇridat do CLASSPATH pro pˇreklad a spuštení. (javac -classpath ...:./lib/ordim.jar:./lib/runtime12.jar. . . )
Pˇredchozí pˇríklad: $ j a v a c c l a s s p a t h . : . / l i b / ojdbc7 . j a r : . / l i b / ordim . j a r \ cz / v u t b r / f i t / pdb / demo1 /mm/ Demo1MmInsert . j a v a $ j a v a c l a s s p a t h . : . / l i b / ojdbc7 . j a r : . / l i b / ordim . j a r : . / l i b / runtime12 . j a r \ D l o g i n =xnovak99 Dpassword= \ cz . v u t b r . f i t . pdb . demo1 .mm. Demo1MmInsert
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
28 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Získávání multimédií z databáze a jejich vlastnosti I package cz . v u t b r . f i t . pdb . demo1 .mm; import import import import import
o r a c l e . j d b c . p o o l . OracleDataSource ; java . sql . ; oracle . jdbc . ; o r a c l e . ord . im . ; j a v a . i o . IOException ;
class Demo1MmProp { public s t a t i c void main ( S t r i n g args [ ] ) throws IOException , SQLException { / / c r e a t e a OracleDataSource i n s t a n c e OracleDataSource ods = new OracleDataSource ( ) ; ods . setURL ( " j d b c : o r a c l e : t h i n : @gort . f i t . v u t b r . cz : 1 5 2 1 : d b g o r t " ) ; ods . setUser ( System . g e t P r o p e r t y ( " l o g i n " ) ) ; ods . setPassword ( System . g e t P r o p e r t y ( " password " ) ) ; / / connect t o t h e database Connection conn = ods . getConnection ( ) ; / / c r e a t e a JDBC s t a t e m e n t t o s e l e c t ODRImage o b j e c t s from db . Statement s t m t = conn . c r e a t e S t a t e m e n t ( ) ; / / execute t h e query and o b t a i n t h e r e s u l t s e t O r a c l e R e s u l t S e t r s e t = ( O r a c l e R e s u l t S e t ) s t m t . executeQuery ( " s e l e c t i d , photo from p r o d u c t s " ) ; Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
29 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Získávání multimédií z databáze a jejich vlastnosti II / / r e t r i e v e t h e ORDImage o b j e c t s from t h e r e s u l t s e t while ( r s e t . n e x t ( ) ) { int id = rset . getInt ( " id " ) ; OrdImage imgProxy = ( OrdImage ) r s e t . getORAData ( " photo " , OrdImage . getORADataFactory ( ) ) ; / / r e t r i e v e t h e media a t t r i b u t e s i n t h e i g h t = imgProxy . g e t H e i g h t ( ) ; i n t w i d t h = imgProxy . getWidth ( ) ; System . o u t . p r i n t l n ( " Photo " + i d + " : " + h e i g h t + " x " + w i d t h ) ; / / w r i t e t h e media t o d i s k imgProxy . g e t D a t a I n F i l e ( " . / c a r " + i d + " o u t . j p g " ) ; } / / c l o s e t h e r e s u l t s e t and t h e query r s e t . close ( ) ; stmt . close ( ) ; conn . c l o s e ( ) ;
/ / close the connection
} }
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
30 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
ˇ pˇríkladu pro získání z databáze Pˇreklad a spuštení Do databáze pˇredchozím pˇríkladem nahrány následující obrázky:
1
2
3
4
ˇ pˇríkladu: Pˇreklad a spuštení $ j a v a c c l a s s p a t h . : . / l i b / ojdbc7 . j a r : . / l i b / ordim . j a r \ cz / v u t b r / f i t / pdb / demo1 /mm/ Demo1MmProp . j a v a $ j a v a c l a s s p a t h . : . / l i b / ojdbc7 . j a r : . / l i b / ordim . j a r : . / l i b / runtime12 . j a r \ D l o g i n =xnovak99 Dpassword= \ cz . v u t b r . f i t . pdb . demo1 .mm. Demo1MmProp Photo 1 : 371x600 Photo 2 : 374x600 Photo 3 : 378x600 Photo 4 : 377x600
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
31 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Operace s multimédii v databázi pˇres Java proxy I package cz . v u t b r . f i t . pdb . demo1 .mm; import import import import import
o r a c l e . j d b c . p o o l . OracleDataSource ; java . sql . ; oracle . jdbc . ; o r a c l e . ord . im . ; j a v a . i o . IOException ;
class Demo1MmConvert { public s t a t i c void main ( S t r i n g args [ ] ) throws IOException , SQLException { / / c r e a t e a OracleDataSource i n s t a n c e OracleDataSource ods = new OracleDataSource ( ) ; ods . setURL ( " j d b c : o r a c l e : t h i n : @gort . f i t . v u t b r . cz : 1 5 2 1 : d b g o r t " ) ; ods . setUser ( System . g e t P r o p e r t y ( " l o g i n " ) ) ; ods . setPassword ( System . g e t P r o p e r t y ( " password " ) ) ; / / connect t o t h e database Connection conn = ods . getConnection ( ) ; conn . setAutoCommit ( f a l s e ) ; / / i n s e r t a new r e c o r d w i t h an empty ORDImage o b j e c t Statement stmt1 = conn . c r e a t e S t a t e m e n t ( ) ; S t r i n g insertSQL = " i n s e r t i n t o p r o d u c t s ( i d , photo ) v a l u e s " + " ( 5 , ordsys . ordimage . i n i t ( ) ) " ; Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
32 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Operace s multimédii v databázi pˇres Java proxy II stmt1 . executeUpdate ( insertSQL ) ; stmt1 . c l o s e ( ) ; / / r e t r i e v e t h e p r e v i o u s l y c r e a t e d ORDImage o b j e c t f o r u p d a t i n g Statement stmt2 = conn . c r e a t e S t a t e m e n t ( ) ; S t r i n g selSQL1 = " s e l e c t photo from p r o d u c t s where i d = 5 f o r update " ; O r a c l e R e s u l t S e t r s e t 1 = ( O r a c l e R e s u l t S e t ) stmt2 . executeQuery ( selSQL1 ) ; rset1 . next ( ) ; OrdImage dstImgProxy = ( OrdImage ) r s e t 1 . getORAData ( " photo " , OrdImage . getORADataFactory ( ) ) ; rset1 . close ( ) ; stmt2 . c l o s e ( ) ; / / r e t r i e v e ORDImage o b j e c t o f a source image Statement stmt3 = conn . c r e a t e S t a t e m e n t ( ) ; S t r i n g selSQL2 = " s e l e c t photo from p r o d u c t s where i d = 1 " ; O r a c l e R e s u l t S e t r s e t 2 = ( O r a c l e R e s u l t S e t ) stmt3 . executeQuery ( selSQL2 ) ; rset2 . next ( ) ; OrdImage srcImgProxy = ( OrdImage ) r s e t 2 . getORAData ( " photo " , OrdImage . getORADataFactory ( ) ) ; rset2 . close ( ) ; stmt3 . c l o s e ( ) ; / / perform c o n v e r s i o n ( p r o c e s s i n g occurs on t h e Oracle Database ) srcImgProxy . processCopy ( " maxscale=100 100 f i l e f o r m a t =png " , dstImgProxy ) ; Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
33 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Operace s multimédii v databázi pˇres Java proxy III / / save t h e t a r g e t image OraclePreparedStatement pstmt = ( OraclePreparedStatement ) conn . prepareStatement ( " update p r o d u c t s s e t photo =? where i d = 5 " ) ; pstmt . setORAData ( 1 , dstImgProxy ) ; pstmt . executeUpdate ( ) ; pstmt . c l o s e ( ) ; / / update t h e t a r g e t image w i t h S t i l l I m a g e o b j e c t and f e a t u r e s Statement stmt4 = conn . c r e a t e S t a t e m e n t ( ) ; S t r i n g updateSQL1 = " update p r o d u c t s p s e t " + " p . p h o t o _ s i = S I _ S t i l l I m a g e ( p . photo . g e t C o n t e n t ( ) ) where i d = 5 " ; stmt4 . executeUpdate ( updateSQL1 ) ; S t r i n g updateSQL2 = " update p r o d u c t s p s e t " + " p . photo_ac=SI_AverageColor ( p . p h o t o _ s i ) , " + " p . photo_ch= SI_ColorHistogram ( p . p h o t o _ s i ) , " + " p . photo_pc= S I _ P o s i t i o n a l C o l o r ( p . p h o t o _ s i ) , " + " p . p h o t o _ t x = S I _ T e x t u r e ( p . p h o t o _ s i ) where i d = 5 " ; stmt4 . executeUpdate ( updateSQL2 ) ; stmt4 . c l o s e ( ) ; dstImgProxy . g e t D a t a I n F i l e ( " . / car5 o u t . png " ) ; conn . commit ( ) ; conn . c l o s e ( ) ; / / commit and c l o s e t h e c o n n e c t i o n }
}
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
34 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
ˇ pˇríkladu pro operace Pˇreklad a spuštení Databáze transformuje a pˇrekonvertuje první obrázek:
)
1
5
ˇ pˇríkladu: Pˇreklad a spuštení $ j a v a c c l a s s p a t h . : . / l i b / ojdbc7 . j a r : . / l i b / ordim . j a r \ cz / v u t b r / f i t / pdb / demo1 /mm/ Demo1MmConvert . j a v a $ j a v a c l a s s p a t h . : . / l i b / ojdbc7 . j a r : . / l i b / ordim . j a r : . / l i b / runtime12 . j a r \ D l o g i n =xnovak99 Dpassword= \ cz . v u t b r . f i t . pdb . demo1 .mm. Demo1MmConvert
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
35 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
JDBC a ostatní multimédia z Oracle Database ˇ jako s OrdImage: S dalšími typy multimédií pracujeme podobne, OrdImage imgProxy = ( OrdImage ) r s e t . getORAData ( " pr od uc t _p ho to " , OrdImage . getORADataFactory ( ) ) ; OrdAudio audProxy = ( OrdAudio ) r s e t . getORAData ( " p r o d u c t _ a u d i o " , OrdAudio . getORADataFactory ( ) ) ; OrdVideo v i d P r o x y = ( OrdVideo ) r s e t . getORAData ( " p r o d u c t _ v i d e o " , OrdVideo . getORADataFactory ( ) ) ; OrdDoc docProxy = ( OrdDoc ) r s e t . getORAData ( " p r o d u c t _ t e s t i m o n i a l s " , OrdDoc . getORADataFactory ( ) ) ;
Jednotlivé typy mají specifické vlastnosti: S t r i n g audFormat = audProxy . getFormat ( ) ; S t r i n g vidMimetype = v i d P r o x y . getMimeType ( ) ;
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
36 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Podobnostní vyhledávání Podobnost obrázku˚ lze zjistit voláním SI_ScoreByFtrList. (starší zpusob ˚ pˇres OrdImageSignature v Oracle 11g nefunguje)
Podobnost lze zjišt’ovat pouze pro obrázky v SI_StillImage. (pokud není k dispozici, tak vytvoˇrit konstruktorem SI_StillImage z OrdImage, resp. z BLOBu získaného pomocí ...source.localData)
Podobnost mezi obrázkem a charakteristikami dalšího obrázku. (charakteristiky možno generovat v dotazu, ale rychlejší z pˇred-pˇripravených)
Pˇríklad: SELECT s r c . i d as source , d s t . i d as d e s t i n a t i o n , S I _ S c o r e B y F t r L i s t ( new S I _ F e a t u r e L i s t ( s r c . photo_ac , 0 . 3 , s r c . photo_ch , 0 . 3 , s r c . photo_pc , 0 . 1 , s r c . photo_tx , 0 . 3 ) , d s t . p h o t o _ s i ) as s i m i l a r i t y FROM p r o d u c t s src , p r o d u c t s d s t WHERE s r c . i d <> d s t . i d AND s r c . i d = 1 ORDER BY s i m i l a r i t y ASC;
Výsledek: 1 Marek Rychlý
) 3(8.02)
, 4(12.25)
, 2(13.83)
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
. 37 / 40
Java, JDBC a pˇripojení k Oracle Database Oracle Multimedia (interMedia)
Uložení multimédií Práce s multimédii vˇc. vyhledávání
Literatura Oracle Multimedia
Oracle Multimedia Application Development. http://docs.oracle.com/database/121/IMURG/ch_appdev.htm#IMURG2000
Oracle interMedia User’s Guide – Application Development. http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14302/ch_ websrvtier.htm
Oracle Multimedia Sample Applications. http://docs.oracle.com/database/121/IMURG/ap_demos.htm#IMURG10000
ˇ David Krch: Oracle a multimédia?. Databázový svet. http://www.dbsvet.cz/view.php?cisloclanku=2005072902
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
38 / 40
FAQ ˇ Podekování a otázky
FAQ I 1
ˇ ho zavírat? Je nutno pˇred každým dotazem otevírat spojení a po nem (Rozhodneˇ to není nutné a ani doporuˇcované. Je dobré mít v aplikaci stále otevˇrené spojení, napˇr. ho otevˇrít po pˇrihlášení uživatele, a to používat. U serverových aplikací se dokonce vytváˇrí množina otevˇrených spojení, tvz. „pool“, a ty se postupneˇ recyklují.)
2
Proˇc se musí vždy nejprve získat z databáze (i prázdný) obrázek a pak, ˇ po naˇctení souboru v Javeˇ nebo provedení operací do databáze zpet ukládat? Vždyt’ je první krok zbyteˇcný. ˇ (Uvedomte si, že v Javeˇ pracujeme pouze s proxy na obrázek, který je ve skuteˇcnosti v databázi. Proto je nutno ho v té databázi nejprve inicializovat – ˇ cném vytvoˇrit databázový objekt, který však bude uložen do tabulky až pˇri závereˇ „update“.)
3
Jak urˇcíme prahovou hodnotu pro funkci SI_ScoreByFtrList? A jak správneˇ nastavit váhy? ˇ nad vhodnými testovacími daty.) (Obojí se nejlépe urˇcí experimentálne,
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
39 / 40
FAQ ˇ Podekování a otázky
ˇ Dekuji za pozornost.
Otázky? Diskuze?
Marek Rychlý
Úvod do Javy, JDBC a multimediální databáze — 1. demonstraˇcní cviˇcení pro PDB, 2. ˇríjen 2015
40 / 40