Ü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