• Keine Ergebnisse gefunden

Datenbanksysteme Programmieren von Datenbankzugriffen mit JDBC Burkhardt Renz

N/A
N/A
Protected

Academic year: 2021

Aktie "Datenbanksysteme Programmieren von Datenbankzugriffen mit JDBC Burkhardt Renz"

Copied!
23
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Datenbanksysteme

Programmieren von Datenbankzugriffen mit JDBC

Burkhardt Renz

Fachbereich MNI

Technische Hochschule Mittelhessen

Sommersemester 2021

(2)

Übersicht

Architektur von JDBC Ziele von JDBC

Grundstruktur eines JDBC-Programms Grundlegendes Beispiel

Überblick über das Packagejava.sql

Datenretrieval mit JDBC Parametrisierte Anweisungen Metadaten

Datenmodifikation mit JDBC Ändernde Anweisungen Änderungen über einen Cursor

Transaktionen mit JDBC Arbeiten mit Transaktionen Einstellen des Isolationslevels

(3)

Fragestellung

String Autor = ”Moore”;

String Titel = ”Schwarzrock”;

System.out.println(

Autor + ”: ” + Titel);

BuchAusgabe.java

Autor Titel Moore Schwarzrock .... ...

.... ...

Datenbank Bücher

Wie kommen Werte aus der Datenbank in die Variablen unserer Anwendungen?

Wie können wir Werte in unserem Programm in der Datenbank speichern?

(4)

Varianten der Zugriffstechnik

SLI – Statement Level Interface

Einbettung von SQL-Anweisungen in den Programmcode Verarbeitung durch einen Präprozessor

Beispiele: embedded SQL in C (eSQL/C), SQLJ

CLI – Call Level Interface

Bibliothek mit Funktionen bzw. Klassen und Methoden für den Zugriff auf das DBMS

