Übersicht - Abteilung Datenbanken Leipzig
Transcription
Übersicht - Abteilung Datenbanken Leipzig
Übersicht Aufgaben 2 und 3 Arbeiten mit DB2 Datenbankanbindung mit Java – JDBC und Hibernate XML Hinweise Datenbankpraktikum 1 Aufgabe 2 Schema laden – Länder/Orte (WFB), Produkte/Rezension/... (MS) Daten laden – aus XML- und CSV-Dateien – Korrektheits-/Konsistenzprüfung – Abhängigkeiten/Ladereihenfolge SQL Anfragen Logging-Mechanismus für Änderungen entwerfen/implementieren Datenbankpraktikum 2 Aufgabe 3 Anbinden der Datenbank an gegebene Rahmen-Applikation Realisierung einer Middleware – Java-Klasse mit gegebenem Interface Verwendung von Hibernate Datenbankpraktikum 3 Arbeiten mit DB2 Installation – DBS: IBM DB2 V8.2 ESE – Datenbankserver: leutzsch (Solaris) – Datenbank: PRWS0708 – Login: dbprakXX – implizites Schema: DBPRAKXX Zugriff mit Programm db2 (command line) – ohne Parameter: interaktiv – mit Parameter: Batch-Modus – AutoCommit-Modus Datenbankpraktikum 4 Arbeiten mit DB2 DB2 Kommando Aufruf startet Back-End Prozess – "quit" beendet nur Kommando (DB-Verbindung bleibt) – "terminate" beendet Back-End Prozess Verbindung zur Datenbank – CONNECT TO PRWS0708 USER dbprakXX Batch-Betrieb – db2 "SQL_BEFEHL" – db2 –t –f DATEI_NAME Datenbankpraktikum 5 Zugriff auf DB2 DB2-Kommando „unhandlich“ Generischer Datenbank-Browser – Z.B. Execute Query (http://executequery.org) – Verbindung mit DB mittels JDBC-Verbindung Funktionalität u.a. – Navigation in Tabellen (Daten, Metadaten) – Statements (SQL-Queries, DML, DDL, DCL) Datenbankpraktikum 6 JDBC Architektur & Treiberarten Java-Anwendung JDBC-API (java.sql) JDBC-Treiber-Manager DB2 Typ 2: Treiber Treiber – com.ibm.db2.jdbc.app.DB2Driver (60000) DB2 Typ 3: – com.ibm.db2.jdbc.net.DB2Driver (6789) DB2 Typ 4: – com.ibm.db2.jcc.DB2Driver (60000) Datenbankpraktikum 7 JDBC Treiber laden/registrieren static { // Laden des JDBC-Treibers try { String jdbcDrv = "COM.ibm.db2.jdbc.app.DB2Driver"; // "COM.ibm.db2.jdbc.net.DB2Driver"; // "com.ibm.db2.jcc.DB2Driver"; Class.forName(jdbcDrv); } catch (Exception e) { System.err.println("Konnte JDBC-Treiber nicht laden.); e.printStackTrace(); System.exit(1); } } Datenbankpraktikum 8 JDBC Treiber Server – Java-Programm läuft auf Server → Pfade sind entsprechend eingerichtet Client – Java-Programm läuft auf Client (z.B. Notebook) – Benötigte JAR-Dateien db2jcc.jar, db2jcc_license_cu.jar $HOME$/Aufgaben/aufgabe2/bsp_programme/lib/ (Solaris) Datenbankpraktikum 9 JDBC Workflow DriverManager getConnection(JDBC-URL) Connection createStatement() Statement prepareStatement(SQL) PreparedStatement prepareCall({call Proc}) CallableStatement setXXX(Param) setXXX(Param) execute Update(SQL) execute Query(SQL) ResultSet execute Update() execute Query() execute Update() ResultSet Datenbankpraktikum execute Query() registerOut Parameter(Param) execute() getXXX(Param) ResultSet 10 JDBC Verbindung herstellen // Verbindungsobjekt zur Datenbank Connection con = null; // JDBC-URL zur Datenbank String url = "jdbc:db2://leutzsch/PRWS0708"; // "jdbc:db2://leutzsch.informatik.uni-leipzig.de:6789/PRWS0708"; // "jdbc:db2://leutzsch.informatik.uni-leipzig.de:60000/PRWS0708 "; try { // Verbindung herstellen con = DriverManager.getConnection(url, userid, passwd); } catch(SQLException e) { System.err.println("SQL Fehler aufgetreten: " + e.getMessage()); } finally { // Ressourcen freigeben try { if (con != null) con.close(); } catch (SQLException e1){}; } Datenbankpraktikum 11 JDBC Query – Statement Statement stmt = null; // Objekt zum Ausfuehren von Queries ResultSet rs = null; // Enthaelt die Query-Ergebnisse String query = null; try { stmt = con.createStatement(); query = "SELECT tabname FROM syscat.tables" rs = stmt.executeQuery(query); while (rs.next()) { System.out.println(rs.getString(1)); } } catch(SQLException e) { System.err.println("SQL-Fehler: " + e.getMessage()); } finally { try { if (stmt != null) stmt.close(); } catch (SQLException e1){}; } Datenbankpraktikum 12 JDBC Query – PreparedStatement PreparedStatement pStmt = null; // Objekt zum Ausfuehren von Queries ResultSet rs = null; // Enthaelt die Query-Ergebnisse try { pStmt = con.prepareStatement("SELECT tabname FROM syscat.tables "+ "WHERE tabschema=?"); pStmt.setString(1, "DBPRAK42"); rs = pStmt.executeQuery(); while (rs.next()) { System.out.println(rs.getString(1)); } } catch(SQLException e) { System.err.println("SQL-Fehler: " + e.getMessage()); } finally { try { if (pStmt != null) pStmt.close(); }catch(SQLException e1){}; } Datenbankpraktikum 13 Hibernate Objekt-Relationales PersistenzFramework – Open-Source-Projekt: www.hibernate.org – "Java-Objekt in relationaler Datenbank speichern und laden" Objekt-Relationales-Mapping (ORM) – Beschreibung durch XML-Konfigurationsdateien – Trennung von DB-Anfragen und Java-Code Datenbankpraktikum 14 Hibernate: Beispiel (1) KUNDEN ID INTEGER NAME VARCHAR PLZ INTEGER ORT VARCHAR DATUM DATE class Kunde { int string int string date Set<Speise> } BESTELLUNGEN ID_KUNDE INTEGER ID_SPEISE INTEGER id; name; plz; ort; datum; speisen; class Speise { int string string Set<Kunde> } SPEISEN ID GERICHT ZUTATEN PREIS id; gericht; zutaten; kunden; Datenbankpraktikum INTEGER VARCHAR VARCHAR NUMERIC Datenbank (relational) Java (objektorientiert) 15 Hibernate: Beispiel (2) Hibernate.cfg.xml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class"> ... </property> <property name="hibernate.connection.url"> ... </property> <property name="hibernate.connection.username"> ... </property> <property name="hibernate.connection.password"> ... </property> ... <mapping resource="Kunde.hbm.xml"/> <mapping resource="Speise.hbm.xml"/> </session-factory> </hibernate-configuration> Datenbankpraktikum 16 Hibernate: Beispiel (3) Kunde.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="mypackage.Kunde" table="KUNDEN"> <id name="id" column="ID" type="integer"> <generator class="native"/> </id> <property name="name" column="NAME" type="string" not-null="true"/> <property name="plz" column="PLZ" type="integer"/> <property name="ort" column="ORT" type="string"/> <property name="datum" column="DATUM" type="date"/> <set name="speisen" table="BESTELLUNGEN" lazy="true"> <key column="ID_KUNDE"/> <many-to-many class="mypackage.Speise" column="ID_SPEISE"/> </set> </class> Datenbankpraktikum 17 </hibernate-mapping> Hibernate: Beispiel (4) Verbindung herstellen import org.hibernate.*; import org.hibernate.cfg.Configuration; private SessionFactory sessionFactory; try { System.out.println( "Initializing Hibernate" ); sessionFactory = new Configuration().configure().buildSessionFactory(); System.out.println( "Finished Initializing Hibernate" ); } catch( HibernateException ex ) { ex.printStackTrace(); System.exit( 5 ); } Datenbankpraktikum 18 Hibernate: Beispiel (5) Speichern try { Session sess = sessionFactory.openSession(); Transaction trx = sess.beginTransaction(); Kunde kunde = new Kunde(); /* + Werte setzen */ sess.save( kunde ); /* + Java-Objekt Speise erzeugen */ kunde.speisen.add( speise ); trx.commit(); } catch( HibernateException ex ) { if (trx != null) try { trx.rollback(); } catch( HibernateException exRb ) {} throw new RuntimeException( ex.getMessage() ); } finally { try { if( sess != null ) sess.close(); } catch( Exception exCl ) {} } Datenbankpraktikum 19 Hibernate: Beispiel (6) Laden List kunden = sess.createQuery( "from Kunde" ).list(); for( int i=0; i<kunden.size(); i++ ) { Kunde kunde = (Kunde)kunden.get( i ); System.out.println( "Kunde: " + kunde.name ); ... Iterator itr = kunde.speisen.iterator(); while( itr.hasNext() ) { System.out.print( ((Speise) itr.next()).gericht ); } } Datenbankpraktikum 20 XML Beispiel Landdaten <WorldFactbook> <country> (Beginn der Daten zu einem Land) <name> (Kurz)-Name des Landes </name> <Introduction> <Background>InfoText</Background> </Introduction> <Geography> <Location> Text zur geografischen Lage </Location> </Geography> <Economy> <GDP unit="$"> Bruttoinlandsprodukt in Dollar </GDP> <Agriculture_products> <name>Agrarprodukt 1</name> <name>Agrarprodukt 2</name> ... </Agriculture_products> </Economy> ... </country> (Ende erstes Land) <country> (Beginn naechstes Land) ... </country> ... </WorldFactbook> Datenbankpraktikum 21 XML Verarbeitung Standard-APIs zur Verarbeitung von XML-Dokumenten – DOM (Document Object Model) Dokument wird geparsed und als Baumstruktur im Hauptspeicher abgelegt Methoden zur Navigation/Manipulation – SAX (Simple API for XML) sequenzielles Parsen und Verarbeiten Parser ruft call-back-Methoden nach Einlesen eines Dokumentabschnitts auf (Elementstart, Elementende, Textabschnitt, Fehlernachrichten) Datenbankpraktikum 22 XML Verarbeitung mit Java Voraussetzung: Java-XML-Parser – Hier verwendet: Xerces von Apache – Einbinden in CLASSPATH export CLASSPATH=$CLASSPATH:/home/dbprak00/opt/lib/xerces.jar SAX – Initialisieren des Parsers – Festlegen der Klasse, die Call-Back-Methoden implementiert – Dokument an Parser übergeben Datenbankpraktikum 23 public class XMLParserDemo extends DefaultHandler { call-back String parserClass = "org.apache.xerces.parsers.SAXParser"; public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) { ... } public void endElement(String namespaceURI, String localName, String rawName) { ... } public void characters(char[] ch, int start, int length) { ... } public void warning(SAXParseException e) { ... } public void error(SAXParseException e) { ... } public void doit(String dataFilename) { p class init XMLReader parser = null; } try { parser = XMLReaderFactory.createXMLReader(parserClass); } catch (SAXException e) { System.err.println("Parser Initialisierungsfehler"); System.exit(1); } parser.setContentHandler(this); parser.setErrorHandler(this); try { parser.parse(dataFilename); } catch (SAXException e) {...} Hinweise Entwicklungs-Tools – – – – DB-Schema-Viewer (u.a. /u/dbprak00/bin/dbinfo.sh) XML-Viewer (u.a. /u/dbprak00/bin/sxview.sh) IDEs: Eclipse, Netbeans, ... (eigene DB2-Installation DB2-Express) Testate – lauffähige Programme auf userv + "unsere" DB2-Installation Dokumentation – Txt-Dateien & Beispiel-Programme – Literaturverzeichnis auf Praktikums-Website – Google & Co Datenbankpraktikum 25