11. Datenbankschnittstellen Inhalt § 11.1 Motivation § 11.2 Eingebettetes SQL § 11.3 Open Database Connectivity (ODBC) § 11.4 Java Database Connectivity (JDBC) § 11.5 Objekt-Relationale Abbildung (ORM) Datenbanken / Kapitel 11: Datenbankschnittstellen 2 11.1 Motivation § Datenbankschnittstellen ermöglichen den Zugriff auf die gespeicherten Daten aus einer externen Anwendung § DBMS und Anwendung laufen oft auf unterschiedlichen Rechnern, so dass Netzwerkkommunikation nötig ist § Zwei Zielgruppen von Datenbankschnittstellen § Endbenutzer, die Daten mit bekannten oder einfach zu bedienenden Anwendungen lesen bzw. ändern möchten § Entwickler, die aus Code der entwickelten Anwendung auf die Daten zugreifen möchten Datenbanken / Kapitel 11: Datenbankschnittstellen 3 Anwendungsbeispiele § Anwendungsbeispiele von Datenbankschnittstellen: § Webapplikation (z.B. ein Content-Management-System), welche mit Java Server Pages implementiert wurde, greift auf eine Datenbank (z.B. MS SQL Server) zu § Mitarbeiterin erstellt Serienbrief mit MS Word, der an alle Kunden geschickt werden soll; die Kundendaten liegen in einer Datenbank (z.B. MS SQL Server) § Applikation auf Smartphone speichert ihre internen Daten in einer eingebetteten Datenbank (z.B. SQLite), die auf dem gleichen Endgerät läuft Datenbanken / Kapitel 11: Datenbankschnittstellen 4 Anforderungen § Anforderungen an Datenbankschnittstellen sind u.a. § Portabilität, d.h. kann das verwendete RDBMS oder die Programmiersprache einfach ausgetauscht werden § Fehleranfälligkeit, d.h. werden Fehler (z.B. inkorrektes SQL) bereits bei der Entwicklung oder erst beim Einsatz erkannt § Wartbarkeit, d.h. erfordert Änderung (z.B. des Schemas) weitreichende Modifikationen des zugreifenden Codes § Transparenz, d.h. bleiben die Spezifika des RDBMS bzw. der Datenbank (z.B. Schema) verborgen Datenbanken / Kapitel 11: Datenbankschnittstellen 5 Historisches § Call-Level Interfaces (CLIs) als früher Ansatz, bei dem Hersteller sprachspezifische (z.B. für C oder Fortran) Schnittstellen für bestimmtes Datenbanksystem in Form von Bibliotheken zur Verfügung stellen § Eingebettetes SQL erweitert Wirtssprache (z.B. C) um SQL-Kommandos, die vor Compilierung in Befehle der Wirtssprache (z.B. CLI-Aufrufe) übersetzt werden § SQL/CI als standardisierte Schnittstelle in SQL:1999, die die Grundlage für Open Database Connectivity darstellt Datenbanken / Kapitel 11: Datenbankschnittstellen 6 Historisches § Open Database Connectivity (ODBC) entkoppelt Programmiersprache und Datenbanksystem durch Verwendung von Treibern § Java Database Connectivity (JDBC) als moderne objektorientierte Standardschnittstelle für Anwendungen in Java § Frameworks für objekt-relationale Abbildung (z.B. Java Persistence und Hibernate) bilden Objekte mit Attributen auf Tabellen mit Spalten ab; die Datenbank kann den Entwicklern dabei verborgen bleiben, so dass keine SQL-Kenntnisse notwendig sind Datenbanken / Kapitel 11: Datenbankschnittstellen 7 11.2 Eingebettetes SQL § Eingebettetes SQL erweitert eine Wirtssprache (z.B. C) um SQL-Kommandos für den Datenbankzugriff § Erweiterungen sind keine eigentlichen Kommandos der Wirtssprache, so dass Code vor der eigentlichen Compilierung durch einen Präcompiler transformiert werden muss § Präcompiler übersetzt die erweiterten Kommandos in eigentliche Kommandos der Wirtssprache (z.B. CLI-Aufrufe für Datenbankzugriff) Datenbanken / Kapitel 11: Datenbankschnittstellen 8 Eingebettetes SQL § Präcompiler kann Korrektheit der SQL-Kommandos, auch ob sie kompatibel mit dem Schema sind, überprüfen § Eingebettetes SQL oft auf statische SQL-Kommandos beschränkt, d.h. die Kommandos müssen zur Übersetzungszeit bereits feststehen § Eingebettetes SQL spielt heute eine geringere Rolle § SQLJ für Java § Embedded SQL für C/C++ Datenbanken / Kapitel 11: Datenbankschnittstellen 9 SQLJ für Java § SQL-Kommandos werden mit #sql ausgezeichnet und in Java-Code eingebettet § Erweiterter Code muss mittels Präcompiler sqlj in echten, für den Java-Compiler verständlichen, Code umgewandelt werden § Präcompiler überprüft, ob SQL-Kommandos korrekte Syntax haben, ob sie mit dem Schema übereinstimmen und die Typkompatibilität für den Datenaustausch § Generierter Code greift per JDBC auf Datenbank zu Datenbanken / Kapitel 11: Datenbankschnittstellen 10 SQLJ für Java § SQL-Kommandos werden mit #sql ausgezeichnet und in Java-Code eingebettet 1 2 # sql { INSERT INTO Studenten ( MatrNr , Name , Vorname ) VALUES (23781 , ’ Max ’ , ’M ü ller ’ )} § Wirtsvariablen erlauben Datenaustausch zwischen Java-Code und SQL-Kommandos 1 2 long matrnr = 23781; # sql { DELETE FROM Studenten WHERE MatrNr = : matrnr }; Datenbanken / Kapitel 11: Datenbankschnittstellen 11 SQLJ für Java § Iteratoren zum Lesen eines Anfrageergebnis in Java müssen vor Verwendung deklariert werden 1 # sql iterator StudentIter ( long matrnr , String vorname , String name ); hierdurch wird eine Klasse StudentIter generiert § Definition einer Instanz der Klasse StudentIter und Ausführung der zugehörigen Anweisung 1 2 StudentIter iter ; # sql iter ={ SELECT MatrNr , Name , Vorname FROM Studenten }; Datenbanken / Kapitel 11: Datenbankschnittstellen 12 SQLJ für Java § Navigation durch das Anfrageergebnis 1 2 3 4 while ( iter . next ()) { System . out . println ( iter . matrnr () + " " + iter . vorname () + " " + iter . name ()); } § SQLJ-Code wird in Dateien mit Endung .sqlj abgelegt, um ihn von regulären Java-Code zu unterscheiden § SQLJ unterstützt, mit Einschränkungen, dynamisches SQL: SQL-Kommandos können parametrisiert werden und somit erst zur Laufzeit genau definiert sein Datenbanken / Kapitel 11: Datenbankschnittstellen 13 SQLJ für Java 1 2 3 import java . sql .*; import sqlj . runtime . ref . DefaultContext ; import oracle . sqlj . runtime . Oracle ; 4 5 # sql iterator StudentIter ( long matrnr , String vorname , String name ); 6 7 8 9 10 11 12 13 public class StudentExample { public static void main ( String args []) throws SQLException { // Verbindung zur Datenbank herstellen Oracle . connect ( " jdbc : oracle : thin : @sw03 :5521: hs " , " user " , " password " ); 14 // Iterator definieren StudentIter iter ; # sql iter ={ SELECT MatrNr , Name , Vorname FROM Studenten }; 15 16 17 18 19 20 21 22 23 24 25 } } // Datens ä tze lesen while ( iter . next ()) { System . out . println ( iter . matrnr () + " " + iter . vorname () + " " + iter . name ()); } Datenbanken / Kapitel 11: Datenbankschnittstellen 14 Embedded SQL für C 1 2 3 # include < string .h > # include < stdio .h > # include < ctype .h > 4 5 6 // Variablen von SQL - Communication Area einbinden EXEC SQL INCLUDE SQLCA ; 7 8 int main ( int argc , char ** argv ) { 9 10 11 12 13 14 15 16 17 // Deklaration von Variablen EXEC SQL BEGIN DECLARE SECTION ; VARCHAR uid [80]; VARCHAR pwd [20]; VARCHAR db [20]; VARCHAR vorname [30]; VARCHAR name [20]; EXEC SQL END DECLARE SECTION ; 18 // Verbindungsdaten setzen 20 strcpy ( uid . arr , " user " ); 21 uid . len = strlen ( uid . arr ); 22 strcpy ( pwd . arr , " password " ); Datenbanken / Kapitel 11: Datenbankschnittstellen 19 15 VARCHAR vorname [30]; VARCHAR name [20]; EXEC SQL END DECLARE SECTION ; 15 Embedded SQL für C 16 17 18 // Verbindungsdaten setzen strcpy ( uid . arr , " user " ); uid . len = strlen ( uid . arr ); strcpy ( pwd . arr , " password " ); pwd . len = strlen ( pwd . arr ); strcpy ( db . arr , " hochschule " ); db . len = strlen ( db . arr ); 19 20 21 22 23 24 25 26 // Verbindung zur Datenbank herstellen EXEC SQL CONNECT : uid IDENTIFIED BY : pwd USING : db ; 27 28 29 // Anfrage an Datenbank schicken EXEC SQL SELECT Name , Vorname FROM Studenten INTO : name , : vorname WHERE MatrNr = 23786; 30 31 32 33 34 35 // Name und Vorname ausgeben printf ( " Der Student heisst % s % s " , vorname , name ); 36 37 38 39 } Datenbanken / Kapitel 11: Datenbankschnittstellen 16 11.3 Open Database Connectivity (ODBC) § Open Database Connectivity (ODBC) in den 1990ern von Microsoft entwickelt und Grundlage für den von der SQL Access Group (SAG) entworfenen Standard SQL/CLI § Portabilität als Ziel von ODBC, d.h. Anwendung soll unabhängig vom verwendeten RDBMS (oder allgemein: Datenquelle) sein und deren Austausch soll einfach erfolgen können Datenbanken / Kapitel 11: Datenbankschnittstellen 17 Treibermanager und Treiber § ODBC erreicht Portabilität durch Verwendung von Treiber als Vermittler zwischen Anwendung und Datenquelle (vgl. Druckertreiber und Office-Anwendungen) § Anwendung kommuniziert mit Treibermanager über Aufrufe von festgelegten ODBC-Funktionen (z.B. SQLConnect zum Aufbau einer Verbindung) § Datenquellen (z.B. Datenbank oder .CSV-Datei) sind beim Treibermanager registriert § Treiber übersetzt ODBC-Funktionsaufrufe für die jeweilige Datenquelle um Datenbanken / Kapitel 11: Datenbankschnittstellen 18 Treibermanager und Treiber Anwendung Treibermanager Treiber RDBMS Treiber CSV RDBMS CSV Datenbanken / Kapitel 11: Datenbankschnittstellen 19 Treibermanager und Treiber § Abhängig von der Art der ODBC-Datenquelle muss der Treiber selbst mehr oder weniger leisten, z.B. § bei einem mächtigen RDBMS (z.B. MS SQL Server) können die SQL-Kommandos an das RDBMS unverändert weitergereicht werden § bei einer einfachen Datenquelle (z.B. CSV-Dateien) muss der Treiber selbst sich um die Ausführung von SQL-Kommandos kümmern, d.h. intern ein DBMS (z.B. mit Selektion, Projektion und Join) implementieren Datenbanken / Kapitel 11: Datenbankschnittstellen 20 ODBC-Funktionen § ODBC definierte drei Ebenen von Funktionen (API-levels) § Core-Level Funktionen z.B. § SQLConnect zum Aufbau einer Verbindung zu einem Treiber § SQLAllocStmt zum Anlegen eines SQL-Kommandos § Level-1 Funktionen z.B. § SQLGetInfo zum Erfragen von Informationen über den Treiber § SQLGetTypeInfo zum Erfragen unterstützter Datentypen § Level-2 Funktionen z.B. § SQLColumnPrivilege zum Erfragen verfügbarer Spalten § SQLPrimaryKeys zum Erfragen von Primärschlüsselattributen Datenbanken / Kapitel 11: Datenbankschnittstellen 21 SQL-Unterstützung in ODBC § ODBC kennt drei Ebenen (levels) der SQL-Unterstützung § Minimale SQL-Grammatik § CREATE TABLE und DROP TABLE § INSERT, SELECT und UPDATE § keine Gruppierung und Aggregation, keine Funktionen § nur Datentyp CHAR § Core SQL § zusätzlich z.B. ALTER TABLE, CREATE INDEX, CREATE VIEW § vollständiges INSERT, SELECT und UPDATE § Datentypen z.B. VARCHAR, DECIMAL, NUMERIC, SMALLINT Datenbanken / Kapitel 11: Datenbankschnittstellen 22 SQL-Unterstützung in ODBC § Extended SQL § auch OUTER JOIN in SELECT § skalare Funktionen wie SUBSTRING oder ABS § zusätzliche Datentypen z.B. DATE und TIME § Stapelverarbeitung von SQL-Kommandos § Anlegen gespeicherter Prozeduren § Portabilität und Performanz der Anwendung hängt von verwendetem API-Level und SQL-Unterstützung ab; ein höherer API-Level und eine höhere SQL-Unterstützung führen zu besserer Performanz, aber eben auch zu geringerer Portabilität Datenbanken / Kapitel 11: Datenbankschnittstellen 23 Datenbankzugriff mittels ODBC aus C 1 # include " SQL . H " 2 3 int main ( int argc , char ** argv ) { 4 5 6 // Umgebungs - Handle belegen SQLAllocConnect ( henv , & hdbc ); SQLAllocEnv ( & henv ); 7 8 9 // Verbindungs - Handle belegen rc = SQLConnect ( hdbc , server , SQL_NTS , uid , SQL_NTS , pwd , SQL_NTS ); 10 11 12 13 // Verbindung aufbauen , Abbruch bei Fehler if ( rc != SQL_SUCCESS && rc != SQL _SUC CESS _WITH _INF O ) return ( print_err ( hdbc , SQL_NULL_HSTM )); 14 15 16 // Speicherplatz f ü r SQL - Befehle belegen SQLAllocStmt ( hdbc , & hstmt ); 17 18 19 20 // SQL - Kommando zum Anlegen einer Tabelle in String szSql = " CREATE TABLE Studenten ( MatrNr INTEGER , Vorname VARCHAR (30) , Name VARCHAR (30)) " ; 21 22 23 24 // SQL - Kommando ausf ü hren , Abbruch bei Fehler if ( SQLExecDirect ( hstmt , szSql , SQL_NTS ) != SQL_SUCCESS ) return ( print_err ( hdbc , hstmt ); 25 26 // Anlegen der Tabelle mit COMMIT abschlie ß en Datenbanken / Kapitel 11: Datenbankschnittstellen 24 return ( print_err ( hdbc , SQL_NULL_HSTM )); 13 Datenbankzugriff // Speicherplatz f ü r mittels SQL - BefehleODBC belegen aus C 14 15 SQLAllocStmt ( hdbc , & hstmt ); 16 17 // SQL - Kommando zum Anlegen einer Tabelle in String szSql = " CREATE TABLE Studenten ( MatrNr INTEGER , Vorname VARCHAR (30) , Name VARCHAR (30)) " ; 18 19 20 21 // SQL - Kommando ausf ü hren , Abbruch bei Fehler if ( SQLExecDirect ( hstmt , szSql , SQL_NTS ) != SQL_SUCCESS ) return ( print_err ( hdbc , hstmt ); 22 23 24 25 // Anlegen der Tabelle mit COMMIT abschlie ß en SQLTransact ( hdbc , SQL_COMMIT ); 26 27 28 // Ressourcen wieder freigeben und Verbindung schlie ß en SQLFreeStmt ( hstmt , SQL_DROP ); SQLFreeConnect ( hdbc ); SQLFreeEnv ( henv ); 29 30 31 32 33 34 35 } return 0; Datenbanken / Kapitel 11: Datenbankschnittstellen 25 Datenbankzugriff mittels ODBC aus Excel § ODBC hat sich als Standardschnittstelle etabliert und wird von Standardsoftware (z.B. MS Office) unterstützt; dies erlaubt u.a. folgende Anwendungsszenarien § MS Excel und MS Access können als Frontend zum Lesen und Ändern von in einem RDBMS gespeicherter Daten verwendet werden § Serienbriefe können in MS Word mittels Zugriff auf in RDBMS gespeicherter Daten generiert werden § MS Excel kann als ODBC-Datenquelle dienen, d.h. Datenblätter können mittels SQL angefragt werden Datenbanken / Kapitel 11: Datenbankschnittstellen 26 11.4 Java Database Connectivity (JDBC) § Java Database Connectivity (JDBC) von SUN (Oracle) stellt eine Schnittstelle zum Datenbankzugriff aus Java-Anwendungen bereit § Ähnlich zu ODBC kommen Treiber zum Einsatz, um Anwendung und Datenbanksystem zu entkoppeln § JDBC-to-ODBC und ODBC-to-JDBC Brücken erlauben Verwendung von ODBC-Datenquellen in Java bzw. JDBC-Datenquellen in Anwendungen mit ODBC-Unterstützung § Klassen im Paket java.sql als Teil des Standard SDK Datenbanken / Kapitel 11: Datenbankschnittstellen 27 Treibermanager und Treiber § Treibermanager (DriverManager) erzeugt Verbindung (Connection) mit einem Treiber und Verbindungsdaten (z.B. Benutzername und Passwort) § JDBC unterscheidet vier Typen von Treibern § Typ 1 übersetzt JDBC in ODBC (JDBC-to-ODBC Brücke) § Typ 2 verwendet CLI des jeweiligen RDBMS § Typ 3 verwendet systemunabhängige Middleware § Typ 4 kommuniziert direkt mit dem jeweiligen RDBMS § Treiber wird in Form eines JAR-Files zur Verfügung gestellt und muss sich im Classpath befinden Datenbanken / Kapitel 11: Datenbankschnittstellen 28 Ablauf einer Interaktion mit RDBMS via JDBC § Interaktion mit RDBMS via JDBC hat folgende Phasen 1. Aufbau der Verbindung (erzeugt ein Instanz der Klasse Connection) 2. Anlegen eines SQL-Kommandos (als Instanz der Klasse Statement) 3. Senden des SQL-Kommandos (durch Aufruf einer Methode des Statement) 4. Verarbeiten des Ergebnis • Anzahl geänderter Zeilen z.B. bei DELETE und UPDATE • Ergebnismenge als Instanz von ResultSet bei SELECT 5. Freigeben der Ressourcen und Schließen der Verbindung Datenbanken / Kapitel 11: Datenbankschnittstellen 29 Verbindung (Connection) aufbauen § Treiber für das RDBMS muss geladen werden 1 Class . forName ( " com . microsoft . sqlserver . jdbc . SQLServerDriver " ) 1 Class . forName ( " org . sqlite . JDBC " ) § Verbindungsdaten werden in Form einer URL angegeben 1 2 3 1 2 String connectionUrl = " jdbc : sqlserver :// swl - srv03 ; " + " databaseName = Versandhandel ; + " user = XXX ; password = XXX " ; String connectionUrl = " jdbc : sqlite :/ home / user / " + " dbs - versandhandel . sqlite " Datenbanken / Kapitel 11: Datenbankschnittstellen 30 Verbindung (Connection) aufbauen § Verbindung zum RDBMS aufbauen 1 2 3 4 5 6 7 8 Connection conn = null ; try { Connection conn = DriverManager . getConnection ( connectionUrl ); } catch ( SQLException sqle ) // sp ä ter mehr } finally { if ( conn != null ) try { conn . close ();} catch ( SQLException sqle ) {}; } § Verwendung von try-catch-finally Blöcken stellt sicher, dass die Verbindung auch bei Auftreten eines Fehlers geschlossen wird § Grundsätzlich sind JDBC-Objekte zu schließen, da sie Ressourcen auf dem Client (z.B. Speicher) und dem Server (z.B. Sockets) belegen Datenbanken / Kapitel 11: Datenbankschnittstellen 31 SQL (Statement) § Instanz von Statement anlegen 1 2 Statement stmt = null ; // vor try stmt = conn . createStatement (); // im try § Sofern es sich um ein UPDATE, DELETE oder INSERT handelt, wird das Kommando wie folgt ausgeführt 1 2 int n = stmt . executeUpdate ( " DELETE FROM Studenten " ); // im try System . out . println ( " Es wurden " + n + " Zeilen ge ä ndert " ); mit Anzahl geänderter Zeilen als Rückgabewert § Schließen des Statement 1 stmt . close (); // sp ä testens im catch Datenbanken / Kapitel 11: Datenbankschnittstellen 32 Ergebnis (ResultSet) § Handelt es sich um ein SELECT, wird das Kommando wie folgt ausgeführt 1 2 3 4 5 ResultSet rs = null ; // vor try stmt = conn . createStatement (); // im try rs = stmt . executeQuery ( " SELECT MatrNr , Vorname , Name " " FROM Studenten " ); // im try mit Instanz von ResultSet als Rückgabewert § ResultSet ähnelt dem Cursors-Konzept in TransactSQL und erlaubt ein Navigieren im Anfrageergebnis; ein Ändern der Daten ist jedoch nicht möglich Datenbanken / Kapitel 11: Datenbankschnittstellen 33 Ergebnis (ResultSet) § Ergebnismenge in ResultSet lässt sich wie folgt lesen 1 2 3 4 5 6 while ( rs . next ()) { // im try long matrnr = rs . getLong ( " MatrNr " ); String vorname = rs . getString ( " Vorname " ); String name = rs . getString ( " Name " ); System . out . println ( matrnr + " " + vorname + " " + name ); } § Ein Zugriff auf die Attribute einer Zeile im Ergebnis ist über ihren Namen möglich, alternativ über ihren Index 1 2 3 4 5 6 while ( rs . next ()) { // im try long matrnr = rs . getLong (1); String vorname = rs . getString (2); String name = rs . getString (3); System . out . println ( matrnr + " " + vorname + " " + name ); } Datenbanken / Kapitel 11: Datenbankschnittstellen 34 Ergebnis (ResultSet) § Zudem können Informationen zum Schema des Ergebnis z.B. Namen und Typen der Attribute erfragt werden 1 ResultSetMetaData rsmd = rs . getMetaData (); 2 3 4 // Zahl der Spalten erfragen int columnCount = rsmd . getColumnCount (); 5 6 7 8 9 10 11 12 13 // Name und Typ jeder Spalte ausgeben for ( int i = 1; i <= columnCount ; i ++) { System . out . println ( " Spalte " + i + " heisst " + rsmd . getColumnLabel ( i ); + " und hat Typ " + + rsmd . getColumnTy peName ( i ); } } Datenbanken / Kapitel 11: Datenbankschnittstellen 35 Versandhandel in SQLite mit JDBC § Xerial (https://github.com/xerial/sqlite-jdbc) stellt einen JDBC-Treiber für SQLite-Datenbanken zur Verfügung 1 package de . htwsaar . swl ; 2 3 4 5 6 7 import import import import import java . sql . Connection ; java . sql . DriverManager ; java . sql . ResultSet ; java . sql . SQLException ; java . sql . Statement ; 8 9 10 11 12 13 14 /** * Zugriff auf Versandhandelsdaten in SQLite per JDBC * * @author Klaus Berberich ( klaus . berberich@htwsaar . de ) */ public class VersandhandelExample { 15 16 17 18 19 20 21 22 public static void main ( String [] args ) { Connection conn = null ; Statement stmt = null ; ResultSet rs = null ; try { // JDBC - Treiber f ü r SQLite laden Class . forName ( " org . sqlite . JDBC " ); 23 24 // Verbindung erstellen conn = DriverManager . getConnection ( " jdbc : sqlite : " + Datenbanken / Kapitel 11: Datenbankschnittstellen 25 36 16 17 public static void main ( String [] args ) { Connection conn = null ; Statement stmt = null ; ResultSet rs = null ; try { // JDBC - Treiber f ü r SQLite laden Class . forName ( " org . sqlite . JDBC " ); Versandhandel in SQLite mit JDBC 18 19 20 21 22 23 24 25 26 // Verbindung erstellen conn = DriverManager . getConnection ( " jdbc : sqlite : " + " / Users / kberberi / Desktop / dbs - unix . sqlite " ); 27 28 29 // Statement erstellen stmt = conn . createStatement (); 30 31 32 33 // Anfrage ausf ü hren rs = stmt . executeQuery ( " SELECT Kunden_Nr , Vorname , Name , PLZ , Wohnort + " FROM Kunden ORDER BY PLZ " ); 34 35 36 37 38 39 40 41 42 // Zeilen im Ergebnis mit allen Spalten ausgeben while ( rs . next ()) { System . out . println ( rs . getLong (1) + " " + rs . getString (2) + " " + rs . getString (3) + " " + rs . getInt (4) + " " + rs . getString (5)); } 43 44 45 46 } catch ( SQLException sqle ) { System . out . println ( sqle . getMessage ()); } catch ( C l a s s N o t F o u n d E x c e p t i o n cnfe ) { Datenbanken / Kapitel 11: Datenbankschnittstellen 37 Versandhandel in SQLite mit JDBC 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 } 26 } catch ( SQLException sqle ) { System . out . println ( sqle . getMessage ()); } catch ( C l a s s N otF ou nd Ex cep ti on cnfe ) { System . out . println ( " Treiber unbekannt : " + cnfe . getMessage ()); } finally { if ( rs != null ) { try { rs . close (); } catch ( SQLException sqle ) { } }; if ( stmt != null ) { try { stmt . close (); } catch ( SQLException sqle ) { } }; if ( conn != null ) { try { conn . close (); } catch ( SQLException sqle ) { } }; } 27 28 } Datenbanken / Kapitel 11: Datenbankschnittstellen 38 Versandhandel in SQLite mit JDBC § Code zum Download auf Website zur Vorlesung § JDBC-Treiber für MS SQL Server zum Download: https://www.microsoft.com/en-US/download/details.aspx?id=11774 § Achtung: Andere URL zum Verbinden mit Datenbank Datenbanken / Kapitel 11: Datenbankschnittstellen 39 Zusammenfassung § Datenbankschnittstellen erlauben Zugriff auf Datenbank aus einer externen Anwendung § Portabilität als wichtige Anforderung, d.h. RDBMS oder Programmiersprache soll leicht austauschbar sein § Call-Level Interfaces als Schnittstellen für bestimmtes RDBMS und bestimmte Programmiersprache § Open Database Connectivity (ODBC) erreicht Entkopplung durch Verwendung von Treibern § Java Database Connectivity (JDBC) für Java-Code Datenbanken / Kapitel 11: Datenbankschnittstellen 40 Literatur [1] A. Kemper und A. Eickler: Datenbanksysteme – Eine Einführung, De Gruyter Oldenbourg, 2015 (Kapitel 4) [2] G. Saake, K.-U. Sattler und A. Heuer: Datenbanken - Konzepte und Sprachen, mitp Professional, 2013 (Kapitel 13) Datenbanken / Kapitel 11: Datenbankschnittstellen 41