DB13-JDBC - schmiedecke.info

Werbung
Datenbanken 1
für Mediennformatiker
WS 06
4. ODBC, JDBC und SQLJ:
Datenbank-Anbindung an
Anwendungsprogramme
Der letzte Schritt
• Diese grafische Oberfläche mit der Ebay-Datenbank verbinden....
Anwendungen mit Datenbanken
GUI
AnwendungsProgramm-
GUI
AnwendungsProgramm-
GUI
ODBC
ProgrammPakete
Prozedurale
SQL-Erweiterungen
ODBC
ProgrammPakete
Embedded SQL
Programmierung und
Datenbanken
• Embedded SQL:
– Programm auf dem Client
Verbindung zur DB – SQL-Befehle werden
"geschickt"
– Standardtechnik ODBC / JDBC
– Moderner: SQLJ
• Prozedurale Erweiterungen
– Ausführung der Prozeduren im DBMS
– SQL/PSM bzw. PL/SQL
– Embedded Java SQLJ
Was ist ODBC?
•
Open Data Base Connectivity
– generische Programmierschnittstelle (API) zur Interaktion mit einer (beliebigen)
SQL-Datenbank
– ODBC: Microsoft-Entwicklung
– Normierung als CLI/SQL
– Implementierungen heißen ODBC-Treiber
– Von praktisch allen relationalen DBMS implementiert ("ODBC-Datenbanken")
– Treiber Bestandteil von Windows ab Windows 2000/NT
•
Funktioniert als Vermittlungsschicht zwischen
DBMS und Anwendungsprogramm:
– Herstellung und Verwaltung der DB-Verbindung
– "Versand" von SQL-Anweisungen
(incl. Datenkonvertierung)
– "Empfang" von SQL-Ergebnissen und
Fehlermeldungen
Anwendung
ODBC
DBMS
Was ist JDBC
• Java-API, das das ODBC-Verfahren auf Java abbildet,
also ODBC mit Java als Schnittstellensprache
• JDBC-Treiber ist realisiert in Form von Java-Bibliotheken
• Einfachste Implementierung JDBC-ODBC-Bridge:
Abbildung auf ODBC
• Die meisten DBMS bieten auch spezifische Treiber an
performanter
• (Später mehr über Treiber-Typen)
JDBC: "Telefonieren mit der Datenbank"
• Telefonieren:
– Verbindung aufbauen
URL mit Port und SID, User und Passwort
– Kommunizieren
SQL-Anweisungen versenden und Ergebnisse empfangen
– Verbindung beenden
• "Roaming"
– Anbieter registrieren und auswählen
Treiber laden und bei der Klasse DriverManager registrieren
– Telefonieren
Arbeitsweise mit JDBC
1.
2.
3.
4.
5.
6.
7.
Treiber-Bibliothek laden
Verbindung zum Datenbank-Server herstellen
SQL-Anweisung(en) in ein Ausführungs-Objekt packen
Ausführungsobjekt ausführen
Ergebnis-Objekt lesen und verarbeiten
Vorgang beliebig wiederholen
… irgendwann Verbindung beenden
Die JDBC-Spezifikation
Das JDBC-API
Hinweis: Erweiterungen ab JDBC 3.0 in javax.sql
DB-Interaktionen
Connection connection;
// Verbindung zur Datenbank herstellen
// und in connection speichern typischerweise im Konstruktor, s.u.
Statement stmt;
ResultSet result;
try {
stmt = connection.createStatement();
String sql = "create table newtab "+
"(id number primary key," +
" name varchar2(10), vorname varchar2(10))";
int changes = stmt.executeUpdate(sql);
// für DDL, DML
sql = "Insert into newtab values(100, 'Hansen', 'Hans');
int numChanges = stmt.executeUpdate(sql);
// für DDL, DML
sql = "Select * from newtab;";
result = stmt.executeQuery(sql);
// für QL
stmt.close(); // wichtig, sonst bleibt der DB Cursor offen
} catch (SQLException ex) { ex.printStackTrace(); }
Arbeiten mit dem ResultSet
while (result.next()) // zeilenweise abarbeiten
System.out.println(""
+ result.getInt(1) +'\t'
+ result.getString(2) + '\t'
+ result.getString("vorname") + '\n');
Arbeiten mit Metadaten
ResultSetMetaData meta = result.getMetaData();
int numSpalten = meta.getColumnCount();
String [] spaltenNamen = new String[numSpalten];
for (int i=0; i<numSpalten; i++)
{ spaltenNamen[i] = meta.getColumnName(i+1);
System.out.print(spaltenNamen[i]+'\t');
}
System.out.println();
/* entsprechend
– getColumnDisplaySize,
– getColumnType...
*/
Vorkompilierte Statements
•
PreparedStatement:
– parametriesierbar
– vorkompiliert
public String[] nachnamen(String Vorname) {
try {
String query =
"select name, vorname"+
"from newtab where vorname = ?";
PreparedStatement prepsql =
connection.prepareStatement(query);
query.setString(1, Vorname);
ResultSet result = prepsql.executeQuery();
return result.getArray("name");
} catch (SQLException e) {e.printStackTrace());
}
Generische Statements
DDL, DML oder QL
• Statements werden oft dynamisch zusammengesetzt.
• manchmal unklar, ob Create, Update, Select ....
try {
boolean isQuery = stmt.execute(sql);
if (isQuery) result = stmt.getResultSet();
else int updateCount = stmt.getUpdateCount();
} catch (SQLExeption e) { e.printStackTrace(); }
Aufruf von Stored Procedures
CallableStatement
• Aufruf eines PL/SQL-Blocks mithilfe eines CallableStatement
• Der Block kann auch der Aufruf einer Stored Procedure sein.
try {
CallableStatement s1 =
connection.prepareCall
( "Begin If Select(count(*) from ?) < ?" +
"Then Truncate Table ?;" +
" End;" );
s1.setString(1, "newtab");
s1.setInt(2, 2);
s1.setString(3, "newtab");
s1.execute();
} catch (SQLException e) { e.printStackTrace(); }
Aufruf von Stored Procedures
CallableStatement
• Aufruf einer Stored Procedure
• Ausgabeparameter müssen registriert werden
try {
CallableStatement s2 =
connection.prepareCall
( "{ call StoredProc1 (?,?) }");
s2.setDouble(1, 42.43);
// IN-Parameter
s2.registerOutParameter(1, java.sql.Types.FLOAT); // auch OUT-Par.
s2.registerOutputParameter(2, java.sql.Types.VARCHAR); // OUT-Par.
s2.execute();
double res1 = s2.getDouble(1);
String res2 = s2.getString(2);
} catch (SQLException e) { e.printStackTrace(); }
JDBC-Treiber-Typen
Quelle: Jeckle, http://www.jeckle.de/vorlesung/eBusinessEng/script.html#DBAccess
Liste der verfügbaren Treiber unter http://developers.sun.com/product/jdbc/drivers
DB-Verbindungen:
1. Treiber laden
1.
JDBC-Treiber laden und bei der Klasse DriverManager registrieren
(3 von 4-5 Möglichkeiten)
Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
DriverManager.registerDriver
(new oracle.jdbc.driver.OracleDriver());
Driver driver = new com.mysql.jdbc.Driver(); //Connector/J
Die Klasse DriverManager verwaltet alle geladenen Treiber, so dass ein Programm zu
mehreren verschiedenen Datenbanken Verbindungen aufbauen kann.
DriverManager
Wichtig: Die Treiberklassen müssen im Classpath sein!
Also ggf. herunterladen und in das lib/ext-Verzeichnis des jdk kopieren,
oder irgendwohin kopieren und Classpath setzen!
DB-Verbindung:
Datenbank spezifizieren und Verbindung(en) aufbauen
2. Datenbank-URL spezifizieren
String db1_url = "jdbc:odbc:jdbc_test";
// jdbc_test muss als lokale Datenquelle
// im Betriebssystem registriert sein
// s.a. http://www.elektronikschule.de/~grupp/mysql/myodbc/
String db2_url =
"jdbc:oracle:thin:@dbl52.tfh-berlin.de:1521:ORCL";
// direkte Verbindung zum DB-Server
String db3_url = "jdbc:mysql:@localhost:3306/mysql";
3. Connect zur Datenbank ausführen
Connection my_con1 =
DriverManager.getConnection(db_url1, "spielwiese","student");
Connection my_con2 =
DriverManager.getConnection(db_url2, "ebay", args[0]);
// (Kennwort muss beim Programmaufruf uebergeben werden)
... und los geht's
Implikationen für Internet-DB
• Kriterien:
– Ladezeit
– Datenstrom
– Verbindungsdauer
– Server-Belastung
Ausführliche Diskussion in:
http://web.f4.fhtw-berlin.de/hartwig/JDBC/jdbc.html
Was ist SQLJ?
• SQLJ ist eine SQL-Einbindung in eine
Programmiersprache auf höherer Ebene.
• Syntax: SQL-Anweisungen beginnen mit
#sql und sind in { } eingeschlossen.
public String findBook (String isbn)
throws SQLException {
String title;
#sql { Select title into :title From book
Where isbn = :isbn };
return title;
}
...und was bringt SQLJ?
SQLJ ist embedded SQL
– mit SQL-Precompiler auf dem Client entwickel- und
ausführbar
– Fehleranalyse während der Entwicklung
– dafür keine dynamischer SQL-Aufbau
– benutzt JDBC für die DB-Verbindung
SQLJ ist eine prozedurale SQL-Erweiterung
– auf dem DBMS entwickel- und ausführbar
– als Stored Procedures im DD registriebar.
Flexible Codeverteilung
GUI
SQLJ-AnwendungsProgramm
(JDBC)
SQLJ-ProgrammPakete
Literatur und Links ☺
Bücher:
Aktuell, verstehbar und gründlich:
Gunter Saake, Kai-Uwe Sattler, Datenbanken und Java, Heidelberg 2003
Technisch detailliert:
Elio Bonazzi, Glenn Stokol, Oracle und Java, Münschen 2002
JDBC-Links
Aktuelle Version ist JDBC 4.0
J2SE 5.0-Spezifikation bezieht sich noch auf JDBC 2.0…
Seit der Definition von JDBC sind viele nützliche Lernhilfen veröffentlicht worden:
• http://www.jeckle.de/vorlesung/eBusinessEng/script.html#JDBC
• http://web.f4.fhtw-berlin.de/hartwig/JDBC/jdbc.html
• http://notes.corewebprogramming.com/student/JDBC.pdf
•
•
Gutes, aber altes Tutorial (ca. 8 h):
http://java.sun.com/developer/onlineTraining/Database/JDBCShortCourse/index.html
Kommentare dazu (Korrekturen!): http://www.nick-wyatt.de/meso/
•
JDBC 4.0: http://www.doag.org/pub/docs/sig/development/2005-11/jdbc.ppt
Herunterladen