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