11. Datenbankschnittstellen

Werbung
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
Herunterladen