J'utilise springs jdbctemplate et exécute une requête comme ci-dessous:
SELECT COLNAME FROM TABLEA GROUP BY COLNAME
Aucun paramètre nommé n'est transmis, cependant, le nom de la colonne, COLNAME
, sera transmis par l'utilisateur.
Questions
Existe-t-il un moyen d'avoir des espaces réservés, comme ?
pour les noms de colonne? Par exemple SELECT ? FROM TABLEA GROUP BY ?
Si je veux simplement exécuter la requête ci-dessus et obtenir un List<String>
Quel est le meilleur moyen?
Actuellement je fais:
List <Map<String, Object>> data = getJdbcTemplate().queryForList(query);
for (Map m : data)
System.out.println(m.get("COLNAME"));
Existe-t-il un moyen d'avoir des espaces réservés, comme? pour les noms de colonne? Par exemple SELECT? DU GROUPE TABLEA PAR?
Utilisez la requête dynamique comme ci-dessous:
String queryString = "SELECT "+ colName+ " FROM TABLEA GROUP BY "+ colName;
Si je veux simplement exécuter la requête ci-dessus et obtenir une liste, quelle est la meilleure façon?
List<String> data = getJdbcTemplate().query(query, new RowMapper<String>(){
public String mapRow(ResultSet rs, int rowNum)
throws SQLException {
return rs.getString(1);
}
});
EDIT: pour arrêter l'injection SQL, recherchez les caractères non Word dans colName comme:
Pattern pattern = Pattern.compile("\\W");
if(pattern.matcher(str).find()){
//throw exception as invalid column name
}
Pour remplir une liste de chaînes, vous n'avez pas besoin d'utiliser le mappeur de lignes personnalisé. Implémentez-le à l'aide de queryForList
.
List<String>data=jdbcTemplate.queryForList(query,String.class)
Utilisez le code suivant
List data = getJdbcTemplate().queryForList(query,String.class)
Vous ne pouvez pas utiliser d'espaces réservés pour les noms de colonne, les noms de table, les noms de types de données ou tout ce qui n'est pas des données.