Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Jutta Günther Geändert vor über 9 Jahren
1
WS06/07Prof. Dr. Andreas Schmietendorf1 Programmierung von Client/Server- Anwendungen Verwendung von API‘s (JDBC)
2
WS06/07Prof. Dr. Andreas Schmietendorf2 Übersicht zur Vorlesung Persistenzsicherung von Java-Objekten Datenbankanbindung mit Hilfe von JDBC Beispiel zur Verwendung des JDBC-Interfaces Verwendung von Prepared Statements Weiterführende Themenstellungen zum JDBC-Interface
3
WS06/07Prof. Dr. Andreas Schmietendorf3 Möglichkeiten zur Persistenzsicherung von Java-Objekten
4
WS06/07Prof. Dr. Andreas Schmietendorf4 Möglichkeiten zur Persistenzsicherung Objektserialisierung – Objekt als Datenstrom wegschreiben Manuelles OR-Mapping -Verwendung des JDBC-Frameworks -Embedded SQL (sehr verbreitet in C bzw. C++, bei Java aber keine Bedeutung) Nutzung objektorientierter Datenbanksysteme Verwendung des DAO-Entwurfsmusters (Datenabstraktion) Einsatz von EJB‘s (Entity Beans) OR-Mapping Tools (z.B. Hibernate)
5
WS06/07Prof. Dr. Andreas Schmietendorf5 Möglichkeiten zur Persistenzsicherung
6
WS06/07Prof. Dr. Andreas Schmietendorf6 Möglichkeiten zur Persistenzsicherung
7
WS06/07Prof. Dr. Andreas Schmietendorf7 Möglichkeiten zur Persistenzsicherung
8
WS06/07Prof. Dr. Andreas Schmietendorf8 Möglichkeiten zur Persistenzsicherung Hibernate-Anwendungen bestehen klassisch aus 4 Teilen: 1. Hibernate-Konfigurationsdatei (XML) 2. Pro persistenter Klasse eine Hibernate Mapping XML-Datei 3. Der Hibernate Java Library (JAR-Datei) 4. HQL (Hibernate Query Language) OO-Erweiterung zu SQL sowie: 1. Den Java-Klassen 2. Der Datenbank mit dem Datenbank Schema
9
WS06/07Prof. Dr. Andreas Schmietendorf9 Möglichkeiten zur Persistenzsicherung OR-Mapping Tools: http://www.service-architecture.com/products/object-relational_mapping.html
10
WS06/07Prof. Dr. Andreas Schmietendorf10 Datenbankanbindung mit Hilfe von JDBC
11
WS06/07Prof. Dr. Andreas Schmietendorf11 Datenbankanbindung mit JDBC JDBC - Java Database Connectivity API zur Programmierung von Datenbankverbindungen (Konzeptionell angelehnt an ODBC) JDBC nutzt für den Datenbankzugriff das durch die X/Open standardisierte Call-Level-Interfaces (CLI) -Low level API, kein direktes objektorientiertes Mapping -Implementierungen von Oracle, Sybase, Informix, DB/2, IMS,... Aufgaben des JDBC-Interface -Verbindungsaufbau zur Datenbank -SQL Kommandos (vgl. SELECT name FROM MITARBEITER) -Ergebnisse verarbeiten und in der Oberfläche anzeigen
12
WS06/07Prof. Dr. Andreas Schmietendorf12 Datenbankanbindung mit JDBC Das JDBC-Interface bietet verschiedene Treibertypen (Typ 1 bis 4) -Entscheidung über die Schichten der Applikation -Vorteile einer mehrschichtigen C/S-Architektur berücksichtigen Verwendbare Systeme (ohne Firewall): -Web-Server: MS Internet Information Server -JDBC-Applikations-Server (z.B. Weblogic „Tengah“ www.weblogic.com) -MS SQL-Server
13
WS06/07Prof. Dr. Andreas Schmietendorf13 Datenbankanbindung mit JDBC
14
WS06/07Prof. Dr. Andreas Schmietendorf14 Datenbankanbindung mit JDBC Type 1 Treiber: JDBC-ODBC Bridge -keine Hardwareunabhängigkeit bei Applet-Anwendungen -DB-Zugriffe erfolgen via dem ODBC-Treiber -Zu fast jedem DB-System sind ODBC-Treiber verfügbar Type 2 Treiber: Native partly Java Driver -Treiber des entsprechenden DBMS Herstellers werden benötigt -Wandlung der JDBC-Aufrufe in herstellerspezifische Client-API für das jeweilige Datenbank-System Merke: Treibertypen 1 und 2 sind für Applet-Anwendungen ungeeignet.
15
WS06/07Prof. Dr. Andreas Schmietendorf15 Datenbankanbindung mit JDBC Type 3 Treiber: Java Net all Java-Driver -Treiber nur zum Teil in Java geschrieben (eigentlich Proxy beim Client) -Middleware zwischen Java-Client und DB-Server notwendig -keine spezielle Software beim Client (Applets möglich) notwendig -mehrstufige C/S-Architekturen sind realisierbar (n-Tier) Type 4 Treiber: -Treiber komplett in 100% Java geschrieben -Treiber wird bei Start des Browsers übertragen (rel. groß) -Mehrstufige C/S-Architekturen werden unterstützt Schlußfolgerung: Treibertyp 4 ist für mehrstufige C/S-Architekturen die optimale Lösung (z.B. Einsatz im Kontext eines Web-Serves)
16
WS06/07Prof. Dr. Andreas Schmietendorf16 Datenbankanbindung mit JDBC SQL-2 Entry Level Standard von 1992 Problem der Portierung einer Anwendung auf ein anderes Datenbanksystem (Problem der verschiedenen SQL-Dialekte) Forderung von SUN an die JDBC-Hersteller zur Sicherung eines minimalen Anspruches auf Standardisierung SUN stellt eine entsprechende Test-Suite zum Nachweis der Konformität von JDBC-Treibern bereit Kritisch ist die Verwendung von Funktionen die über den o.g. Standard hinausgehen
17
WS06/07Prof. Dr. Andreas Schmietendorf17 Datenbankanbindung mit JDBC Meistgenutzte Klassen des JDBC-API (import java.sql.*) -java.sql.DriverManager Verwalten der Datenbankverbindung -java.sql.DriverConnection Verbindungsaufbau zur Datenbank -java.sql.Statement beinhaltet den auszuführenden SQL-Befehl wird als ASCI-Zeichenkette übergeben -java.sql.ResultSet Zugriff auf die Ergebnismenge des ausgeführten SQL-Befehls
18
WS06/07Prof. Dr. Andreas Schmietendorf18 Datenbankanbindung mit JDBC Öffnen einer Verbindung Bevor auf die DB zugegriffen werden bedarf es einer Verbindung Schritte beim Verbindungsaufbau -Datenbanktreiber laden -Initialisierung des Datenbanktreibers -Erzeugen eines Verbindungsobjektes Verbindungsobjekt -Bleibt während der gesamten Verbindung bestehen -Lieferant für spezielle Objekte zur Abfrage & Veränderung der DB
19
WS06/07Prof. Dr. Andreas Schmietendorf19 Datenbankanbindung mit JDBC Ausprägungen von getConnection (Verbindungsaufbau zur Datenbank) static Connection getConnection( string url ) static Connection getConnection( string url, String user, String password ) static Connection getConnection( string url, Properties info )
20
WS06/07Prof. Dr. Andreas Schmietendorf20 Datenbankanbindung mit JDBC Aufbau des Connection-Strings: Besteht aus mehreren Teilen Durch Doppelpunkt voneinander getrennt 1. Teil: immer jdbc 2. Teil: Sub-Protokoll – Angabe des konkreten Treibers Weitere Teile: Treiberspezifisch Beispiele: Firebird-DB con = DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:DirDB","sysdba","masterkey"); MySQL-DB con = DriverManager.getConnection("jdbc:mysql://localhost/hs_mitarbeiter", "root", "");
21
WS06/07Prof. Dr. Andreas Schmietendorf21 Datenbankanbindung mit JDBC Erzeugen von Anweisungsobjekten Abfragen und Änderungen erfolgen mittels Anweisungsobjekten Implementieren das Interface Statement bzw. entspr. Subinterfaces Einfachste Form „createStatement“ mit folgenden Methoden -executeQuery (String sql) -executeUpdate (String sql) Erzeugung unparametrisierter Abfragen und Änderungen der DB Rückgabe: -Einfacher numerischer Ergebniswert (Erfolg bzw. Misserfolg) -Menge von Datenbanksätzen, als Ergebnis der Abfrage
22
WS06/07Prof. Dr. Andreas Schmietendorf22 Datenbankanbindung mit JDBC Statement-Objekte: Häufig kostenintensive Ressourcen -Belegung von Speicherplatz -Belegung von Rechenzeit Erzeugung einer großen Anzahl sollte vermieden werden Besserer Stil: -Anlegen einer Reihe vordefinierter Statement-Objekte -Mehrfache Verwendung von Statement-Objekten -Allerdings besteht die Gefahr undefinierter Zustände
23
WS06/07Prof. Dr. Andreas Schmietendorf23 Datenbankanbindung mit JDBC Datenbankabfragen – Verwendung der executeQuery-Methode: public ResultSet executeQuery (String sql) throws SQLException Die oben dargestellte Methode erwartet eine für die Datenbank gültige SELECT-Anweisung (z.B. SELECT * FROM kunden WHERE name = ‘Meier‘) und gibt einen ResultSet zurück. Das ResultSet repräsentiert die Ergebnismenge. Schrittweisen durchlaufen des ResultSet mittels der Methode next. boolean next()
24
WS06/07Prof. Dr. Andreas Schmietendorf24 Datenbankanbindung mit JDBC Datenbankabfragen – Verwendung der executeQuery-Methode: Zugriff auf die Spalten des durch next referenzierten Tupels -getXXX (int n), Übergabe eines numerischen Wertes -getXXX (String x), Übergabe eines Spaltennamens Ausgewählte Get-Methoden von ResultSet -getBoolean -getByte -getDate -getString -getInt
25
WS06/07Prof. Dr. Andreas Schmietendorf25 Datenbankanbindung mit JDBC Datenbankänderungen – Verwendung der executeUpdate-Methode: public int executeUpdate (String sql) throws SQLException Die oben dargestellte Methode erwartet eine für die Datenbank gültige INSERT, UPDATE oder DELETE-Anweisung (z.B. INSERT INTO kunden VALUES (122, ‘Meier‘, ‘Andreas‘, 13509, ‘Berlin‘, ‘Wittestrasse 30H‘) bzw. eine DDL-Anweisung zum Ändern der Datenbankstruktur. Diese Methode gibt keine Ergebnismenge zurück! Bei Erfolg wird 1 zurückgegeben, andernfalls eines SQLException
26
WS06/07Prof. Dr. Andreas Schmietendorf26 Datenbankanbindung mit JDBC Klasse SQLException (Ausnahmebehandlung): Verbindungsaufbau zur Datenbank ist fehlgeschlagen Probleme mit SQL-Anweisungen -Syntaxfehler -Semantische Fehler – z.B. falsche Typisierung Behandlung einer SQLException catch (SQLException sqle) while (sqle != null) { System.err.println(sqle.toString()); System.err.println(“SQL-Status: “ + sqle.getSQLState()); System.err.println(“ErrorCode: “ + sqle.getSQLState()); }
27
WS06/07Prof. Dr. Andreas Schmietendorf27 Beispiel für die Verwendung des JDBC-Interfaces
28
WS06/07Prof. Dr. Andreas Schmietendorf28 JDBC-Beispiel Benötigte Software bzw. Systeme: Laufende Firebird-Datenbank (z.B. mittels IBO-Console bearbeiten) http://sourceforge.net/projects/firebird “firebird-jca-jdbc-driver” firebirdsql-full.jar – enthält alle benötigten Klassen -firebirdsql.jar -mini-concurrent.jar -jaas.jar (Innerhalb des JDK 1.4) -mini-j2ee.jar (JDBC classes) -log4j-core.jar (Logging-Funktionalitäten) JDK 1.4.x - Setzen der Java-Umgebungsvariablen -Unter WinXP: Start – Einstellungen – Systemsteuerung – System - Erweitert -CLASSPATH .;C:\j2sdk1.4.2_08\lib\firebirdsql-full.jar -JAVA_HOME C:\j2sdk1.4.2_08
29
WS06/07Prof. Dr. Andreas Schmietendorf29 JDBC-Beispiel Firebank-Datenbank mittels DDL aufsetzen Java-Programm implementieren -Treiber laden Class.forName("org.firebirdsql.jdbc.FBDriver"); -Variable für Connection-Objekt: private Connection con; -Datenbankverbindung (Treiber:Server:Datenbank) herstellen mit: DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:C:/Pro gramme/Firebird/examples/employee.gdb","sysdba","masterkey"); -Treiber: jdbc:firebirdsql -Server: localhost/3050 -Datenbank: C:/Programme/Firebird/examples/employee.gdb -Nutzername/Passwort: sysdba/masterkey
30
WS06/07Prof. Dr. Andreas Schmietendorf30 JDBC-Beispiel
31
WS06/07Prof. Dr. Andreas Schmietendorf31 JDBC-Beispiel import java.sql.*; public class JDBCTest { // A. Schmietendorf – Fachhochschule für Wirtschaft Berlin – WS06/07 // JDBC-Testbeispiel im Rahmen der Vorlesung Programmierung C/S-Systeme private Connection con; private java.sql.Statement stm; public static void main(String argv[]) { new JDBCTest().access(); }
32
WS06/07Prof. Dr. Andreas Schmietendorf32 JDBC-Beispiel public void access() { try { Class.forName("org.firebirdsql.jdbc.FBDriver"); } catch(ClassNotFoundException ex) { System.out.println("Class.forName : " + ex.getMessage()); } try { con = DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:C:/Programme/Firebird/ examples/employee.gdb","sysdba","masterkey"); stm = con.createStatement(); stm.executeUpdate("INSERT INTO country VALUES ('Bulgaria','Leva')"); System.out.println("Daten erfolgreich in die Datenbank eingetragen");
33
WS06/07Prof. Dr. Andreas Schmietendorf33 JDBC-Beispiel System.out.println("Daten aus der Datenbanktabelle auslesen"); ResultSet rs = stm.executeQuery ("SELECT * FROM country"); while (rs.next ()) { String country = rs.getString (1); String currency = rs.getString (2); System.out.println(country + " " + currency); } System.out.println("Ende der Datenausgabe - A. Schmietendorf"); // Ressourcenffreigabe rs.close(); con.close(); } catch (SQLException ex) { System.out.println(ex.getMessage()); } }
34
WS06/07Prof. Dr. Andreas Schmietendorf34 JDBC-Beispiel Verwendung eines ResultSet-Objektes zur Ergebnisverwaltung der Anfrage Navigation über die Ergebnismenge erfolgt nach dem Cursor-Prinzip Weitersetzen des Cursors mit der Methode next Zeilenauswahl entspricht der aktuellen Position des Cursors Spaltenauswahl der aktuellen Tupel mit getXXX-Methode und Spaltenindex ResultSet rs = stm.executeQuery ("SELECT * FROM country"); while (rs.next ()) { String country = rs.getString (1); String currency = rs.getString (2); System.out.println(country + " " + currency); }
35
WS06/07Prof. Dr. Andreas Schmietendorf35 JDBC-Beispiel
36
WS06/07Prof. Dr. Andreas Schmietendorf36 Verwendung von Prepared Statements
37
WS06/07Prof. Dr. Andreas Schmietendorf37 Prepared Statements Prepared Statements sind parametrisierte SQL-Anweisungen Werden deklariert und zum Vorkompilieren der DB übergeben Können später beliebig of ausgeführt werden Vorteile: -Vorbereitungssarbeiten werden nur einmal erledigt Syntaxanalyse Vorbereitung der Abfragestrategie und -optimierung -Bessere Performance JDBC Prepared Statements im Interface PreparedStatement
38
WS06/07Prof. Dr. Andreas Schmietendorf38 Prepared Statements Methode preparedStatement: PreparedStatement pst = con.preparedStatement ( “SELECT * FROM ?“ ); Parametrisierung von executeQuery bzw. executeUpdate -Aufruf einer entsprechenden set-Methode je Fragezeichen Ausführung mittels executeQuery bzw. executeUpdate
39
WS06/07Prof. Dr. Andreas Schmietendorf39 Prepared Statements
40
WS06/07Prof. Dr. Andreas Schmietendorf40 Prepared Statements
41
WS06/07Prof. Dr. Andreas Schmietendorf41 Prepared Statements public class DBClient { public static void main(String[] args) throws Exception { DBConnect MyDBConnect = new DBConnect(); // Suche ueber den Namen String res1 = MyDBConnect.searchForName("Mueller"); System.out.print(res1); // Suche ueber die email-Adresse String res2 = MyDBConnect.searchForEMail("schmidt@gmx.de"); System.out.print(res2); // Suche ueber die Raumnummer String res3 = MyDBConnect.searchForRaum("113"); System.out.print(res3); }
42
WS06/07Prof. Dr. Andreas Schmietendorf42 Prepared Statements public class DBClient { public static void main(String[] args) throws Exception { DBConnect MyDBConnect = new DBConnect(); // Suche ueber den Namen String res1 = MyDBConnect.searchForName("Mueller"); System.out.print(res1); // Suche ueber die email-Adresse String res2 = MyDBConnect.searchForEMail("schmidt@gmx.de"); System.out.print(res2); // Suche ueber die Raumnummer String res3 = MyDBConnect.searchForRaum("113"); System.out.print(res3); }
43
WS06/07Prof. Dr. Andreas Schmietendorf43 Prepared Statements
44
WS06/07Prof. Dr. Andreas Schmietendorf44 Prepared Statements
45
WS06/07Prof. Dr. Andreas Schmietendorf45 Prepared Statements
46
WS06/07Prof. Dr. Andreas Schmietendorf46 Prepared Statements
47
WS06/07Prof. Dr. Andreas Schmietendorf47 Weiterführende Themenstellungen zum JDBC-Interface
48
WS06/07Prof. Dr. Andreas Schmietendorf48 Transaktionssicherung Steuerung des Transaktionsverhalten der Datenbank über 3 Methoden des Connection-Objektes -void commit() -void rollback() -void setAutoCommit (boolean autoCommit) Nach dem Aufbau einer JDBC-Verbindung -DB im Auto-Commit-Modus (Vorgabe JDBC) -Jede einzelne Anweisung gilt als separate TA Änderung mittes setAutoCommit (false) -TA müssen explizit durch Aufruf von commit bestätigt werden -Mittels rollback kann eine TA zurückgesetzt werden
49
WS06/07Prof. Dr. Andreas Schmietendorf49 Transaktionssicherung Transaction Isolation Level (Beeinflussung des Sperrverhalten) -Steuerung des Grades der Parallelität -Hoher Transaction Level desto weniger Konsistenzprobleme geringerer Durchsatz, d.h. Performanceprobleme -Niedriger Tranaction Level ggf. potentielle Konsistenzprobleme besseres Performanceverhalten
50
WS06/07Prof. Dr. Andreas Schmietendorf50 Transaktionssicherung Verfügbare Transaction Isolation Level -Connection.TRANSACTION_NONE -Connection.TRANSACTION_READ_UNCOMMITTED -Connection.TRANSACTION_READ_COMMITTED -Connection.TRANSACTION_REPEATABLE_READ -Connection.TRANSACTION_SERIALIZABLE Lesen und Ändern des Transaction Isolation Level -int getTransactionIsolation ( ) -void setTransactionIsolation ( )
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.