1 / 79

THEMA: JDBC/SQL Vortrag: Pascal Gbodogbe am 14.6.2001

THEMA: JDBC/SQL Vortrag: Pascal Gbodogbe am 14.6.2001. TEIL_1: SQL & TEIL_2: JDBC. Einführung:. Durch die Einführung der JDBC-Vorlesung können wir merken: *JDBC stellt eine standarisierte Methode zum Zugriff auf Datenbanken aus Java-Programmen zur Verfügung.

lowri
Télécharger la présentation

THEMA: JDBC/SQL Vortrag: Pascal Gbodogbe am 14.6.2001

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. THEMA: JDBC/SQLVortrag: Pascal Gbodogbe am 14.6.2001 TEIL_1: SQL & TEIL_2: JDBC

  2. Einführung: Durch die Einführung der JDBC-Vorlesung können wir merken: *JDBC stellt eine standarisierte Methode zum Zugriff auf Datenbanken aus Java-Programmen zur Verfügung. *JDBC enthält die Möglichkeiten: • Um Verbindungen zu Datenbanken zu öffnen und zu schließen, • Um SQL-Anweisungen an Datenbanken zu schicken • und um die Antworten entgegenzunehmen und deren Auswertung im Java-Programm zu ermöglichen.

  3. JDBC baut vollständig auf SQL auf. SQL "Standard Query Language". Die Kommunikation zwischen dem Java-Pro- gramm und der Datenbank erfolgt über SQL-Anweisungen. Diese werden als Text an die Datenbank geschickt, die daraufhin als Antwort die Ergebnisse zurückschickt.  Die SQL-Anweisungen werden nicht vom Java-Compiler auf Korrektheit geprüft. Fehler können also erst durch die Datenbank festgestellt werden. Bevor wir in Detail bei JDBC gehen , wollen wir SQL in Überblick sehen.

  4. TEIL_1: SQL • SQL - ein Überblick • Unser Überblick ist unterteilt in : - Tabellendeklaration in SQL, - Anfragen in SQL, - Änderungsoperationen in SQL, und - Definition von Sichten in SQL

  5. Tabellendeklaration in SQL: Bei der Deklaration einer Tabelle müssen folgenden Punkte festgelegt werden: * Attribute als Namen der Spalten, * Wertebereiche als Angaben von Datentypen für die Einträge in Spalten, * Relationenschemata als Typdefinitionen von Tabellen, * Schlüssel zur Festlegung eindeutiger Identifikatoren für Tupel in Tabellen, und * die Deklaration von Fremdschlüssel zur Erzwingung der referentiellen Integrität bei Verweisen auf Einträge in anderen Tabellen.

  6. Die Sprache zur Festlegung von Datenbankbeschreibungen nennt man database definition language, kurz DDL. Die Tabellendeklaration in SQL sieht der Definition von Record-Strukturen in Programmiersprachen nicht unähnlich, erweitert diese aber um die RDBMS-spezifischen Aspecte. Folgende Beispieldeklaration zeigt den prinzipiellen Aufbau: CREATE TABLE book ( isbn VARCHAR ( 30 ) NOT NULL, title VARCHAR ( 50 ) , price FLOAT ); • Wertebereiche für Attribute: Die Möglichen Werte- bereiche für Attribute sind die Datentypen: * integer (oder auch integer4, int ),

  7. * smallint (oder auch integer2), * float (p) (oder auch kurz float), * decimal ( p , q ) und numeric ( p , q ) mit jeweils q Nachkommastellen, * character (n) (oder kurz char(n), bei n = 1 auch char ) für Strings fester Länge n, * character varying (n)(oder kurz varchar(n) ) für Strings variabler Länge bis zur Maximallänge n, * bit (n) oder bit varying (n) analog für Bitfolgen und * date, time bzw. timestamp für Datums-, Zeit- und kombinierte Datums-Zeit-Angaben. • BLOB und CLOB: Eine weitere Neuerung im Standard sind die sogenannten large object-Datentypen BLOB und CLOB. BLOB steht für binary large object; CLOB für

  8. charater large object. Die Werte entsprechender Daten- typen sind ( in der Regel sehr lange ) Folgen von Binär- werten ( bei einem BLOB ) oder von Character-Zeichen (CLOB), wie sie zum Beispiel bei der Abspeicherung eines digitalisierten Photos oder eines unstrukturierten Textes entstehen. • Nullwerte: Mit der Klausel NOT NULL können in bestimmten Spalten Nullwerte als Attributwerte ausge- schlossen werden. • Primärschlüssel: Das folgende Beispiel zeigt die Definition von identifizierenden Schlüsseln ( in SQL als Primärschlüssel bezeichnet: derjenige von mehreren möglichen Schlüsseln, der vom System genutzt und kontrolliert wird) und Fremdschlüsselbeziehung:

  9. CREATE TABLE book ( isbn VARCHAR ( 30 ) NOT NULL, title VARCHAR ( 50 ) , price FLOAT publ_id INTEGER , PRIMARY KEY ( isbn ) , FOREIGN KEY publ_id REFERENCES (publisher) ); • Anfragen in SQL: Eine erste SQL-Anfrage an eine einzelne Tabelle könnte wie folgt lauten: SELECT title , price FROM book WHERE isbn = ‘ 3 - 929821 - 31 - 1 ‘ ; Diese Anfrage gibt die Relation an, aus der Daten gewonnen werden sollen ( hinter FROM ), sowie eine

  10. Selektionsbedingung und die Attribute einer Projektion. Die Angaben der Selektionsbedingung können wie gewohnt durch boolesche Operatoren verbunden werden, die als englische Worte notiert werden (AND, OR und NOT). Als Basisprädikate sind insbesondere die bekannten Vergleichsprädikate erlaubt. • Duplikatunterdrückung: SQL hat eine Multimengensemantik; die Duplikatunter- drückung muß also explizit erzwungen werden, wenn sie erwünscht ist: SELECT DISTINCT lastname FROM author; • Kreuzprodukt: Als wesentliche Möglichkeit, Daten aus zwei Relationen miteinander zu verknüpfen, nutzt SQL das Kreuzprodukt, und nicht den natürlichen Verbund. Die

  11. folgende Anfrage berechnet also das Kreuzprodukt zweier Relationen, wobei die Angabe * die Ausgabe aller Attribute erwirkt: SELECT * FROM book, publisher; • Verbundbedingungen in SQL: Der ( eigentlich erwünschte) Verbund muß durch die Angabe einer Verbundbedingung erzwungen werden. Hierzu müssen gleichlautende Attribute des Kreuz- produktes unterschieden werden - einen expliziten Umbe- nennungsoperator für Zwischenergebnisse wie in der Relationenalgebra kennt SQL nicht. Dies erfolgt über sogenannte Tupelvariablen, die im Standardfall aus den Namen der Relationen abgeleitet werden:

  12. SELECT * FROM book , publisher WHERE book . Publ_id = publisher . Publ_id; • Selbstverbund: Natürlich können auch neue Variablen- namen generiert werden - bei Selbstverbunden ist dies sogar notwendig, wie folgende Anfrage zeigt, die die ISBN von Büchern berechnet, die von zwei Autoren gemeinsam geschrieben wurde: SELECT ba1 . isbn FROM book_author ba1 , book_author ba2 WHERE ba1 . isbn = ba2 . isbn AND ba1 . a_id = 3 AND ba2 . a_id = 4; In der letzten Standardisierungsversion SQL-92 wurden

  13. auch explizite Verbundoperatoren eingeführt. So berechnet die folgende Anfrage tatsächlich den natürlichen Verbund: SELECT * FROM book NATURAL JOIN publisher; Üblich ist aber in SQL-Anwendungen noch die vorher beschriebene Variante, die dem ersten SQL-Standard entspricht. Die erste Variante wird auch von allen RDBMS unterstützt, was beim SQL-92-Standard nicht automatisch im vollem Umfang der Fall ist. • Vereinigung und Differenz in SQL: Der Algebraoperator Vereinigung wird in SQL explizit mit UNION notiert. Der Differenzbildung hingegen wird in der Regel durch geschachtelte Anfragen realisiert, wie folgendes Beispiel zeigt:

  14. SELECT * FROM customer WHERE customer . cust_id NOT IN ( SELECT cust_id FROM book_order ); Da geschachtelte Unteranfragen etwas komplexer in der Semantik und den Syntaktischen Varianten sind, belassen wir es an dieser Stelle mit diesem einfachen Beispiel. • Aggregierung: * Die Aggregatfunktionen COUNT, SUM, AVG, MAX und MIN erlauben es, aggregierte Werte für Spalten zu bilden. • Gruppierung: * Die Gruppierung mittels GROUP BY und HAVING

  15. gruppiert Tupel in einer Relation und erlaubt die Bildung eines aggregierenden Resultats für jede Gruppe. • Sortierung: Die Angabe von ORDER BY sortiert ein Anfrageergebnis. • Änderungsoperationen in SQL In SQL werden die folgenden Änderungsoperationen unterstützt: * Die INSERT-Anweisung ermöglicht das Einfügen eines oder mehrerer Tupel in eine Basisrelation oder Sicht. * Mittels UPDATE können ein oder mehrere Tupel in eine Basisrelation oder Sicht geändert werden. * Die DELETE-Anweisung realisiert das Löschen eines oder mehrerer Tupel aus einer Basisrelation oder Sicht.

  16. DieINSERT-Anweisung: Für das Einfügen mittels INSERT kann man zwei Varianten unterscheiden. In der ersten Variante werden konkrete Werte in eine Tabelle eingetragen: INSERT INTO publisher (publ_id , name) VALUES (1 , ‘ dpunkt - Verlag ‘ ) ; Die Angabe der Attribute hinter dem Tabellenname ist notwendig, wenn nicht alle Attribute gesetzt werden sollen und die restlichen mit Nullwerten gefüllt werden sollen. In der zweiten Variante werden die einzufügenden Tupel mittels einer Anfrage berechnet: INSERT INTO publisher (publ_id , name) ( SELECT id, name FROM company ) ;

  17. Die UPDATE-Anweisung: Die Attributwertänderung mittels UPDATE entspricht dem Zuweisungsoperator aus Programmiersprachen ( so kann der alte Wert zur Berechnung des neuen genutzt werden). UPDATE book SET price = price * 0.9 WHERE stock < 10; Mehrere Attribute einer Tabelle können gleichzeitig gesetzt werden. • Die DELETE-Anweisung: Bei der Löschoperation kann neben der Angabe der Tabelle eine qualifizierende Bedin- gung angegeben werden, die die zu löschenden Tupeln festlegt: DELETE FROM book_order WHERE status = 1;

  18. Definition von Sichten in SQL: • Sichtdefinition in SQL: In SQL wird die Sichtdefinition durch die Schlüsselwörter CREATE VIEW, gefolgt vom Namen der Sicht, eingeleitet. Nach dem Sichtnamen steht im einfachsten Fall das Schlüsselwort AS und eine SQL-Anfrage, die die Sicht definiert (optionale Teile sind in eckige Klammern gesetzt): CREATE VIEW SichtName [ SchemaDeklaration ] AS SQLAnfrage [ WITH CHECK OPTION ] Das Relationenschema der Sicht, also Name und Datentyp der einzelnen Spalten, wird aus der Anfrage abgeleitet und muß nicht explizit angegeben werden. Allerdings kann optional eine SchemaDeklaration hinter dem Sichtnamen

  19. eingefügt werden, in der die Namen der Spalten festgelegt werden können. Dieses Sprachkonstrukt erlaubt auch die Umbenennung von Spalten. • WITH CHECK OPTION: Ein weiterer optionaler Teil einer Sichtdeklaration ist die Angabe der Schlüsselwörter WITH CHECK OPTION am Ende der Sichtdefinition. Diese Angabe legt fest, ob Änderungen der Sicht, die den in ihr nicht sichtbaren Teil der Datenbank beeinflussen, in einem Test erkannt und abgewiesen werden sollen. Das folgende Beispiel zeigt eine Sichtdeklaration in SQL: CREATE VIEW book_info AS SELECT b . isbn, b . title, b . price , a . lastname , a . firstname , p . name FROM book b , book_author ba , author a , publisher p

  20. WHERE b . isbn = ba . isbn AND ba .a_id = a . a_id AND b . publ_id = p . publ_id; • Änderungsoperationen auf Sichten: Soll eine Änderung auf einer Sicht in Änderungen auf der Basisdatenbank umgesetzt werden, müssen eine Reihe von notwendigen oder wünschenswerten Kriterien eingehalten werden: * Effektkonformität: Der Benutzer, der die Änderung auf der Sicht formuliert, soll nach der ausgeführten Änderung auf der Basisdatenbank im nächsten Zustand eine Ausprägung der Sicht erhalten, die dem Effekt entspricht, als wäre die Änderung auf der Sichtrelation direkt ausge- führt worden. Dieses Kriterium fordert in gewissem Sinne die Korrektheit der Transformation.

  21. * Minimalität bei Sichtäderungen: Die Basisdatenbank sollte nur minimal geändert werden, um den erwähnten Effekt zu erhalten. * Konsistenzerhaltung bei Sichtänderungen: Die Änderung einer Sicht darf zu keinen Integritätsverlet- zungen der Basisdatenbank führen. * Zugriffskontrolle bei Sichtänderungen: Wird die Sicht aus Gründen der Zugriffskontrolle eingeführt, darf der bewußt ausgeblendete Teil der Basisdatenbank von Änderungen der Sicht nicht betroffen werden. * Zugriffsrechte: In SQL-Datenbanken wird eine einfache Modellierung von Zugriffsrechten auf Datenbestände unterstützt. Dabei haben Zugriffsrechte den folgenden Aufbau (Subjekt, Objekt, Aktion): (AutorisierungsID, DB-Ausschnitt, Operation)

  22. Die einzelnen Punkte haben die folgende Bedeutung: * Autorisierungsidentifikator: (kurz AutorisierungsID) ist eine interne Kennung eines>>Datenbankbenutzers<<. Eine Typische AutorisierungsID kann die Benutzerkennung des Betriebssystems sein. Andere Beispiele wären Kennungen von Zugreifenden Softwaresystemen oder auch Kennungen von Benutzergruppen. * Datenbank-Ausschnitte sind im Relationenmodell gespeicherte Relationen und Sichten, aber auch ganze Datenbanken oder Schemainformationen. * Unter den Operationen sind insbesondere die klassischen Operationen des Lesens, Einfügens, Änderns und Löschens von Datensätzen zu verstehen. Je nach konkret realisiertem System kommen weitere Operationen beispielsweise zur Verwaltung von Systeminformationen (etwa der Datenver- teilung) hinzu.

  23. * Rechtevergabe mittelsGRANT: Im SQL-Standard werden Rechte mittels der GRANT-Anweisung vergeben, die nach folgendem Muster notiert wird: GRANT Rechte ON Tabelle TO BenutzerListe [WITH GRANT OPTION] Ein Spezialfall der Angabe eines AutorisierungsIDs ist die Angabe PUBLIC. * Trigger: Ein Trigger besteht im wesentlichen aus der Angabe eines Auslösers und der Angabe von auszuführen- den Folgeactionen: CREATE TRIGGER . . . ON Opreation : ( Anweisungen );

  24. Als Beispiel für den Einsatz von Triggern betrachten wir die Realisierung eines berechneten Attributs durch Trigger. Das Beispiel basiert auf zwei Relationen, der Relation customer mit einem zusätzlichen Attribut num_orders für die Anzahl der Aufträge und einer zweiten Relation book_order. Der Wert des Attributs num_orders soll vom System verwaltet werden. Hierzu definieren wir einen Trigger wie folgt: CREATE TRIGGER OrderCounter ON INSERTION OF book_order o: UPDATE customer SET num_orders = num_order + 1 WHERE cust_id = NEW o . Cust_id; Neben dem vorgestellten syntaktischen Grundgerüst der Definition von Triggern sind weitere Angaben möglich,

  25. die insbesondere den Zeitpunkt der Triggeraktivierung betreffen: * Zeitpunkt der Aktivierung von Trigger: Mittels IMMEDIATE bzw. DEFERRED kann der Zeitpunkt der Aktivierung desTriggers festgelegt werden: sofort nach der aktivierenden Operation oder am Ende der Transaktion. Aktuelle Implementierungen unterstützen oft nur den IMMEDIATE-Modus. Die Angabe FOR EACH ROW aktiviert den Trigger für alle Einzeländerungen einer mengenwertigen Änderung separat. Die Angaben BEFORE und AFTER steurn etwa in der aktuellen Version des kommerziellen Systems Oracle, ob der Trigger direkt vor oder nach einer Änderung aktiviert wird.

  26. Mit REFERENCING NEW AS bzw. REFERENCING OLD AS kann eine Tupelvariable an die neu eingefügten bzw. gerade gelöschten (>>alten<<) Tupel einer Relation gebunden werden. Diese >>neuen<< bzw. >>alten<< Tupel werden auch als Elemente der sogenannten Differenzrelation bezeichnet.

  27. TEIL_2: JDBC • JDBC: Java DataBase Connectivity • Das JDBC-Package stellt eine vollständige Schnittstelle zu SQL-Datenbanken zur Verfügung und erlaubt damit den Einsatz von Java-Programmen und Java-Applets (Applet ist eine Bezeichnung für ein Java-Progamm, das in eine HTML-Seite integriert ist.) als Front-Ends für kommerzielle Applikationen. • JDBC erfordert die direkte Nutzung von SQL-Anweisun-gen (Low-Level-API (Application Programmer Interface) )

  28. JDBC besteht einer Menge von Klassen und Schnittstellen, die im Java-Package java . sqlzusammengefaßt sind. Die wichtigsten Klassen und Schnittstellen sind hierbei: • java . sql . DriverManager: bildet den Einstiegspunkt, in- dem über diese Klasse Treiber registriert und Verbindun- gen zur Datenbank aufgebaut werden können. • Java . sql . Connection: repräsentiert eine Datenbankver- bindung. • Java . sql . Statement: ermöglicht die Ausführung von SQL-Anwendungen über eine gegebene Verbindung. • Java . sql .ResultSet: verwaltet die Ergebnisse einer Anfra-ge in Form einer Relation und unterstützt den Zugriff auf einzelne Spalten.

  29. JDBC am Beispiel • Ablauf einer JDBC-Anwendung • Um die verschiedenen Aspekte der JDBC-Programmie- rung einzugehen, wollen wir uns mit einigen kurze Beis- piele befassen. Diese Programmausschnitte sollen die An-wendung der wichtigsten Klassen demonstrieren und gleichzeitig illustrieren, wie die Benutzung von JDBC ist. Der prinzipielle Ablauf einer JDBC-Datenbankanwen-dung umfaßt die folgenden Schritte: 1. Aufbau einer Verbindung zur Datenbank 2. Senden einer SQL-Anweisung 3. Verarbeiten der Anfrageergebnisse

  30. Explizites Laden Voraussetzung für den Aufbau einer Datenbankverbindung ist das Laden eines geeigneten Treibers. Hierzu werden in JDBC zwei Varianten unterstützt. Zum einen kann der Treiber (d.h. die Java-Klasse des Treibers) explizit im Pro- gramm geladen werden: Class . forName( “ oracle . jdbc . driver .OracleDriver “); • Automatisches Laden Bei der zweiten Variante wird eine Liste von Treibern, je- weils getrennt durch doppelpunkt, in der Systemeigen- schaft ( Property ) sql . driversfestgelegt, die vom Treiber- manager beim Start automatisch geladen werden. In bei- den Fällen müssen sich die Treiber nach dem Laden selbs- tändig beim Treibermanager registrieren.

  31. Verbindungsaufbau Der nächste Schritt ist der Verbindungsaufbau. Hierfür stellt der Treibermanager, d. h. die Klasse Java . sql . Dri- verManager, eine eigene Methode getConnectionbereit. Als Argument dieser Methode muß eine URL (Uniform Resource Locator)angegeben werden, die den Verbindungs mechanismus und damit den zu verwendenden Treiber be-zeichnet. Zusätzlich sind noch Benutzername und Pass- wort zu übergeben. Der Aufruf der Methode liefert im Erfolgsfall ein Connection-Objekt. Connection con; String url = “ jdbc:oracle:thin:@antarctica:1521:mydb “ ; con = DriverManager . getConnection (url , “tux“ , “ pingus “ );

  32. Mit dem Connection-Objekt kann nun eine SQL-Anwei- sung erzeugt werden. Wir wollen zunächst eine einfache Anfrage betrachten, die mit executeQuery ausgeführt wird. String query = “ SELECT title, price, “ + “ stock FROM book “; Statement stmt = con.createStatement ( ) ; ResultSet rs = stmt .executeQuery ( query); • Ausführung von Anfragen Die executeQuery-Methode liefert ein ResultSet-Objekt, das die Ergebnisse der Anfrage verwaltet. Die Navigation über die Ergebnismenge erfolgt nach dem Cursor-Prinzip. Die Ergebnismenge kann als eine Tabelle angesehen werden, auf die zunächst zeilenweise und dann spaltenweise zuge-

  33. griffen werden kann. In JDBC existiert jedoch kein expli-ziter Cursor, vielmehr wird die aktuelle Position in der Er- gebnismenge vom ResultSet intern verwaltet. Zum Weiter- setzen des Cursors wird die Methode next verwendet. Diese Methode liefert so lange den Wert true, bis das Tabellen- ende erreicht ist. Außerdem ist zu beachten, daß der ResultSet-Cursor zu Beginn vor dem ersten Tupel posi- tioniert ist, d.h., bevor ein Tupel gelesen werden kann, muß die Methode next aufgerufen werden. • Zugriff auf Spalten Nachdem der Cursor positioniert ist, können die Spalten- werte des aktuellen Tupels ausgelesen werden. Hierfür ste- hen eine Reihe von getXXX-Methoden für die verschiede-

  34. nen Datentypen und die korrespondierenden Java-Typen zur Verfügung. So heißt die Methode zum Lesen einer Zei- chenkette beispielsweise getString, wobei der Attributtyp der Relation hier VARCHARund der Java-Typ des Ergeb- nisses java .Lang . String ist. Der Zugriff auf eine konkre- te Spalte der Ergebnisrelation mit Hilfe der getXXX-Metho- den erfolgt entweder über den Index der Spalte oder den Spaltennamen. Wichtig ist dabei, daß der Spaltenindex mit 1 beginnt, d. h., die erste Spalte wird durch 1 bezeichnet, die zweite mit 2 usw. Insgesamt kann das Ergebnis der Anfrage wie folgt ausgewertet werden: while (rs . next ( ) ) { String s = rs . getString (1);

  35. double d = rs .getDouble (2); int i = rs .getInt (3); System . out .println(s + “ “ + d + “ “ + i ); } • Ressourcenfreigabe Zum Abschluß werden die benutzten Ressourcen durch Aufruf der close-Methoden von ResultSet und Statement freigegeben: rs .close ( ); stmt .close ( ); • Fehlerbehandlung Fehler werden in JDBC grundsätzlich als Ausnahmen (Exception ) der Klasse SQLExceptionsignalisiert und sind daher in geeigneter Weise mit einem try…catch-Block ab-

  36. zufangen und zu behandeln.Details zu einem aufgetretenen Fehler können über die MethodegetMessageermittelt wer-den, die eine Zeichenkette mit der Beschreibung des Fehlers liefert. Der entsprechende Programmausschnitt zur Fehlerbehandlung ist danach wie folgt zu formulieren: try { / / Aufruf von JDBC-Anweisungen, / / die Exception generieren } catch ( SQLException exc) { System . out . println ( “ SQLException: “ + exc . getMessage ( ) ); } Mit Hilfe der bisher vorgestellten Klassen und Methoden

  37. können wir nun die erste vollständige JDBC-Anwendung erstellen. Beispiel 1. JDBC-Programm import java . sql .*; public class JdbcDemo1 { public static void main (String [ ] args) { String driverClass = “ oracle . jdbc . driver . OracleDriver “; try { Class . forName ( driverClass ); } catch ( ClassNotFoundException exc ) { System . out . Println ( exc . getMessage ( ) ); System .exit ( 1 ); }

  38. try { String url = “jdbc : oracle : thin:@antarctica:1521:mydb“; String query = “ SELECT title, price, “ + “ stock FROM book “; Connection con = DriverManager . getConnection ( url , “ tux“ , “ pingus “ ); Statement stmt = con .createStatement ( ); ResultSet rs = stmt . executeQuery (query); while ( rs . next ( ) ) { String s = rs . getString (1); double d = rs . getDouble (2);

  39. int i = rs . getInt (3); System . out . println ( s + “ , “ + d + “ DM, “ + i ); } } catch ( SQLException exc ) { System . out . println (“ SQLException: “ + exc . getMessage ( ) ); } } } Nachdem wir einen ersten Überblick zur Anwendungsentwic- klung mit JDBC gewonnen haben, werden wir nun auf wichtige Aspekte im Detail eingehen.

  40. JDBC im Detail • Verbindungsinformationen Datenbank: mydb; Server: antarctica ; Benutzer: tux ; Paßwort: pingus. • Treiber und Datenbankverbindung • Treibermanager Der Treibermanager implementiert in der Klasse java .- sql .DriverManagerund bildet die Vermittlungsschicht zwischen Anwendung und Datenbanktreiber. Da es in jeder Java-Anwendung nur einen Treibermanager geben kann, sind alle Methoden statisch. Die Methoden lassen

  41. sich grob in drei Gruppen einteilen: • Registrieren und Laden von Treibern, • Herstellen einer Verbindung zur Datenbank, • Konfigurieren der Verbindung (Protokollierung, Login- Timeout). • Laden von Treibern -Explizit durch Laden der Treiber Hierbei wird der JDBC-Treiber über den Aufruf von Class . forName direkt geladen. Einzige Voraussetzung für diese Methode ist ein Java-Klassenpfad, der die Klassen des benötigten JDBC-Treibers enthält. Da keine weiteren Konfigurationen notwendig sind, ist dies wohl die Methode, die am häufigsten eingesetzt wird.

  42. -Über die Systemeigenschaft sql . Driver Die Systemeigenschaft ( Property) umfaßt eine Liste von Treibern, die durch Doppelpunkt getrennt sind. Bei der Ini- tialisierung des Treibermanagers, d. h. beim ersten Aufruf einer Klassenmethode, werden alle dort angegebenen Trei-ber geladen. Die Eigenschaft kann z. B. beim Aufruf des Java-Interpeters angegeben werden: java -Djsql . drivers = foo . bar . Driver JdbcDemo1 Eine weitere Möglichkeit sind Property-Files, wie z. B. durch den Browser HOTJAVA oder den Applet-Viewer ausgewertet werden. In beiden Fällen ist der Name der Klasse der Dokumenta- tion des Herstellers zu entnehmen. Diese Tabelle zeigt einige wichtige Treiberklassen.

  43. DBMSTreiberklasse Klassennamen einiger JDBC - Treiber Oracle 8 oracle . jdbc . driver . OracleDriver DB2 COM . ibm . db2 . jdbc . app .DB2Driver MiniSQL com . Imaginary . sql . msql . MsqlDriver MySQL org .gjt . mm . mysql . Driver ODBC sun . jdbc . odbc . JdbcOdbcDriver

  44. Treiber Registrierung von Tribern Wird ein JDBC-Treiber geladen, so muß dieser sich beim Treibermanager registrieren. Hierzu existieren die Metho- de / / java . sql . DriverManager static void registerDriver (Driver driver) throws SQLException; Die Methode wird normalerweise in einem Initialisierungs-block ( ein static {…. }-Block) der Treiberklasse aufgeru- fen, der beim Laden der Klasse über Class . forName aus-geführt wird und die Treiberregistrierung vornimmt. Für die Deregistrierung gibt es eine entsprechende Metho- de deregisterDriver. Beide Methoden sind aber nur für

  45. Entwickler für Datenbanktreibern interessant. Weiterhin kann man explizit den Treiber für eine gegebe- nen JDBC-URL anfordern oder mittels eines Iterators über alle geladenen Treiber navigieren: / / java . sql . DriverManager static Driver getDriver (String url) throws SQLException; static java . Util . Enumeration getDrivers ( ) * Iteraor (Enumeration) Ein für Container-Klassen ( wie Listen, Bäume, Felder, usw. ) sehr nützliches Interface, das eine Möglichkeit bereitstellt, alle Elemente des Containers nacheinander zu referenzieren.

  46. Das folgende Beispiel zeigt die Typische Anwendung einerEnumeration e: for (Enumeration e = v . elements ( ) ; e . hasMoreElements ( ) ; ) { System . out .println (e . nextElement ( ) ) ; } Aufbau einer Datenbankverbindung Verbindungsaufbau Nach dem Laden eines Treibers kann die Verbindung zur Datenbank aufgebaut werden. Der Treibermanager stellt hierfür drei verschiedene Methoden bereit, die sich nur in der Form der Parameterlisten unterscheiden:

  47. / / java . sql . DriverManager static Connection getConnection ( String url ) throws SQLException; static Connection getConnection ( String url ,java . util . Properties info ) throws SQLException; static Connection getConnection (String url ,String user , String password) throws SQLException; JDBC-URL Alle Methoden erwarten einen Uniform RessourceLocator (URL)als Parameter und liefern ein Connection-Objekt. Die JDBC-URLs sind im Aufbau an die aus dem Web bekannten URLs angelehnt. Sie haben grundsätzlich folgende Form: jdbc : < subprotocol > : < subname >

  48. Hierbei bezeichnen < subprotocol > den Mechanismus zur Datenbankverbindung (z. B. ein konkretes Protokoll) und < subname > ein Identifikator für die Datenbank. Der <subname >-Teil ist außerdem abhängig vom Protokoll und kann auch eine Netzwerkadresse beinhalten. Dagegen müssen für eine Verbindung zu einer Oracle-Datenbank die Netzwerkadresse (Hostname und Port) des Datenbankservers bzw. Des Listener-Prozesses sowie der Name der Datenbank angegeben werden : jdbc : oracle : thin : @antarctica : 1521 : mydb Beim Aufruf der Methode getConnection versucht der Trei- bermanager einen Treiber zu finden, der die angegebene URL akzeptiert. Dazu werden alle geladenen Treiber nach einander getestet, d. h ., es wird die Methode acceptsURL-

  49. von java . sql .Driver aufgerufen. Mit dem ersten gefunde-nen Treiber wird die Verbindung zur Datenbank herge- stellt. Als weitere Parameter für den Verbindungsaufbau sind insbesondere Benutzername und Paßwort anzugeben, entweder direkt oder als Schlüssel-Wert-Paare in Form eines Property-Objektes. Timeouts und Protokollierung Timeout : Mit den weiteren Methoden der Klasse Driver-Manager kann die maximale Wartezeit für das Anmelden bei der Datenbank (Timeout) abgefragt bzw. geändert wer- den. Die Zeitangabe erfolgt dabei jeweils in Sekunden: / / java . sql . DriverManager static int getLoginTimeout ( ) static void setLoginTimeout (int seconds)

  50. Tracing : Schließlich kann noch ein Ausgabestrom für die Protokollierung (Tracing) vom Treibermanager sowie den Treibern angegeben werden: / / java . sql . DriverManager static java . io . PrintStream getLogStream ( ) static void setLogStream ( java . io . PrintStream out ) Als Parametermuß hier ein Stream-Objekt eingesetzt wer-den, wie z. B. System . out oderein Strom auf einer geöff- netenDatei. Auf diese Weise lassen sich Fehlermeldungen protokollieren. Durch Übergabe von null als Parameter kann die Protokollierungwieder abgeschaltet werden. Diese Methoden sind in JDBC2 durch setLogWriter bzw. getLogWriter ersetzt, die einenPrintWriter-Strom als Para-meter bzw. Ergebnis verwenden.

More Related