Bonjour,
je reste perplexe quant à l'utilisation des statements, la doc jdbc indique :
Je souhaite utiliser l'avantage des PreparedStatement pour typer, backquoter en encapsuler mes valeurs.Sending SQL statements to a database
* Statement -- used to send basic SQL statements
* PreparedStatement -- used to send prepared statements or basic SQL statements (derived from Statement)
* CallableStatement -- used to call database stored procedures (derived from PreparedStatement)
* Connection interface -- provides methods for creating statements and managing connections and their properties
* Savepoint -- provides savepoints in a transaction
Le cas simple est le suivant :
Mais dans le cas d'une recherche, dont le nombre de paramètres peuvent varier, je peux faire comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ps = prepareStatement("SELECT * FROM maTable WHERE 1 AND id = ?"); ps.setInt(1,456);
Le problème ici est que je dois moi même backslasher rechercheA pour éviter les erreurs et injections SQL, par exemple si la valeur contient une apostrophe.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 String q = "SELECT * FROM maTable WHERE 1 AND id = ?"; if( rechercheA != null ) { q += " AND champA LIKE '"+rechercheA+"'"; } ps = prepareStatement(q); ps.setInt(1,456);
J'ai donc espérer utiliser le setInt(), setString() du PreparedStatement en dehors de cette classe, mais puisque ces méthodes ne retourne rien, cela me sert à rien...
Car faire 2 fois les tests, 1 pour la construction de la requete et l'autre pour la definition des arguments me semble pas spécialement propre.
Quelqu'un a t'il à ce jour su construire une requete dynamique sans passer par Statement dont est obligé de vérifier le contenu de nos variables ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 String q = "SELECT * FROM maTable WHERE 1 AND id = ?"; if( rechercheA != null ) { q += " AND champA LIKE ? "; } ps = prepareStatement(q); index=1; ps.setInt(index++,456); if( rechercheA != null ) { ps.setInt(index++,rechercheA); }
Partager