Pokročilé programování na platformě Java, letní semestr 2012

Transkript

Pokročilé programování na platformě Java, letní semestr 2012
JAVA
JDBC
Java, letní semestr 2012
11.4.2012
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
Java, letní–semestr
2012
JDK
6
11.4.2012
– JDBC 1.0
– JDBC 2.0
– JDBC 3.0
– JDBC 4.0
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 2012
11.4.2012
JDBC Driver
●
4 typy driveru
–
–
–
–
JDBC-ODBC bridge plus ODBC driver
Native-API partly-Java driver
JDBC-Net pure Java driver
Native-protocol pure Java driver
Java, letní semestr 2012
11.4.2012
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 2012
11.4.2012
Základní třídy a rozhraní
●
Connection – interface
–
●
vytváření a vykonávání dotazů
ResultSet – interface
–
výsledky dotazu
Java, letní semestr 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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<Player> players = odb.getObjects(Player.class);
odb.close();
Java, letní semestr 2012
11.4.2012
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 2012
11.4.2012
implementace i pro další technologie
JAVA
Práce s XML
Java, letní semestr 2012
11.4.2012
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
2012 – volně ke stažení
11.4.2012
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 2012
11.4.2012
22
SAX
Java, letní semestr 2012
11.4.2012
23
DOM
Java, letní semestr 2012
11.4.2012
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<nl.length(); i++) {
Node n = nl.item(i);
...
}
Java, letní semestr 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
30
JAXB – příklad
<?xml version="1.0" encoding="UTF-8"?>
<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:sequence>
</xsd:complexType>
<xsd:complexType name="GreetingType">
<xsd:sequence>
<xsd:element name="Text" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="language" type="xsd:language"/>
</xsd:complexType>
Java,
letní semestr 2012
</xsd:schema>
11.4.2012
31
JAXB – příklad
●
vygenerování tříd
–
xjc -p hello hello.xsd
Java, letní semestr 2012
11.4.2012
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 2012
Java,
11.4.2012
33
JAXB – příklad
Hello h = new Hello();
h.make( "Bonjour, madame", "fr" );
h.make( "Hey, you", "en" );
h.marshal();
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Greetings>
<Greeting language="fr">
<Text>Bonjour, madame</Text>
</Greeting>
<Greeting language="en">
<Text>Hey, you</Text>
</Greeting>
</Greetings>
Java, letní semestr 2012
11.4.2012
34
JAVA
Scripting API
Java, letní semestr 2012
11.4.2012
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 i Mozilla Rhino 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 2012
11.4.2012
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 2012
11.4.2012
Použití
●
●
balíček javax.scripting
ScriptEngineManager
–
–
●
základní třída
nalezení a získání instance skript. enginu
základní použití
–
–
–
instance ScriptEngineManegeru
nalezení požadovaného enginu
spuštění skriptu pomocí metody eval()
Java, letní semestr 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
Získání enginu
●
ScriptEngineFactory.getEngine()
●
nebo přímo
●
●
●
ScriptEngineManager.getEngineByName()
ScriptEngineManager.getEngineByExtension()
ScriptEngineManager.getEngineByMimeType()
Java, letní semestr 2012
11.4.2012
(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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
JavaScript engine v JDK
●
●
Mozilla Rhino engine
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, ..)
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 2012
11.4.2012
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();
2012
11.4.2012
JavaScript engine v JDK
●
anonymní třídy (pokrač.)
–
(3)
autokonverze funkce na rozhraní s jednou metodou
function func() {
println("I am func!");
};
th = new java.lang.Thread( func);
th.start();
Java, letní semestr 2012
11.4.2012
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 2012
11.4.2012
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 2012
11.4.2012
ScriptEngineManager používá ServiceLoader

Podobné dokumenty

Embedded SQL v C/C++ úvod

Embedded SQL v C/C++ úvod Prekompilátor Pro*C/C++ (proc) tyto dotazy nahradí voláním funkcí standardní run-time knihovny (SQLLIB) a převede soubor.ps do čistého C/C++. soubor.c Dále se už kód překládá jako „obyčejný“ céčkov...

Více

Data mining

Data mining dbf.setNamespaceAware(false); dbf.setValidating(false); dbf.setFeature("http://xml.org/sax/features/namespaces", false); dbf.setFeature("http://xml.org/sax/features/validation", false); dbf.setFeat...

Více

Rozhraní SAX, SAX vs. SAX2

Rozhraní SAX, SAX vs. SAX2 Při volání metody parse nejprve XMLFilterImpl zaregistruje u parseru sebe (implementuje všechny handler rozhraní). Poté deleguje na parser volání parse. Metody startElement,... definované třídou XM...

Více

Seminár Java VIII

Seminár Java VIII Hlavní typy rozhraní pro zpracování XML dat: Stromově orientovaná rozhraní (Tree-based API) Rozhraní založená na událostech (Event-based API) Rozhraní založená na "vytahování" událostí/prvků z do...

Více

Práce s databází

Práce s databází b) Typ 2 - připojení prostřednictvím kódu nativního klienta pro přístup k síti ......................2 c) Typ 3 připojení prostřednictvím vrstvy aplikačního serveru ...................................

Více

sql včera a dnes

sql včera a dnes ISO/IEC 9075-13:2008 Part 13: SQL Routines and Types Using the Java Programming Language (SQL/JRT) – 210 stránek – Definice použití jazyka java přímo v databázích

Více