Beispiele: ODBC (C/C++), JDBC (Java), ADO.NET (C#)

(5)

Ziele von JDBC

SQL als Sprache für den Datenbankzugriff

Gleichzeitiger Zugriff auf mehrere DBMS bzw. Datenbanken

„Adaptives“ Programmiermodell Einfachheit („Keep it simple“)

Robustheit, Verfügbarkeit, Skalierbarkeit

Grundlage für andere Zugriffstechniken wie SQLJ oder JPA (Java Persistence API)

(6)

Architektur

JDBC-Treibermanager JDBC

Java-Programm JDBC-API R

JDBC-Treiber JDBC-Treiber-API R

Daten DBMS

(7)

Grundlegendes Beispiel

Beispiel BuchJDBC.java in IntelliJ

Einbinden des JDBC-Treibers, hier: JDBC-Treiber für PostgreSQL

Schritt 1: JDBC-Treiber laden

Schritt 2: Verbindung zum DBMS und zur Datenbank herstellen

Schritt 3: Objekt für SQL-Anweisung erzeugen Schritt 4: DBMS Anweisung direkt ausführen lassen

Schritt 5: Ergebnis anzeigen durch Iteration über den Cursor auf die Ergebnismenge

Schritt 6: Fehler abfangen und Ressourcen freigeben

(8)

Interfaces und Klassen von JDBC

Connection

Statement

Data types

CallableStatement

ResultSet PreparedStatement subclasses

prepareStatement prepareCall

createStatement

executeQuery

executeQuery executeQuery

Input to

getXXX

Input/Output of

getMoreResults / getResultSet subclasses

PreparedStatement CallableStatement

Quelle:

JDBC-Spezifikation

(9)

Übersicht

Architektur von JDBC Ziele von JDBC

Grundstruktur eines JDBC-Programms Grundlegendes Beispiel

Überblick über das Packagejava.sql

Datenretrieval mit JDBC Parametrisierte Anweisungen Metadaten

Datenmodifikation mit JDBC Ändernde Anweisungen Änderungen über einen Cursor

Transaktionen mit JDBC Arbeiten mit Transaktionen Einstellen des Isolationslevels

(10)

Arten von Statements

Statement

wird vom DBMS übersetzt, optimiert und ausgeführt PreparedStatement

zweistufiges Verfahren

Schritt 1: DBMS übersetzt und optimiert

Schritt 2: Anweisung kann mehrfach mit immer neuen Parametern ausgeführt werden

CallableStatement

zum Aufruf von Stored Procedures

(11)

Beispiel einer parametrisierten Anweisung

Wir möchten Bücher bestimmter Autoren suchen, siehe BuchSuche.java

Parametrisierte Anweisungen verwenden Platzhalter Zuerst wird im DBMS der Zugriffsplan erstellt

In der Schleife wird derselbe Zugriffsplan immer wieder aufgerufen

(12)

SQL-Injection

Implementierung der Suche nach Büchern ohne Platzhalter, siehe BuchInjection.java

Auf den ersten Blick erfüllt es dieselbe Funktionalität Aber: der Inhalt der Benutzereingabe wird vom DBMS interpretiert

Deshalb ist SQL-Injection möglich Demo:

Neue Tabelle demomit einem Feld msganlegen Einen Datensatz einfügen

Angriff: Der Angreifer möchte die Tabelle demo löschen Was muss er eingeben?

Diskussion

(13)

Ermitteln der Metadaten zu einer Ergebnismenge

Interface ResultSetMetaDatamit den Methoden:

getColumnCount()

getColumnName(int column) getColumnType(int column)

(14)

DatabaseMetaData

Informationen über das DBMS und die Datenbank erhält man via das Interface DatabaseMetaData, zum Beispiel:

getDatabaseProductName() getDriverName()

getTables(....) getColumns(....)

supportsANSI92FullSQL() ...

unzählige Informationsfunktionen

(15)

Übersicht

Architektur von JDBC Ziele von JDBC

Grundstruktur eines JDBC-Programms Grundlegendes Beispiel

Überblick über das Packagejava.sql

Datenretrieval mit JDBC Parametrisierte Anweisungen Metadaten

Datenmodifikation mit JDBC Ändernde Anweisungen Änderungen über einen Cursor

Transaktionen mit JDBC Arbeiten mit Transaktionen Einstellen des Isolationslevels

(16)

Ändernde Anweisungen

executeQuery für „select ...“

gibt ein Objekt vom Typ ResultSet zurück executeUpdateMethode von Statement für

„update ...“ oder

„insert ...“

gibt die Zahl der betroffenen Zeilen zurück

Was tun, wenn man den Typ der Anweisung zur Compile-Zeit nicht kennt?

execute Methode vonStatement für beliebige Anweisungen gibt einen boolschen Wert zurück:

true bedeutet, dass eine Ergebnismenge erstellt wurde, kann man abholen mitgetResultSet

false bedeutet, dass Daten geändert wurden, die Zahl der geänderten Zeilen kann man abholen mit getUpdateCount

(17)

Arten von ResultSets

Art der Bewegung des Cursors TYPE_FORWARD_ONLY TYPE_SCROLL_INSENSITIVE TYPE_SCROLL_SENSITIVE Lesender oder ändernder Cursor

CONCUR_READ_ONLY CONCUR_UPDATABLE

(18)

Navigieren in ResultSets

next() previous() first() last()

beforeFirst() afterLast()

relative(int rows) absolute(int r)

(19)

Cursor verwenden in ResultSets

Werte lesen

rs.getString(1)

rs.getString("author") Werte ändern

auf den entsprechenden Datensatz navigieren

rs.updateString("author", "Geänderter Autor") rs.updateRow()

Datensätze einfügen

rs.moveToInsertRow()

rs.UpdateString("author", "Neuer Autor") rs.UpdateString("title", "Neuer Titel") ...

rs.insertRow()

(20)

Übersicht

Architektur von JDBC Ziele von JDBC

Grundstruktur eines JDBC-Programms Grundlegendes Beispiel

Überblick über das Packagejava.sql

Datenretrieval mit JDBC Parametrisierte Anweisungen Metadaten

Datenmodifikation mit JDBC Ändernde Anweisungen Änderungen über einen Cursor

Transaktionen mit JDBC Arbeiten mit Transaktionen Einstellen des Isolationslevels

(21)

Auto-Commit-Modus

Auto-Commit-Modus = Jede einzelne SQL-Anweisung wird automatisch in einer Transaktion durchgeführt, also

automatisch bestätigt

Für welche Art von Anwendungen ist der Auto-Commit-Modus nicht geeignet?

Ausschalten des Auto-Commit-Modus:

con.setAutoCommit( false )

Nun muss man im Programm das Transaktionsende bestätigen oder ein „Rollback“ veranlassen:

con.commit() con.rollback()

(22)

Blaupause für Transaktionen

boolean autoCommit = con.getAutoCommit();

Statement stmt;

try {

con.setAutoCommit( false );

stmt = con.createStatement();

stmt.execute(...);

stmt.execute(...);

stmt.execute(...);

...

con.commit();

} catch(SQLException sqle) { con.rollback();

} finally { stmt.close();

con.setAutoCommit( autoCommit );

}

(23)

Isolationslevel in JDBC

Im Interface Connectionwerden die Isolationslevel definiert:

TRANSACTION_NONE

TRANSACTION_READ_UNCOMMITTED

TRANSACTION_READ_COMMITTED (Default in JDBC) TRANSACTION_REPEATABLE_READ

TRANSACTION_SERIALIZABLE Einstellen durch

con.setTransactionIsolation( int Level ) Das eingestellte Level gilt dann für alle folgenden Transaktionen, bis es umgestellt wird

Referenzen

ÄHNLICHE DOKUMENTE

TRANSACTION_READ_COMMITTED In diesem Isolationslevel kann das Phänomen „Dirty Read“ nicht mehr auftreten – die Transaktion kann nur Daten anderer Transaktionen lesen, die durch

following alle folgenden Elemente following-sibling alle folgenden Geschwister preceding alle vorherigen Elemente preceding-sibling alle vorherigen Geschwister. attribute

public static void readBook( String isbn ) throws SQLException { String author = null;?. String title

Sie soll nur möglich sein, wenn das Konto nicht überzogen wird.. Die Daten der Konten werden in der Tabelle

(a) Schreiben Sie ein JDBC-Programm, mit dem man nach einem Buch in der Tabelle Books suchen kann, so dass es einem Angreifer gelingt, dieses Programm zu verwenden, um einen Eintrag

➥ JDBC erlaubt portablen Zugriff auf relationale Datenbanken. ➥ Abfragen

 Anwendung ist durch JDBC unabhängig vom DBMS, da JDBC-Treiber für praktisch alle DBMS verfügbar sind.. Das Unternehmen, das eine JDBC-Lösung einsetzt, hat damit alle Daten

Entspricht canCommit?-Nachricht TA-Koordinator ermittelt Ressourcen, die an Transaktion beteiligt sind, und ruft auf jeder Ressource prepare()- Methode unter Angabe der TID