JAVA
JDBC
Java, letní semestr 2016 11.4.2016
Přehled ● ●
rozhraní pro přístup k relační databázi jednotné –
nezávislé na databázi ●
●
umožňuje – –
vykonávání SQL dotazů přístup k výsledkům dotazů ●
●
podobné reflection API
balíky –
●
výrobce databáze musí dodat JDBC driver
java.sql, javax.sql
verze
– JDK 1.1 – JDK 1.2 – JDK 1.4 – JDK 6 – JDK 7 Java, letní–semestr JDK2016 8 11.4.2016
– JDBC 1.0 – JDBC 2.0 – JDBC 3.0 – JDBC 4.0 – JDBC 4.1 – JDBC 4.2
JDBC Driver ●
JDBC API – –
●
driver – –
●
v podstatě jen rozhraní implementace dodána přes driver explicitně natáhnout a zaregistrovat Class.forName("com.driver.Name");
po natažení driveru, vytvořit připojení na DB – –
Connection con = DriverManager.getConnection(url, "myLogin", "myPassword"); url ● ●
jdbc:mysql://localhost/test jdbc:odbc:source
Java, letní semestr 2016 11.4.2016
JDBC Driver ●
typy driveru – – – –
Native-protocol pure Java driver Native-API partly-Java driver JDBC-Net pure Java driver JDBC-ODBC bridge plus ODBC driver
Java, letní semestr 2016 11.4.2016
Základní třídy a rozhraní ●
DriverManager – třída – –
všechny metody jsou statické getConnection() ●
–
getDrivers() ●
– –
všechny natažené drivery
getLogWriter(), setLogWriter() println() ●
–
několik variant
zapis do logu
getLoginTimeout(), setLoginTimeout()
Java, letní semestr 2016 11.4.2016
Základní třídy a rozhraní ●
Connection – interface –
●
vytváření a vykonávání dotazů
ResultSet – interface –
výsledky dotazu
Java, letní semestr 2016 11.4.2016
Základní příklad Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/test", "",""); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM test"); while (rs.next()) { // zpracování výsledků po řádcích } stmt.close(); con.close();
Java, letní semestr 2016 11.4.2016
Přístup k výsledkům ●
podbné reflection API – – –
getString(), getInt(),... pracuje se nad aktuálním řádkem identifikace sloupce pomocí ● ●
jména pořadí
ResultSet rs = stmt.executeQuery("SELECT ID, NAME FROM TEST"); while (rs.next()) { int id = rs.getInt("ID"); String s = rs.getString("STRING"); System.out.println(id + " " + s); } Java, letní semestr 2016 11.4.2016
Přístup k výsledkům ●
ResultSet.next() –
●
musí být zavoláno i na první řádek
getString() –
lze volat na všechny typy ●
–
nelze na nové SQL3 typy
automatická konverze na String
Java, letní semestr 2016 11.4.2016
Dotazy ●
Connection.createStatement() –
●
Statement.executeQuery("....") – –
●
vytvoření dotazu ("prázdného") pro dotazy vracející vysledky (SELECT) výsledky přes ResultSet
Statement.executeUpdate("...") –
pro dotazy nevracející výsledky ● ● ●
UPDATE CREATE TABLE …
Java, letní semestr 2016 11.4.2016
PreparedStatement ●
PreparedStatement – – –
interface dědí od Statement předpřipravený dotaz s parametry ●
–
vyplní se před použitím
metody ● ●
setType(int index, type v) clearParameters()
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); pstmt.setBigDecimal(1, 153833.00) pstmt.setInt(2, 110592) Java, letní semestr 2016 11.4.2016
Transakce ●
implicitně – auto-commit mód –
●
commit se provede po každé změně
auto-commit lze zrušit
con.setAutoCommit(false); // // posloupnost změn // con.commit(); // nebo con.rollBack() con.setAutoCommit(true);
Java, letní semestr 2016 11.4.2016
Callable Statements ● ●
pro přístup k uloženým procedurám dědí od PreparedStatement –
nastavení parametrů ●
–
návratový typ nutno zaregistrovat ●
–
setType(int index, type v) registerOutParameter(int index, int sqlType)
formát a) b)
{?= call <procedure-name>[<arg1>,<arg2>, …]} {call <procedure-name>[<arg1>,<arg2>, …]}
CallableStatement cs = con.prepareCall("{call SHOW_SUPPLIERS}"); ResultSet rs = cs.executeQuery(); Java, letní semestr 2016 11.4.2016
Ošetření chyb ●
SQLException – –
a její potomci String getSQLState() ●
–
int getErrorCode() ●
●
definováno X/Open specifický pro konkrétní databázi
varování (warnings) – – –
SQLWarning není to výjimka nutno explicitně testovat ● ●
Statement.getWarnings() SQLWarning.getNextWarning()
Java, letní semestr 2016 11.4.2016
Batch update ● ●
zpracování více dotazů najednou Statement.addBatch(String sql) –
●
přidá dotaz do dávky
int[] Statement.executeBatch(); – –
provede dávku vrací počet ovlivněných řádků pro každý dotaz v dávce
Java, letní semestr 2016 11.4.2016
Updatable ResultSet ●
implicitní ResultSet nelze měnit, lze se pohybovat pouze vpřed –
lze změnit při vytváření Statementu
Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery("SELECT ..."); –
výsledný ResultSet lze měnit, lze se v něm volně pohybovat, nejsou v něm vidět změny od ostatních uživatelů
Java, letní semestr 2016 11.4.2016
Java DB ● ●
http://www.oracle.com/technetwork/java/javadb/ Oraclem podporovaná distribuce databáze Apache Derby –
● ●
http://db.apache.org/derby/
kompletně v Javě lze používat – –
samostatně jako server uvnitř jiné aplikace
●
snaha o malou spotřebu paměti (~ 2MB)
●
existují i jiné databáze napsané v Javě
Java, letní semestr 2016 11.4.2016
Objektové databáze ● ● ●
● ● ●
●
ne-relační databáze ukládaní a vyhledávání objektů vlastní přístup bez JDBC NeoDatis db4o … příklad pro NeoDatis Sport sport = new Sport("volley-ball"); ODB odb = ODBFactory.open("test.neodatis"); odb.store(sport); Objects
players = odb.getObjects(Player.class); odb.close();
Java, letní semestr 2016 11.4.2016
ORM ●
problém s OO databázemi – –
●
jednoduché na použití nepříliš výkonné, nepříliš podporované,...
řešení – ORM – – –
(object-relational mapping) vrstva mapující relační databázi na objekty zjednodušeně ● ●
–
JDBC se typicky používá uvnitř ●
–
třída ~ schéma tabulku objekt ~ řádek v tabulce automaticky
Hibernate ● ●
http://hibernate.org/ nejpoužívanější ORM pro Javu –
Java, letní semestr 2016 11.4.2016
implementace i pro další technologie
JAVA
Práce s XML
Java, letní semestr 2016 11.4.2016
Přehled ●
JAXP – Java API for XML Processing – –
čtení, zápis a transformaci XML SAX, DOM, XSLT ●
–
podle W3C
podporuje různé implementace ●
referenční implementace součástí JDK –
●
JDOM – –
●
http://www.jdom.org/ „zjednodušený“ DOM pro Javu
JAXB – Java Architecture for XML Binding –
●
lze použít jiné
mapování XML <=> Java objekty
Elliotte Rusty Harold: Processing XML with Java
– http://www.cafeconleche.org/books/xmljava/ kniha Java, letní– semestr 2016 – volně ke stažení 11.4.2016
JAXP – přehled ●
balíky – – – –
●
SAX (Simple API for XML) – – – –
●
javax.xml.parsers org.w3c.dom org.xml.sax javax.xml.transform
průchod přes XML dokument element po elementu na každém elementu něco provést rychlé, nenáročné na paměť složitější na použití
DOM – – –
postaví z dokumentu strom v paměti jednoduché na použití pomalé, náročné na paměť
Java, letní semestr 2016 11.4.2016
22
SAX
Java, letní semestr 2016 11.4.2016
23
DOM
Java, letní semestr 2016 11.4.2016
24
DOM: použití DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); // vytvoří celý strom v paměti Document document = builder.parse("file.xml"); Element root = document.getDocumentElement(); NodeList nl = root.getChildNodes(); for (int i=0; i
Java, letní semestr 2016 11.4.2016
25
SAX: použití class MyHandler extends DefaultHandler { void startDocument() { ... } void endDocument() { ... } void startElement(....) { ... } ... } SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); saxParser.parse("file.xml", new MyHandler() );
Java, letní semestr 2016 11.4.2016
26
Implementace ● ●
existují různé implementace JAXP DocumentBuilderFactory.newInstance() i SAXParserFactory.newInstance() – –
uvnitř používají ServiceLoader varianta newInstance(String factoryClassName, ClassLoader classLoader) ●
hledá danou třídu
Java, letní semestr 2016 11.4.2016
27
JDOM – Přehled ● ● ●
http://www.jdom.org/ API pro XML přímo pro Javu –
● ● ●
používá std. API z Javy (kolekce,...)
jednoduché na používání rychlé "light-weight"
Java, letní semestr 2016 11.4.2016
28
Použití SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(filename); Element root = doc.getRootElement(); List children = current.getChildren(); Iterator iterator = children.iterator(); while (iterator.hasNext()) { Element child = (Element) iterator.next(); ... }
Java, letní semestr 2016 11.4.2016
29
JAXB – přehled ●
●
automatické mapovaní mezi XML dokumenty a Java objekty princip –
Java třídy a odpovídající XML schema ●
–
lze vygenerovat třídy ze schematu i obraceně
použití ● ● ●
vytvoření Java objektů z XML (unmarshaling) práce s Java objekty uložení Java objektů do XML (marshaling)
Java, letní semestr 2016 11.4.2016
30
JAXB – příklad <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="2.0"> <xsd:element name="Greetings" type="GreetingListType"/> <xsd:complexType name="GreetingListType"> <xsd:sequence> <xsd:element name="Greeting" type="GreetingType" maxOccurs="unbounded"/> <xsd:complexType name="GreetingType"> <xsd:sequence> <xsd:element name="Text" type="xsd:string"/> <xsd:attribute name="language" type="xsd:language"/> Java, letní semestr 2016 11.4.2016
31
JAXB – příklad ●
vygenerování tříd –
xjc -p hello hello.xsd
Java, letní semestr 2016 11.4.2016
32
JAXB – příklad public class Hello { private ObjectFactory of; private GreetingListType grList; public Hello(){ of = new ObjectFactory(); grList = of.createGreetingListType(); } public void make( String t, String l ){ GreetingType g = of.createGreetingType(); g.setText( t ); g.setLanguage( l ); grList.getGreeting().add( g ); } public void marshal() { try { JAXBElement gl = of.createGreetings( grList ); JAXBContext jc = JAXBContext.newInstance( "hello" ); Marshaller m = jc.createMarshaller(); m.marshal( gl, System.out ); } catch( JAXBException jbe ){ … } }
} letní semestr 2016 Java, 11.4.2016
33
JAXB – příklad Hello h = new Hello(); h.make( "Bonjour, madame", "fr" ); h.make( "Hey, you", "en" ); h.marshal();
Bonjour, madame Hey, you
Java, letní semestr 2016 11.4.2016
34
JAVA
Scripting API
Java, letní semestr 2016 11.4.2016
Přehled ●
podpora skriptovacích jazyku přímo z Javy – – –
integrace skriptů do Java programu volání skriptů používání Java objektů ze skriptu ●
– ●
…
JSR 223 –
●
a obraceně
Scripting for the JavaTM Platform
od Java 6 přímo součástí JDK –
součástí JDK je JavaScript engine – – ● ●
–
Java 6-7 Mozilla Rhino engine Java 8 Nashorn engine
implementace JavaScript jazyka v Javě implementuje rozhraní JSR 223
existuje mnoho implementací pro další jazyky ●
stačí dát JAR balík na CLASSPATH
Java, letní semestr 2016 11.4.2016
Proč ●
jednotné rozhraní pro všechny skriptovací jazyky –
●
dříve si každá implementace řešila rozhraní po svém
snadné požívání skr. jazyků – – – –
proměnné „bez“ typů automatické konverze … programy není nutno kompilovat ●
●
existence „shelů“
použití – – – –
složitější konfigurační soubory rozhraní pro „administrátora“ aplikace rozšiřování aplikace (pluginy) skriptování v aplikaci ●
obdoba jako JS v prohlížeči, VBScript v office,...
Java, letní semestr 2016 11.4.2016
Použití ● ●
balíček javax.scripting ScriptEngineManager – –
●
základní třída nalezení a získání instance skript. enginu
základní použití – – –
instance ScriptEngineManageru nalezení požadovaného enginu spuštění skriptu pomocí metody eval()
Java, letní semestr 2016 11.4.2016
Hello world public class Hello { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("JavaScript"); //ScriptEngine engine = manager.getEngineByExtension("js"); //ScriptEngine engine = manager.getEngineByMimeType("application/javascript"); try { engine.eval("println( \"Hello World!\");" ); System.out.println( engine.eval( " 'Hello World again!' ")); } catch(ScriptException e) { ... } } }
Java, letní semestr 2016 11.4.2016
Přehled funkčnosti ●
skript – –
●
řetězec nebo znakový stream (reader) vyhodnocení přes ScriptEngine.eval()
interface Compilable –
jeho implementace volitelná ●
– ●
kompilace skriptu do byte-code
interface Invocable –
jeho implementace volitelná ●
– ●
otestovat – instanceof Compilable
otestovat – instanceof Invocable
volání metod a funkcí ze skriptů
Bindings, ScriptContext –
prostředí pro vykonávání skriptů ●
mapování proměnných sdílených mezi Javou a skriptem
Java, letní semestr 2016 11.4.2016
Získání enginu ●
(1)
ScriptEngineManager.getEngineFactories() –
seznam všech ScriptEngineFactory
for (ScriptEngineFactory factory : engineManager.getEngineFactories()) { System.out.println("Engine name: " + factory.getEngineName()); System.out.println("Engine version: " + factory.getEngineVersion()); System.out.println("Language name: " + factory.getLanguageName()); System.out.println("Language version: " + factory.getLanguageVersion()); System.out.println("Engine names:"); for (String name : factory.getNames()) { System.out.println(" " + name); } System.out.println("Engine MIME-types:"); for (String mime : factory.getMimeTypes()) { System.out.println(" " + mime); } } Java, letní semestr 2016 11.4.2016
Získání enginu ●
ScriptEngineFactory.getEngine()
●
nebo přímo
● ● ●
ScriptEngineManager.getEngineByName() ScriptEngineManager.getEngineByExtension() ScriptEngineManager.getEngineByMimeType()
Java, letní semestr 2016 11.4.2016
(2)
Skripty ●
vykonání skriptu – –
●
Object ScriptEngine.eval( String s, ... Object ScriptEngine.eval( Reader r, …
předávání proměnných (základní varianta) – – –
void ScriptEngine.put(String name, Object value) Object ScriptEngine.get(String name) POZOR na konverze typů!
Java, letní semestr 2016 11.4.2016
Předávání proměnných ●
interface Bindings – –
●
extends Map<String,Object> základní implementace – SimpleBindings
interface ScriptContext – – –
prostředí, ve kterém se skripty vykonávají základní implementace – SimpleScriptContext obsahuje scopes ●
–
speciální scopes ● ●
– –
scope = Binding ENGINE_SCOPE – lokální pro ScriptEngine GLOBAL_SCOPE – globální pro EngineManager
getAttribute(..) / setAttribute(..) odpovídají getBindings(..).get / put lze nastavit standardní Reader a Writery (vstup a výstup) pro skript
Java, letní semestr 2016 11.4.2016
Předávání proměnných
zdroj obrázku: http://www.javaworld.com/javaworld/jw-04-2006/jw-0424-scripting.html
Java, letní semestr 2016 11.4.2016
Volání funkcí/metod ●
interface Invocable – –
volitelná funkčnost, je třeba testovat (instanceof) poskytuje ● ●
●
volání funkcí skriptu z Java kódu volání metod objektů skriptu z Java kódu, pokud je skriptovací jazyk objektový implementace Java interface funkcemi (metodami) skriptu ScriptEngine engine = manager.getEngineByName("javascript"); Invocable inv = (Invocable) engine; engine.eval("function run() { println( 'funkce run'); };"); Runnable r = inv.getInterface(Runnable.class); (new Thread(r)).start(); engine.eval("var runobj = { run: function() { println('metoda run'); } };"); o = engine.get("runobj"); r = inv.getInterface(o, Runnable.class); (new Thread(r)).start();
Java, letní semestr 2016 11.4.2016
JavaScript engine v JDK ●
některé funkce odstraněny (nebo nahrazeny) –
●
(1)
převážně z důvodů bezpečnosti
vestavěné funkce pro import Java balíčků –
importPackage(), importClass() ●
●
●
–
balíčky přístupné přes Packages.JmenoBalíčku, pro nejpoužívanější balíčky jsou definované zkratky (proměnné): java (ekvivalentní Packages.java), org, com, .. java.lang není importován automaticky (možné konflikty objektů Object, Math, ..) v Java 8 nutno nejdříve použít load("nashorn:mozilla_compat.js");
objekt JavaImporter ●
pro ukrytí importovaných prvků do proměnné (předchází konfliktům) var imp = new JavaImporter( java.lang, java.io);
Java, letní semestr 2016 11.4.2016
JavaScript engine v JDK ●
Java objekty v js – –
●
(2)
vytváří se stejně jako v Javě var obj = new Trida( ...)
Javovské pole v js – – –
vytvoříme přes Java Reflection var pole = java.lang.reflect.Array.newInstance( ..) dále pracujeme běžně: pole[i], pole.length, … var a = java.lang.reflect.Array.newInstance( java.lang.String, 5); a[0] = "Hello"
●
anonymní třídy –
anonymní implementace Java rozhraní
var r = new java.lang.Runnable() { run: function() { println( "running..."); } }; var th = null; th = new java.lang.Thread( r); Java, letní semestr th.start(); 2016 11.4.2016
JavaScript engine v JDK ●
anonymní třídy (pokrač.) –
(3)
autokonverze funkce na rozhraní s jednou metodou function func() { print("I am func!"); }; th = new java.lang.Thread( func); th.start();
Java, letní semestr 2016 11.4.2016
JavaScript engine v JDK ●
(4)
přetížené Java metody – – –
připomenutí overoading se děje při překladu (javac) při předání JavaScriptových proměnných Java metodám vybere script engine správnou variantu výběr můžeme ale ovlivnit ● ●
objekt[“název_metody(typy parametrů)”](parametry) pozor! řetězec bez mezer!
Java, letní semestr 2016 11.4.2016
Další enginy ●
existuje velké množství hotových enginů – –
awk, Haskell, Python, Scheme, XPath, XSLT, PHP,... použití ● ●
●
stáhnout JAR dát JAR na CLASSPATH
vytvoření vlastního enginu –
implementace API ●
nutno implementovat alespoň – –
–
ScriptEngineFactory ScriptEngine
zabalení do JAR ●
přidat soubor META-INF/services/javax.script.ScriptEngineFactory –
Java, letní semestr 2016 11.4.2016
ScriptEngineManager používá ServiceLoader
Verze prezentace AJ07.cz.2016.01 Java, letní semestr 2015 18.2.2015 Tato prezentace podléhá licenci Creative Commons Uveďte autora-Neužívejte komerčně 4.0 Mezinárodní License. 52