Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

WS06/07Prof. Dr. Andreas Schmietendorf1 Programmierung von Client/Server- Anwendungen Verwendung von API‘s (JDBC)

Ähnliche Präsentationen


Präsentation zum Thema: "WS06/07Prof. Dr. Andreas Schmietendorf1 Programmierung von Client/Server- Anwendungen Verwendung von API‘s (JDBC)"—  Präsentation transkript:

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:

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“ -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)  “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 -Adresse String res2 = 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 -Adresse String res2 = 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 ( )


Herunterladen ppt "WS06/07Prof. Dr. Andreas Schmietendorf1 Programmierung von Client/Server- Anwendungen Verwendung von API‘s (JDBC)"

Ähnliche Präsentationen


Google-Anzeigen