JAVA V JDBC Java, letní semestr

Podobné dokumenty
JAVA Moduly Java, letní semestr 2019

JAVA JDBC Java, letní semestr 2018

Java a XML. 10/26/09 1/7 Java a XML

Semináˇr Java X JDBC Semináˇr Java X p.1/25

Typ 2 - připojení prostřednictvím kódu nativního klienta pro přístup k síti

Datová vrstva informačního systému. Miroslav Beneš

O Apache Derby detailněji. Hynek Mlnařík

Datová vrstva informačního systému. Java Database Connectivity JDBC. Obsah přednášky JDBC. Datová vrstva informačního systému

JAVA Moduly Java, letní semestr 2018

API pro práci s XML. Jirka Kosek. Poslední modifikace: $Date: 2014/12/17 17:15:28 $ Copyright Jiří Kosek

STARÁ DOBRÁ JAVA A PERSISTENCE S CACHÉ

Podmínky na zápočet. Java, zimní semestr

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml

RMI Remote Method Invocation

Vánoční hrátky s JAXB

Vytváření a použití knihoven tříd

Iterator & for cyklus

Tvorba informačních systémů

Úvod do programovacích jazyků (Java)

Vytváření uživatelských datových typů a funkcí v Javě

4. lekce Přístup k databázi z vyššího programovacího jazyka

JAVA. Další jazyky kompilovatelné do Java byte-code

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Oracle XML DB. Tomáš Nykodým

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

NSWI096 - INTERNET JavaScript

Programování v Javě I. Leden 2008

Programování v Javě I. Únor 2009

Ukládání a vyhledávání XML dat

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Jazyk C# (seminář 6)

Tvorba informačních systémů

GTL GENERATOR NÁSTROJ PRO GENEROVÁNÍ OBJEKTŮ OBJEKTY PRO INFORMATICA POWERCENTER. váš partner na cestě od dat k informacím

JAVA V RMI Java, letní semestr

Podpora XML v.net. Podpora XML v.net. nezávislý publicista. Jirka Kosek.

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Replikace je proces kopírování a udržování databázových objektů, které tvoří distribuovaný databázový systém. Změny aplikované na jednu část jsou

Použití databází na Webu

Generické programování

Pokročilé techniky tvorby sestav v Caché. ZENové Reporty

Rozhraní pro práci s XML dokumenty. Roman Malo

1. Webový server, instalace PHP a MySQL 13

JAVA. Krátce o Reflection API

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

JAVA Unit testing Java, zimní semestr

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

Výčtový typ strana 67

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

GUI. Systémová integrace pro desktopové aplikace

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

UJO Framework. revoluční architektura beans. verze

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

ANT. Aplikační programování v Javě (BI-APJ) - 1 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Groovy agilní Java. Pavel Kříž Filip Malý

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jalapeño: pekelně ostrá Java persistence v Caché. Daniel Kutáč Senior Sales Engineer

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Algoritmizace a programování

1 Webový server, instalace PHP a MySQL 13

Tvorba informačních systémů

Návrh softwarových systém. Návrh softwarových systémů

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Integrace OpenOffice.org a Javy. CZJUG, , Robert Vojta

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

InterSystems Caché Post-Relational Database

JAVA RMI Java, letní semestr 2018

Algoritmizace a programování

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy: zásobník

Zabezpečení proti SQL injection

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Skriptovací jazyky. Obsah

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Seminář Java II p.1/43

Business Intelligence

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

X36DSV 3. cvičení. XML (extensible Markup Language) JavaScript. AJAX (Asynchronous JavaScript and XML) X36DSV. 2007/10 ver.2.0 1

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Tvorba informačních systémů

Algoritmizace a programování. Terminálový vstup a výstup

Anotace a Hibernate. Aleš Nosek Ondřej Vadinský Daniel Krátký

Úvod do programovacích jazyků (Java)

Úvod do Web Services

1. Téma 12 - Textové soubory a výjimky

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

JAVA. Java Management Extensions JMX

Architektura, design, konstrukce

Transkript:

JAVA JDBC

