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(); } } } |