Willkommen Datenbanken und Anbindung Welche stehen zur Wahl? ● ● MySQL – Sehr weit verbreitetes DBS (YT, FB, Twitter) – Open-Source und Enterprise-Version – Libs in C/C++ und Java verfügbar – Grundsätzlich ist ein Server und einer oder mehrere Clients, die Anfragen an diesen senden vorgesehen PostgreSQL – Open-Source – Weitgehend mit dem SQL-Standard ANSI-SQL 2008 konform – Schnittstellen zu C/C++ und Java verfügbar ● MySQL-Server – ● http://dev.mysql.com/downloads/mysql/ PostgreSQL-Server – http://www.postgresql.org/download/ Datenbankanbindung in Java/JDBC ● JDBC – Einheitliche Schnittstelle der Java-Plattform zu Datenbanken verschiedener Hersteller – Aufgaben sind es Verbindungen zu Datenbanken herzustellen, zu verwalten, SQL-Anfragen an die DB weiterzuleiten und die Ergebnisse dieser in Java zur Verfügung zu stellen – Für jedes DBS sind eigene Treiber erforderlich, die die JDBC-Spezifikation implementieren Datenbankanbindung in Java/JDBC 10 Connection conn; 20 try { 30 conn = DriverManager.getConnection(...Logindaten...); 40 } catch(SQLException e) { 50 /* Fehlerbehandlung */ 60 } ● Das JAR mit dem Treiber über die IDE dem Projekt hinzufügen ● Die Verbindung herstellen über den DriverManager ● ● Der DriverManager übernimmt seit JDBC4 das laden der Treiber automatisch Alle SQL Vorgänge müssen in Try-Catch Blöcke gefasst werden Datenbankanbindung in Java/JDBC 10 Statement stmt; 20 try { 30 stmt = conn.createStatement(); 40 stmt.execute("CREATE TABLE IF NOT EXISTS list(item_id SERIAL NOT NULL PRIMARY KEY, item_name VARCHAR(255))"); 50 } catch (SQLException e) { /* Fehlerbehandlung */ } ● Sich vom Verbindungsobjekt ein Statement Objekt holen ● Mit der execute – Methode den SQL-Befehl ausführen ● Hier das anlegen einer Tabelle Datenbankanbindung in Java/JDBC 10 ResultSet rs; 20 Statement stmt; 30 try { 40 stmt = conn.createStatement(); 50 rs = stmt.executeQuery("SELECT item_name FROM list“); 60 } catch(SQLException e) { /*Fehlerbehandlung*/ } ● Sich vom Verbindungsobjekt ein Statement Objekt holen ● Mit der executeQuery – Methode den SQL-Befehl ausführen ● Und den Rückgabewert in einem ResultSet speichern ● Dieses kann nachher durchlaufen werden, um die Werte der einzelnen Zeilen zu bekommen Datenbankanbindung in Java/JDBC 10 try { 20 while(rs.next()) { 30 System.out.println(rs.getString(1)); 40 } 50 rs.close(); 60 } catch(SQLException e) { /*Fehlerbehandlung*/ } ● ● Das ResultSet mit der Methode next solange iterieren bis next() false zurück liefert ResultSet liefert mehrere Methoden um SQL Datentypen als Java Datentypen zurückgeben lassen ● Den Rückgabewert speichern/ausgaben ... ● Das ResultSet schließen Datenbankanbindung in Java/JDBC 10 Statement stmt; String neuerWert = "foobar“; 20 try { 30 stmt = conn.createStatement(); 40 stmt.executeUpdate("INSERT INTO list (item_name) VALUES ('"+neuerWert+ "')"); 50 } catch(SQLException e) { /*Fehlerbehandlung*/ } ● Sich vom Verbindungsobjekt ein Statement Objekt holen ● Mit der executeUpdate – Methode den SQL Befehl ausführen ● Der Rückgabewert würde angeben wieviel Zeilen geändert wurden ● executeUpdate auch für DELETE und UPDATE – SQL Statements ● stmt.executeUpdate("DELETE FROM list WHERE item_id = '"+id+"'"); ● stmt.executeUpdate("UPDATE list SET (item_name)=('"+neuerWert+"') WHERE item_id='"+id+"'"); Datenbankanbindung in Java/JDBC ● JDBC-Connector für MySQL: – ● http://dev.mysql.com/downloads/connector/j/ JDBC-Connector für PostgreSQL: – http://jdbc.postgresql.org/download.html Datenbankanbindung in C++ ● ● ● ● Keine einheitliche Schnittstelle zu Datenbanken in C++ bzw. in der Std.-Lib selbst verfügbar! Es existiert hier jedoch ebenso eine einheitliche Schnittstelle, welche sich ODBC nennt (Ursprünglich nur unter Windows, mittlerweile auch unter Unix-Betriebssystemen verfügbar) Auch hier sind für jedes spezifisches DBS eigene Treiber erforderlich, die die ODBC-Spezifikation implementieren Wir werden jedoch die offiziellen Libs der DBS direkt nutzen, da ODBC teilweise einige zusätzliche Konfigurationsarbeit erfordert... Datenbankanbindung in C++ 01 #include <pqxx/pqxx> 02 pqxx::connection conn("dbname=myPostgreSqlDB user=myUserName"); 03 pqxx::work transaction(c); 04 pqxx::result r = transaction.exec("INSERT INTO fahrzeuge (marke) VALUES ('Audi');“); 05 transaction.commit(); 06 ... ● Die Headers der libpqxx werden inkludiert ● Eine Verbindung zur DB wird hergestellt, Name und User obligatorisch... ● Eine neues Transaktions-Objekt wird erstellt, welches die vorher hergestellte Verbindung nutzt ● ● Ein SQL-Statement wird mittels der exec-Methode abgesetzt, welches ein Result-Objekt zurück gibt Zum Schluss wird die Transaktion „committed“ bzw. die DB dazu veranlasst, die Änderungen persistent zu übernhemen Datenbankanbindung in C++ 01 ... 02 pqxx::result r = transaction.exec("SELECT * FROM fahrzeuge“); 03 for (int i = 0; i < r.size(); i++) { 04 pqxx::result::tuple row = r[i]; 05 pqxx::result::field column = row[0]; // Immer nur Spalte 0 06 ... 07 } ● Durch das SELECT-Statement werden Daten von der DB erfragt ● Durchlaufen aller zurückgegebener Zeilen im Result-Objekt ● Das Result-Objekt „r“ enthält ein Array von einzelnen Zeilen-Objekten ● Jedes dieser Zeilen-Objekte enthält wiederum die einzelnen SpaltenWerte die auch in einem Array gespeichert sind Datenbankanbindung in C++ ● C++ Lib für MySQL – ● http://dev.mysql.com/downloads/connector/cpp/ C++ Lib für PostgreSQL – http://pqxx.org/development/libpqxx/ Ende ● Beispielprogramme...