私はsprings jdbctemplateを使用し、次のようなクエリを実行しています:
SELECT COLNAME FROM TABLEA GROUP BY COLNAME
渡される名前付きパラメーターはありませんが、ユーザーによって列名COLNAME
が渡されます。
質問
列名に?
などのプレースホルダーを使用する方法はありますか?たとえば、SELECT ? FROM TABLEA GROUP BY ?
上記のクエリを実行してList<String>
を取得したい場合、最善の方法は何ですか?
現在私がやっている:
List <Map<String, Object>> data = getJdbcTemplate().queryForList(query);
for (Map m : data)
System.out.println(m.get("COLNAME"));
のようなプレースホルダーを持つ方法はありますか?列名にたとえば、SELECT? FROM TABLEA GROUP BY?
次のように動的クエリを使用します。
String queryString = "SELECT "+ colName+ " FROM TABLEA GROUP BY "+ colName;
上記のクエリを実行してリストを取得したい場合、最善の方法は何ですか?
List<String> data = getJdbcTemplate().query(query, new RowMapper<String>(){
public String mapRow(ResultSet rs, int rowNum)
throws SQLException {
return rs.getString(1);
}
});
編集:SQLインジェクションを停止するには、colNameで次のように非Word文字を確認します。
Pattern pattern = Pattern.compile("\\W");
if(pattern.matcher(str).find()){
//throw exception as invalid column name
}
文字列のリストを作成するには、カスタム行マッパーを使用する必要はありません。 queryForList
を使用して実装します。
List<String>data=jdbcTemplate.queryForList(query,String.class)
次のコードを使用
List data = getJdbcTemplate().queryForList(query,String.class)
列名、テーブル名、データ型名、または基本的にデータではないものにプレースホルダーを使用することはできません。