150.422 15 Datenbanken – SQL Handout 10 Datenbankverbindungen in Java • Installation • Um in Java eine Verbindung zu einer MySQL Datenbank herstellen zu können, muss zunächst das MySQL Connector jar File heruntergeladen und sichergestellt werden, dass die Java Installation dieses File lädt. • Abfragen an eine Datenbank schicken • Der folgende Jave Code zeigt exemplarisch, wie eine Verbindung zur Datenbank aufgebaut, eine Abfrage auf der Datenbank ausgeführt, und das Ergebnis ausgegeben wird. 1 import java . sql .*; public class Select { public static void main ( String args []){ 6 try { Statement stmt ; ResultSet rs ; String s = " SELECT name , area FROM cia WHERE region = ‘ Europe ’" ; 11 // JDBC driver fuer MySQL registrieren Class . forName ( " com . mysql . jdbc . Driver " ); // URL fuer Datenbank definieren String url = " jdbc : mysql :/ /1 9 3. 17 1 .8 1 .2 08 : 33 0 6/ oracle1_00_cia " ; 16 // zu Datenbank verbinden Connection con = DriverManager . getConnection ( url , " oracle00 " , " password " ); 21 // Statement - Objekt setzen stmt = con . createStatement (); // Abfrage ausfuehren und Resultat in ResultSet - Objekt speichern rs = stmt . executeQuery ( s ); 26 // Resultat in Schleife auslesen while ( rs . next () ){ String name = rs . getString ( " name " ); int area = rs . getInt ( 2 ); System . out . println ( name + " has an area of " + area + " km ^2 " ); } 31 // Verbindung schliessen con . close (); 36 } catch ( Exception e ) { System . out . println ( " Error " + e ); } 41 } } SS 2016 Java Integer float double boolean String Date Time Methode in ResultSet getInt() getFloat() getDouble() getBoolean() getString() getDate() getTime() MySQL Datentyp INTEGER REAL FLOAT BIT CHAR/VARCHAR DATE TIME Die Datenbankverbindung muss (für die Fehlerbehandlung) in eine try-catch-Umgebung eingebettet werden. Im importierten Paket sql gibt es spezielle Klassen Connection, Statement und ResultSet. Die Klasse Statement verfügt über Methoden, um Abfragen an die Datenbank zu senden, während das Ergebnis der Abfrage in ein Objekt der Klasse ResultSet gespeichert werden kann. In Zeile 20 wird die Verbindung zur Datenbank hergestellt. Dafür müssen die Daten für einen Login auf die Datenbank angegeben werden. Die url muss die MySQL HostAddress, den Port sowie durch einen Doppelpunkt getrennt den Namen der Datenbank beinhalten. Die Methode getconnection nimmt als Parameter neben der url den Benutzernamen und das Passwort für den Login. Die Abfrage wird im String s gespeichert und in Zeile 27 ausgeführt. Das Resultat wird im ResultSet rs gespeichert. Um die Daten aus dem ResultSet auszulesen, wird eine Schleife verwendet (Zeilen 30–34). Das ResultSet rs enthält die Ergebnistabelle der Abfrage, wobei allerdings jeweils nur eine aktuelle Zeile dieser Tabelle ausgelesen werden kann. Die Methode next() überprüft, ob es noch eine Zeile nach der aktuellen Zeile gibt und liest diese Zeile gegebenenfalls ein. Um auf die einzelnen Spalten der aktuellen Zeile der Ergebnistabelle zugreifen zu können, müssen in Abhängigkeit vom Datentyp der jeweiligen Spalte entsprechende Methoden getInt, getString usw. (siehe obige Tabelle) der Klasse ResultSet verwendet werden. Als Parameter nehmen diese Methoden entweder den Namen oder die Nummer der Spalte (in der Abfrage). (s. Zeilen 31 und 32). In Zeile 37 wird die Verbindung geschlossen. Weitere Methoden und Klassen: Neben der Methode next() stellt die Klasse ResultSet noch weitere Methoden wie previous(), first() oder last() zur Verfügung, mit denen im ResultSet navigiert werden kann. Die Methode wasNull() überprüft, ob der zuletzt eingelesene Wert NULL war oder nicht. Um SQL Injections zu vermeiden (siehe z.B. http://sqlzoo.net/hack/ ), können auch sogenannte Prepared Statements verwendet werden. Dazu finden Sie auf der Lehrveranstaltungsseite Beispiele. • Updates, Inserts • und andere Abfragen, die kein ResultSet zurückgeben, funktionieren noch einfacher. Anstelle der Methode executeQuery(String s) wird die Methode executeUpdate(String s) verwendet. Eine modifizierte main-Methode für ein Update sieht wie folgt aus: public static void main ( String args []){ 2 try { // wie oben ... 7 String s = " UPDATE cia SET population = 8 E6 WHERE name = ‘ Austria ’" ; stmt = con . createStatement (); // Update ausfuehren stmt . executeUpdate ( s ); 12 con . close (); } catch ( Exception e ) { System . out . println ( " Error " + e ); } 17 }