Ein PreparedStatement besteht ist ein SQL-Statement mit Platzhaltern. Das Besondere daran ist, dass das Statement überprüft wird, bevor die Platzhalter gesetzt werden. Dadurch werden SQL-Injections verhindert. Eine SQL-Injection basiert darauf, dass ein „normales“ SQL-Statement verlängert wird. Zum Beispiel um ein „; DROP TABLE“. Durch das „;“ wird an das eigentliche SQL-Statement ein zweites Statement (nämlich DROP-Table) angehangen. Dadurch werden zwei SQL-Statements ausgeführt, was aber nicht im Sinne des Betreibers ist. Mit Prepared Statements kann dies nicht passieren, da hier das „;“ durch die vorherige Überprüfung schon missbilligt wird.
Beispiel für ein PreparedStatement:
repository.JdbcConnection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | public void findById(int nummer) { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; String sqlStr = "SELECT * FROM cd WHERE id=?"; LinkedList<CD_VO> voList = new LinkedList<CD_VO>(); CD_VO vo; try { con = getConnection(); ps = con.prepareStatement(sqlStr); ps.setInt(1, nummer); rs = ps.executeQuery(); while(rs.next()) { vo = new CD_VO(); vo.setId( rs.getInt("id") ); vo.setInterpret( rs.getString("interpret") ); vo.setTitel( rs.getString("titel") ); vo.setVeroeffentlichung( rs.getDate("veroeffentlichung") ); vo.setCoverDatei( rs.getString("coverdatei") ); voList.add(vo); // Testausgabe: System.out.println( vo.getId() ); System.out.println( vo.getInterpret() ); System.out.println( vo.getTitel() ); System.out.println( vo.getVeroeffentlichung() ); System.out.println( vo.getCoverDatei() ); } } catch(SQLException sqlex) { sqlex.printStackTrace(); } finally { try { if( ps != null ) ps.close(); if( con != null ) con.close(); } catch(SQLException excSQL) { System.out.println("Fehler beim Abbau der SQL-Verbindung:"); excSQL.printStackTrace(); } } } |
MySQL-Datenbankabfrage mit der Java Database Connectivity aus der Java Enterprise Edition. Für die Verwendung wird die Bibliothek mysql-connector-java-5.1.5-bin.jar benötigt, damit der MySQL Driver für die JDBC zur Verfügung steht. Das Kürzel “VO” bezeichnet die Value Objects, welche die Datensätze in der Datenbank sind.
data.CD_VO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | package data; import java.sql.Date; import java.util.ArrayList; public class CD_VO { int id; String titel; String interpret; Date veroeffentlichung; String coverDatei; ArrayList<Song_VO> songs; public CD_VO() { this.id = 0; this.titel = ""; this.interpret = ""; this.veroeffentlichung = new java.sql.Date(2010-10-10); this.coverDatei = ""; songs = new ArrayList<Song_VO>(); } public CD_VO(String titel, String interpret, Date veroeffentlichung, String coverDatei) { setID(); this.titel = titel; this.interpret = interpret; this.veroeffentlichung = veroeffentlichung; this.coverDatei = coverDatei; songs = new ArrayList<Song_VO>(); } private void setID() { this.id++; } public String getCoverDatei() { return coverDatei; } public void setCoverDatei(String coverDatei) { this.coverDatei = coverDatei; } public long getId() { return id; } public void setId(int id) { this.id = id; } public String getInterpret() { return interpret; } public void setInterpret(String interpret) { this.interpret = interpret; } public String getTitel() { return titel; } public void setTitel(String titel) { this.titel = titel; } public Date getVeroeffentlichung() { return veroeffentlichung; } public void setVeroeffentlichung(Date veroeffentlichung) { this.veroeffentlichung = veroeffentlichung; } |
repository.JdbcConnection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | package repository; import data.CD_VO; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.LinkedList; public class JdbcConnection { protected Connection getConnection() { try { Class.forName("com.mysql.jdbc.Driver"); return DriverManager.getConnection("jdbc:mysql://localhost/jee", "root", "password"); } catch(SQLException excSQL) { System.out.println("Fehler beim Aufbau der SQL-Verbindung:"); excSQL.printStackTrace(); return null; } catch(ClassNotFoundException excCNF) { System.out.println("Treiber-Manager nicht gefunden."); excCNF.printStackTrace(); return null; } } public void findAllTest() { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; String sqlStr = "SELECT * FROM cd"; LinkedList<CD_VO> voList = new LinkedList<CD_VO>(); CD_VO vo; try { con = getConnection(); ps = con.prepareStatement(sqlStr); rs = ps.executeQuery(); while(rs.next()) { vo = new CD_VO(); vo.setId( rs.getInt("id") ); vo.setInterpret( rs.getString("interpret") ); vo.setTitel( rs.getString("titel") ); vo.setVeroeffentlichung( rs.getDate("veroeffentlichung") ); vo.setCoverDatei( rs.getString("coverdatei") ); voList.add(vo); // Testausgabe: System.out.println( vo.getId() ); System.out.println( vo.getInterpret() ); System.out.println( vo.getTitel() ); System.out.println( vo.getVeroeffentlichung() ); System.out.println( vo.getCoverDatei() ); } } catch(SQLException excSQL) { System.out.println("Fehler beim Abruf aus der SQL-Verbindung:"); excSQL.printStackTrace(); } finally { try { if( ps != null ) ps.close(); if( con != null ) con.close(); } catch(SQLException excSQL) { System.out.println("Fehler beim Abbau der SQL-Verbindung:"); excSQL.printStackTrace(); } } } } |
repository.Main
1 2 3 4 5 6 7 8 9 10 | package repository; public class Main { public static void main(String args[]) { JdbcConnection test = new JdbcConnection(); test.findAllTest(); } } |
Bei der Entwicklung mit der Java Platform (Micro Edition) benutzt man eine FileConnection, um die Verbindung zu einer Datei (zum lesen oder schreiben) herzustellen. Dabei wird oft der folgende Pfad verwendet:
fc = (FileConnection)Connector.open("file:///root1/");
Doch wo liegt dieser ominöse root1-Ordner? Typischerweise soll root1 das Basisverzeichnis auf dem Handy angeben. Im Java ME SDK muss man den Pfad aber mühseelig suchen. Bei mir ist es:
C:\Dokumente und Einstellungen\Benutzername\javame-sdk\3.0\work\0\appdb\filesystem\root1
Zurück aus Hannover! Nach einem langen Wochenende bin ich wieder heimgekehrt. Zusammen mit ein paar Freunden war ich auf der CeBIT 2010 in Hannover und habe dort die bereits erwähnte mobile Handyanwendung vorgestellt.
Das CeBIT Forum für Learning & Knowledge Solutions bot genug Platz dafür. Alles in allem war es ein spannender Messe-Samstag mit vielen Erlebnissen. Fabian vom SimpleBlog hat netterweise ein paar Fotos gemacht. An dieser Stelle ein Bild von meiner Präsentation:
Letztens wollte ich Festplatten sicher löschen, da ich die Datenträger auf eBay versteigert hatte und nicht wollte, dass die darauf befindlichen Dateien von Anderen wiederhergestellt werden können. Für diesen Zweck habe ich verschiedene Programme getestet und wurde von einigen stark enttäuscht.
Wer diese Enttäuschungen nicht erleben möchte, der sollte lieber gleich WipeDisk 1.1 von Werner Rumpeltesz ausprobieren oder seine Festplatten mit TrueCrypt formatieren. TrueCrypt 6.3 gibt es sogar als portable Version, in der nur die TrueCrypt Format.exe ausgeführt werden muss, um eine komplette Festplatte auf hohem Sicherheitsniveau zu löschen. Direkt im Anschluss muss man die Festplatte nur wieder mit einem gängigen Dateiformat (z.B. NTFS) formatieren, um Sie nutzen zu können. Dabei reicht auch eine Schnellformatierung aus.
Folgende Programme sind meiner Meinung nach nicht empfehlenswert für die Vernichtung von Dateien auf Festplatten:
- CBL Daten-Shredder (konnte einige Laufwerke nicht erkennen)
- Eraser 6.0.6 (konnte nicht alle Dateien vernichten)
- HandyBits File Shredder (konnte nicht alle Dateien vernichten)
Hinweis: Für das sichere Löschen von einzelnen Dateien gibt es vom WipeDisk-Programmierer eine extra Version namens WipeFile.



