40

我正在使用 SpringJdbcTemplate并运行如下查询:

SELECT COLNAME FROM TABLEA GROUP BY COLNAME

没有传递命名参数,但是,列名 ,COLNAME将由用户传递。

问题

  1. 有没有办法使用占位符,比如?列名?例如SELECT ? FROM TABLEA GROUP BY ?

  2. 如果我想简单地运行上述查询并获得List<String>最好的方法是什么?

目前我正在做:

List<Map<String, Object>> data = getJdbcTemplate().queryForList(query);
for (Map m : data) {
  System.out.println(m.get("COLNAME"));
}
4

4 回答 4

102

要填充字符串列表,您无需使用自定义行映射器。使用queryForList.

List<String>data=jdbcTemplate.queryForList(query,String.class)
于 2016-11-04T07:25:12.027 回答
21

有没有办法有占位符,比如?对于列名?例如选择?从 TABLEA 分组?

使用如下动态查询:

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 中的非单词字符:

          Pattern pattern = Pattern.compile("\\W");
          if(pattern.matcher(str).find()){
               //throw exception as invalid column name
          }
于 2012-11-13T01:16:04.717 回答
21

使用以下代码

List data = getJdbcTemplate().queryForList(query,String.class)

于 2016-08-04T05:17:29.517 回答
1

您不能将占位符用于列名、表名、数据类型名或基本上不是数据的任何内容。

于 2012-12-12T05:14:06.480 回答