Datenbanken - SQL und JDBC Projektseminar Seite 1 Was passiert heute ? •Ziel: wie kann man in Java auf Datenbanken zugreifen und Daten manipulieren ? •dazu brauchen wir: •Kenntnisse in SQL (allgemein) •Kenntnisse von JDBC (Java-Spezifisch) Seite 2 1 Warum Datenbanken ? Seite 3 Warum Datenbanken ? •Daten müssen persistent gespeichert werden •Datenbankmanagementsysteme sind Standardsoftware •hohe Performance •Datenbanken bieten standardisierte Konzepte, die allgemein bekannt sind •SQL •Relationen •ERM •Alternative zu Datenbanken: Daten selbst organisieren (z.B. in eigenen Textdateien) •Bedeutet: Entwicklung proprietärer Mechanismen Seite 4 2 Was ist SQL ? •Steht für: Structured Query Language •ist geeignet für: Relationale Datenbanken •Was kann man mit SQL machen: •Tabellen anlegen und löschen •Datenbankabfragen •Datenbankmanipulationen •Vorhandene Datensätze löschen •Vorhandene Datensätze ändern •Datensätze einfügen •Benutzer- und Rechteverwaltung Seite 5 Beispieltabelle Tabelle Mitarbeiter personalnummer Integer nachname String vorname String wohnort String taetigkeit String gehalt Double Seite 6 3 Einfache Datenabfrage SELECT nachname, vorname, taetigkeit FROM mitarbeiter Spalten Tabelle Ergebnis: nachname Müller Meier Lehmann Schulze vorname Heiner Gunther Herbert Dieter taetigkeit Maler Maurer Maurer Dachdecker Seite 7 Datenabfrage mit Bedingung SELECT nachname, vorname, taetigkeit FROM mitarbeiter WHERE taetigkeit=‚Maurer‘ Ergebnis nachname Meier Lehmann vorname Gunther Herbert taetigkeit Maurer Maurer Seite 8 4 Datenabfrage mit mehreren Bedingungen SELECT nachname, vorname, taetigkeit, gehalt FROM mitarbeiter WHERE taetigkeit=‚Maurer‘ AND gehalt>4000 Logische Verknüpfung Ergebnis nachname Lehmann vorname Herbert taetigkeit Maurer gehalt 4300 Seite 9 Datenabfrage über mehrere Tabellen Weitere Beispieltabelle: Tabelle Baustelle baustelleID Integer bezeichnung String ort String auftraggeber String Tabelle Einsatzorte baustelleID Integer personalnummer Integer funktion String Seite 10 5 JOIN-Datenabfrage mehrerer Tabellen Welcher Mitarbeiter Arbeitet in welcher Funktion wo ? SELECT mitarbeiter.nachname, mitarbeiter.vorname, baustellen.bezeichnung, baustellen.ort, einsatzorte.funktion FROM mitarbeiter, baustellen, einsatzorte WHERE (((mitarbeiter.personalnummer)=[einsatzorte].[personalnummer]) AND ((baustellen.baustelleID)=[einsatzorte].[baustelleID])); Ergebnis Nachname vorname bezeichnung Müller Heiner Hauptbahnhof Lehmann Herbert Hauptbahnhof Schulze Dieter Autobahnkreuz Hödeldö Meier Gunther Autobahnkreuz Hödeldö ort Hamburg Hamburg Hannover Hannover funktion Bauleiter Gruppenleiter Arbeiter Hilfskraft Seite 11 Angabe eines Ordnungskriteriums SELECT mitarbeiter.nachname, mitarbeiter.vorname, mitarbeiter.wohnort, mitarbeiter.taetigkeit FROM mitarbeiter ORDER BY mitarbeiter.nachname; Ergebnis nachname Lehmann Meier Müller Schulze vorname Herbert Gunther Heiner Dieter wohnort Hannover Göttingen Hamburg Bremen taetigkeit Maurer Maurer Maler Dachdecker Seite 12 6 Suchen in Datensätzen Alle Mitarbeiter, die ein i im Vornamen haben SELECT mitarbeiter.nachname, mitarbeiter.vorname, mitarbeiter.wohnort, mitarbeiter.taetigkeit FROM mitarbeiter WHERE (((mitarbeiter.vorname) Like “%i%")); % = beliebig viele Zeichen ? = genau ein beliebiges Zeichen nachname Müller Schulze vorname Heiner Dieter wohnort Hamburg Bremen taetigkeit Maler Dachdecker Seite 13 Datensätze einfügen Einen neuen Mitarbeiter hinzufügen INSERT INTO mitarbeiter VALUES (‚5‘,‘Schmidt‘,‘Klaus‘,‘Kiel‘,‘Maurer‘,‘3500‘) Seite 14 7 Datensätze Manipulieren Alle Mitarbeiter sollen eine Lohnerhöhung von 5 % erhalten UPDATE mitarbeiter SET mitarbeiter.gehalt = mitarbeiter.gehalt*1.05; Bei Update sind auch Bedingungen möglich: UPDATE mitarbeiter SET mitarbeiter.gehalt = mitarbeiter.gehalt*1.05 WHERE mitarbeiter.taetigkeit=‚Maurer‘; Seite 15 Datenbanken in Java Was ist JDBC ? •Steht für JAVA DATABASE CONNECTIVITY •Technologie, um in Java auf Datenbanken zuzugreifen •Es lassen sich verschiedene Möglichkeiten unterscheiden, wie auf eine Datenbank zugegriffen wird. •Über JDBC •Über die JDBC-ODBC Brücke •Reiner Java-Treiber Seite 16 8 Zugriff über JDBC Application Space Java Application JDBC-Driver Result-Set Native Database Driver SQLCommand Proprietäter Datenfluß Database Seite 17 Zugriff über JDBC-ODBC Bridge Application Space Java Application JDBC-ODBC-Bridge Result-Set ODBC-Driver SQLCommand Proprietäter Datenfluß Database Seite 18 9 Reiner Java-Treiber Application Space Java Application JDBC-Driver Result-Set propriätarer Datenfluss Database Seite 19 Schritte bis zum Datenbankzugriff 1. ODBC-Datenquelle im System einrichten (außerhalb Java) 2. Eine Verbindung zur Datenbank aufbauen 3. Formulieren eines SQL-Statements 4. Durchführen der SQL-Abfrage 5. Auslesen der Ergebnisse 6. Verwerten der Ergebnisse Seite 20 10 ODBC-Quelle einrichten Seite 21 Eine Verbindung zur Datenbank aufbauen Relevante Klassen, Interfaces, Packages: Connection, java.sql Relevante Informationen: •ODBC-Datenquellenname •Logininformationen (Username, Passwort) final String JDBC_TREIBER = "sun.jdbc.odbc.JdbcOdbcDriver"; final String ODBC_QUELLE = "jdbc:odbc:myxml"; final String ODBC_USER = ""; final String ODBC_PW = ""; private Connection con = null; // Code zum instantiieren der Verbindung Class.forName(JDBC_TREIBER); con = DriverManager.getConnection(ODBC_QUELLE, ODBC_USER, ODBC_PW); Seite 22 11 Exkurs: Fehlerbehandlungen durch Exceptions try { Class.forName(JDBC_TREIBER); con = DriverManager.getConnection(ODBC_QUELLE, ODBC_USER, ODBC_PW); } catch (ClassNotFoundException cnfe) { System.err.println(cnfe.getMessage()); } catch (Exception e) { System.err.println(e.getMessage()); } Try-Catch-Block Exceptions - Was ist das ? •Exceptions fangen Fehler zur Laufzeit auf •Exceptions sind nicht optional, sondern Pflicht •Ermöglicht / zwingen zum fehlertoleranten Programmieren •Helfen beim Debugging •blähen allerdings den Programmcode auf (kein wirklicher Nachteil) Seite 23 SQL-Statement formulieren Relevante Klassen, Interfaces, Packages: Statement, java.sql String sqlStatement; // Statement als String sqlStatement=„SELECT nachname, vorname, taetigkeit FROM mitarbeiter“; Statement s=con.createStatement(); // Statement instantiieren Seite 24 12 SQL-Statement durchführen Relevante Klassen, Interfaces, Packages: Statement, ResultSet, java.sql String sqlStatement; // Statement als String sqlStatement=„SELECT nachname, vorname, taetigkeit FROM mitarbeiter“; Statement s=con.createStatement(); // Statement instantiieren ResultSet rs=s.executeQuery(sqlStatement); Die Klasse ResultSet kapselt das Ergebnis einer SQL-Abfrage Seite 25 SQL-Statement durchführen - Update String sqlStatement; sqlStatement=„UPDATE ...“; Statement s=con.createStatement(); s.executeUpdate(sqlStatement); // Statement als String // Statement instantiieren Bei einer Update-Abfrage gibt es kein Ergebnis, da die Daten manipuliert und nicht abgefragt werden. Es ist also kein ResultSet - Objekt notwendig Seite 26 13 Auslesen der Ergebnisse und Verwertung while (rs.next()) { // Über alle Ergebnisdatensätze iterieren tmp_doc = new RepositoryDocument(); // Ein Objekt, das die Ergebnisse verwertet tmp_doc.setId(Integer.toString(rs.getInt("B_ID"))); // Auslesen eines DB-Feldes tmp_doc.setTitel(rs.getString("B_Titel")); tmp_doc.setText(rs.getString("B_Text").substring(0,170)); tmp_doc.setKategorieBezeichnung(rs.getString("K_Bezeichnung")); documentList.add(tmp_doc); } Seite 27 Zusammenfassung - DB-Klassen Klassen / Interfaces: Connection : Kapselt eine DB-Verbindung Statement : Kapselt ein Datenbankstatement ResultSet : Kapselt das Ergebnis einer DB-Abfrage Methoden: Statement Connection.createStatement(); // Ein Statement-Objekt liefern ResultSet Statement.executeQuery(String) // Ausführen eines SQL-Statements ResultSet.Next() // Einen Datensatz weiterspringen ResultSet.getString(„FELDNAME“) // Spalten der Relation lesen ResultSet.getInt(„FELDNAME“) Seite 28 14 Architektur für den DB-Zugriff Client Controll View Model Kapselt DB-Zugriffe / SQL-Statements (speziell) DB-Methoden Kapselt DB-Zugriffe DB-Bean (allgemein) ODBC Middleware Relationenmodell Seite 29 15