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