Ressources

Statement

Connection conn = DriverManager.getConnection("url");
 
Statement stmt = con.createStatement();
String sql = "SELECT * FROM users WHERE name + 'name';"
 
ResultSet rs = stmt.executeQuery(sql)

Or, cette pratique de concaténer une requête SQL avec un paramètre (ici name) permet des Injections SQL. Ces chaines paramétrés (e.i. Statement) doivent donc être utilisées de façon limité avec beaucoup de précaution. Une façon plus simple est d’éviter de les utiliser et préférer les PrepareStatement

PrepareStatement

PrepareStatement ps = con.createPrepareStatement("SELECT * FROM users");
 
ps.executeQuery(); // sans paramètre
(ps.executeUpdate();)

Les différences sont très subtiles :

  • On créait une requête qui est définit à la création du prepareStatement, là où avec le statement on pouvait avoir plusieurs requêtes sql stmt.executeQuery(sql), stmt.executeQuery(sql2)
  • la requête SQL est paramétrable via le ? puis préciser la valeur du paramètre
PrepareStatement ps = con.createPrepareStatement("SELECT * FROM users WHERE name = ?");
ps.setString(1, "Paul"); // /!\ On commence à 1 et pas à 0
 
ResultSet rs = ps.executeQuery();
 
ps.setString(1, "Ines");
ResultSet rs2 = ps.executeQuery();

Avec paramètres nommés (pas possible avec JDBC)

JDBC ne supporte pas les paramètres nommés.

PrepareStatement ps = con.createPrepareStatement("SELECT * FROM users WHERE name = :nom");
ps.setString("nom", "Paul"); 
ResultSet rs = ps.executeQuery();