240 likes | 340 Views
JDBC – Datenzugriff aus Java. ETIS SS04. Gliederung. Motivation Bestandteile Fehlerbehandlung Metadaten Zusammenfassung. Motivation(I). Standard für Zugriff auf Datenquellen aus Java-Anwendungen RDBs, Flat Files, Spread Sheets Bestandteil Java-Standarddistribution seit JDK 1.1
E N D
JDBC – Datenzugriff aus Java ETIS SS04
Gliederung • Motivation • Bestandteile • Fehlerbehandlung • Metadaten • Zusammenfassung JDBC
Motivation(I) • Standard für Zugriff auf Datenquellen aus Java-Anwendungen • RDBs, Flat Files, Spread Sheets • Bestandteil Java-Standarddistribution seit JDK 1.1 • aktuell: Version 3.0 • JDBC keine Abkürzung • inoffiziell: Java Database Connectivity • einfacher Zugriff aus Java auf Datenquellen • plattform- und datenbankunabhängig • “write once run anywhere“ JDBC
Motivation (II) • unterschiedliche DBS besitzen unterschiedliche Programmierschnittstellen • somit: • schwer, DBMS-unabhängige Anwendungen zu entwickeln • Probleme bei Portierung auf andere DBMS • deshalb: • JDBC entwickelt • somit: • selber Quellcode für Kommunikation mit beliebiger DB • (Voraussetzung: JDBC-Treiber und ANSI SQL-2 Fähigkeit der DB) JDBC
Bestandteile (I) • Klassen und Schnittstellen des package java.sql bzw. javax.sql • DriverManager • Einstiegspunkt, • hält Liste registrierter Treiberklassen • versucht Treiber zu lokalisieren + DB-Verbindung aufzubauen • DataSource • repräsentiert Datenquelle in Java • Alternative zum DriverManager • arbeitet mit JNDI (Features wie Connection Pooling, verteilte Transaktionen + Wartbarkeit verbessert) JDBC
Bestandteile(II) • Connection • repräsentiert Verbindung zu Datenquelle • beinhaltet auszuführende SQL-Statements + zurückgegebene Ergebnisse • eine Anwendung kann eine oder mehrere Verbindungen zu einer oder mehreren Datenquellen haben JDBC
Bestandteile(II) • Statement • ermöglicht Ausführung von SQL-Anweisungen über gegebene Verbindung • ResultSet • verwaltet Ergebnisse einer Anfrage • unterstützt Zugriff auf einzelne Spalten JDBC
Treibermanager • führt Liste mit allen geladenen Treibern • alle Verbindungen vom Programm zur Datenbank laufen über ihn • Treiber aufgrund Verbindungsinformationen gewählt • registrierte Treiber entsprechend ihrer Reihenfolge getestet • erster passender ausgewählt • Treiberkonzept bewirkt Flexibilität von JDBC JDBC
Treiber • Treiber Schnittstelle zwischen JDBC und DB • Austausch Treiber ermöglicht Zugriff auf andere DB mit selben Quellen • d.h. jedes DBMS benötigt eigenen Treiber • explizites Laden im Programm: • Class.forName(„jdbc.odbc.JdbcOdbcDriver“); • Java-Classloader lokalisiert Treiber und lädt und linkt ihn automatisch • danach registriert sich Treiber selbständig beim Treibermanager JDBC
Connection (I) • repräsentiert Verbindung zur Datenbank • Verbindungsaufbau: • Connection con = DriverManager.getConnection( • String url, String name, String passwort); • Url: jdbc:<subprotocol>:<subname> • Ablauf JDBC-DB-Anwendung: • Verbindungsaufbau zur DB • SQL-Anweisung senden • Anfrageergebnisse verarbeiten JDBC
Connection (II) • Connection Pooling (seit 2.0) • da Connectionaufbau teure Operation • Reduzierung Verbindungsauf- und -abbau • wenn DB-Verbindung geschlossen, nicht beendet, sondern markiert • will andere Anwendung Verbindung öffnen, Prüfung, ob passende Verbindung in Pool - nur wenn nein, neue aufgebaut JDBC
Statement + ResultSet • Statement stmt = connection.createStatement(); • ResultSet rs = stmt.executeQuery(“select...”); • while(rs.next()){ • System.out.println(rs.getString(“name”)); • } • rs.close(); • stmt.close(); JDBC
Statement (I) • Drei Arten für Ausführung von SQL (Interfaces bauen aufeinander auf): • Statement: einfacher SQL-Befehl • PreparedStatement: vorkompilierter SQL-Befehl • CallableStatement: Aufruf einer Prozedur • Methoden für Abfragen von Ergebnissen: • createQuery (Anfragen) • createUpdate (Einfügen, Ändern, Löschen sowie DDL-Anweisungen) • seit 2.0: BatchUpdates (Ausführung mehrerer Updates als “Stapel“ - Performancegewinn) JDBC
Statement (II) • Methoden für Ausführen von Statements: • executeQuery (Anfragen) • executeUpdate (Änderungsoperation + DDL-Befehle) • execute (mehr als ein ResultSet oder update count zurückgegeben) • Escape Syntax ermöglicht mehr DB-Unabhängigkeit • Connections, Statements, ResultSets immer explizit schliessen, um Ressourcen so früh wie möglich frei zu geben JDBC
PreparedStatement(I) • PreparedStatement pstmt = con.prepareStatement( • “select * from person where name = ? and • vorname = ?”); • pstmt.setString(1, “Lustig”); • pstmt.setString(2, “Peter”); • ResultSet rs = rs.executeQuery(); JDBC
PreparedStatement (II) • Zeichenkette mit SQL-Anweisung bei Erzeugung des Objektes zu DBMS gesendet, dort kompiliert und zur Ausführung vorbereitet • Parameter unbekannt, wenn Statement kreiert • ? Platzhalter für Parameter • für endgültige Ausführung: IN-Parameter übergeben • Parameter gültig bis Aufruf clearParameter oder neu gesetzt • Laufzeitvorteile, wenn Anweisung mehrfach mit verschiedenen Parametern ausgeführt JDBC
ResultSet (I) • Java-Objekt, das Ergebnisse einer Anfrage enthält • Anfrageergebnisse haben Tabellenform (besitzen Zeilen und Spalten) • Ergebnisse durch getter abfragbar • ResultSet hat Cursor • steht zunächst vor 1. Tupel • gültig bis ResultSet oder Statement geschlossen • mit next() vorwärts • seit 2.0: Scrollbare ResultSets (vor-, rückwärts durchlaufen + zu bestimmter Stelle springen) JDBC
ResultSet (II) • weitere Neuerungen 2.0 • Datenänderungen noch nach Öffnen des ResultSets aktualisiert • änderbare ResultSets, d.h. Tupel der Ergebnismenge in ResultSet und Datenbank änderbar • SQL99-Datentypen (benutzerdefinierte Typen, BLOB, ARRAY...) JDBC
Fehlerbehandlung • Problem: DBMS nutzen z.T. alten oder propritären SQL-Syntax • Lösung: JDBC kontrolliert nicht, ob Anfrage richtig, • Nutzer kann jegliche DBMS-Funktionalität nutzen • wenn Anfrage falsch von DB Fehler erzeugt • auch Fehler bei Verbindungsproblemen, DBMS- oder Hardwarefehlern • Fehler als Exceptions signalisiert – mit try und catch abfangen • Exception bedeutet nicht unbedingt, dass Methode nicht ausgeführt besser explizit zurücksetzen JDBC
Metadaten • DBMS haben unterschiedliche Feature, Datentypen • Metadaten informieren über die Datenbank • DB-Schema, SQL-Dialekt, implementierte Operationen • java.sql.DatabaseMetaData: • Informationen zur Struktur DB oder DBMS • dmd.getURL(); • Anfrage zur Laufzeit vom Nutzer eingegeben, Informationen über ResultSet nötig • Schnittstelle java.sql.ResultSetMetaData: • Informationen zur Struktur des ResultSet • rs.getColumnCount(); JDBC
Zusammenfassung • Standard für DB-Zugriff aus Java • plattform- und datenbankunabhängig • grundlegende Feature einfach, schnell erlernbar • vor 3.0 hauptsächlich grundlegende Möglichkeiten zum Zugriff von Javaprogrammen auf Datenbanken • ab 3.0 DB-Zugriff aus Application Server Schicht (Connection-Pooling-Konfiguration) • viele neue Eigenschaften (ab 2.0) optional und müssen nicht von JDBC-Treibern unterstützt werden • alte Treiber weiter nutzbar JDBC
Literatur • Saake, G., Sattler, K.: Datenbanken & Java: JDBC, SQLJ und ODMG dpunkt.verlag, Heidelberg, Mai 2000. • http://java.sun.com/products/jdbc/ • http://java.seite.net/jdbc/treiber.html • http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/GettingStartedTOC.fm.html • Jansen, R.: Tuning-Center, Java Magazin,7/2003, S.80: Neuerungen aus JDBC 3.0 am Beispiel der Oracle-Datenbank JDBC
Transaktionen • i.d.R. Verbindungen im autocommit-Modus gestartet (einzelnes Statement sofortige Auswirkung auf Datenbank) • mehrere Operationen zusammenfassen: • connection.setAutocommit(false); • so: Änderungen zu beliebigen Zeitpunkt dauerhaft in DB geschrieben (commit()) oder • Änderungen aktueller Transaktion rückgängig gemacht (rollback()) JDBC
Neuerungen in JDBC 3.0 • im Vordergrund DB-Zugriff aus Application Server Schicht • Connection-Pooling-Konfiguration • Savepoints • Wiederverwendung von Prepared Statements • Zugriff auf automatisch generierte Schlüssel • Zugriff auf Metainformtionen von Statement-Parametern • Verbesserungen bei Result-Sets JDBC