Přehled rozhraní pro přístup k relační databázi jednotné nezávislé na databázi výrobce databáze musí dodat JDBC driver umožňuje vykonávání SQL dotazů přístup k výsledkům dotazů podobné reflection API balíky java.sql, javax.sql verze JDK 1.1 JDBC 1.0 JDK 1.2 JDBC 2.0 JDK 1.4 JDBC 3.0 JDK 6 JDBC 4.0 JDK 7 JDBC 4.1 JDK 8 JDBC 4.2

JDBC Driver JDBC API v podstatě jen rozhraní implementace dodána přes driver 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

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

Základní třídy a rozhraní DriverManager třída všechny metody jsou statické getconnection() několik variant getdrivers() všechny natažené drivery getlogwriter(), setlogwriter() println() zapis do logu getlogintimeout(), setlogintimeout()

Základní třídy a rozhraní Connection interface vytváření a vykonávání dotazů ResultSet interface výsledky dotazu

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();

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); }

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

Dotazy Connection.createStatement() vytvoření dotazu ("prázdného") Statement.executeQuery("...") pro dotazy vracející vysledky (SELECT) výsledky přes ResultSet Statement.executeUpdate("...") pro dotazy nevracející výsledky UPDATE CREATE TABLE

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)

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);

Callable Statements pro přístup k uloženým procedurám dědí od PreparedStatement nastavení parametrů settype(int index, type v) návratový typ nutno zaregistrovat registeroutparameter(int index, int sqltype) formát a) {?= call <procedure-name>[<arg1>,<arg2>, ]} b) {call <procedure-name>[<arg1>,<arg2>, ]} CallableStatement cs = con.preparecall("{call SHOW_SUPPLIERS}"); ResultSet rs = cs.executequery();

Ošetření chyb SQLException a její potomci String getsqlstate() definováno X/Open int geterrorcode() specifický pro konkrétní databázi varování (warnings) SQLWarning není to výjimka nutno explicitně testovat Statement.getWarnings() SQLWarning.getNextWarning()

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

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 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ě

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();

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ě třída ~ schéma tabulku objekt ~ řádek v tabulce JDBC se typicky používá uvnitř automaticky Hibernate http://hibernate.org/ nejpoužívanější ORM pro Javu implementace i pro další technologie

JAVA Práce s XML

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 lze použít jiné JDOM http://www.jdom.org/ zjednodušený DOM pro Javu JAXB Java Architecture for XML Binding mapování XML <=> Java objekty Elliotte Rusty Harold: Processing XML with Java http://www.cafeconleche.org/books/xmljava/ kniha volně ke stažení

JAXP přehled balíky javax.xml.parsers org.w3c.dom org.xml.sax javax.xml.transform SAX (Simple API for XML) 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ěť 22

SAX 23

DOM 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);... } 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() ); 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 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" 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();... } 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) 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> </xsd:schema> 31

JAXB příklad vygenerování tříd xjc -p hello hello.xsd 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 ){ } } Java, } letní semestr 2016 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> 34

JAVA Scripting API

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 a obraceně JSR 223 Scripting for the Java TM 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

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,...

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()

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) {... } } }

Přehled funkčnosti skript řetězec nebo znakový stream (reader) vyhodnocení přes ScriptEngine.eval() interface Compilable jeho implementace volitelná otestovat instanceof Compilable kompilace skriptu do byte-code interface Invocable jeho implementace volitelná 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

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); } }

Získání enginu (2) ScriptEngineFactory.getEngine() nebo přímo ScriptEngineManager.getEngineByName() ScriptEngineManager.getEngineByExtension() ScriptEngineManager.getEngineByMimeType()

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ů!

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 scope = Binding speciální scopes 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

Předávání proměnných zdroj obrázku: http://www.javaworld.com/javaworld/jw-04-2006/jw-0424-scripting.html

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();

JavaScript engine v JDK (1) některé funkce odstraněny (nebo nahrazeny) 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);

JavaScript engine v JDK (2) Java objekty v js 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

JavaScript engine v JDK (3) anonymní třídy (pokrač.) autokonverze funkce na rozhraní s jednou metodou function func() { print("i am func!"); }; th = new java.lang.thread( func); th.start();

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!

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 ScriptEngineManager používá ServiceLoader

Java, letní semestr Verze prezentace 2015 AJ07.cz.2016.01 18.2.2015 Tato prezentace podléhá licenci Creative Commons Uveďte autora-neužívejte komerčně 4.0 Mezinárodní License. 52