如何在jdbctemplate </string>中查询列表<string>

时间:2012-11-13 00:59:41

标签: java jdbc jdbctemplate spring-jdbc

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

SELECT COLNAME FROM TABLEA GROUP BY COLNAME

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

问题

  1. 是否可以使用占位符,例如?作为列名?例如SELECT ? FROM TABLEA GROUP BY ?

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

  3. 目前我在做:

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

4 个答案:

答案 0 :(得分:51)

要填充String列表,您无需使用自定义行映射器。使用queryForList实现它。

List<String>data=jdbcTemplate.queryForList(query,String.class)

答案 1 :(得分:9)

  

有没有办法让占位符,比如?列名?例如SELECT? FROM TABLEA GROUP BY?

使用动态查询,如下所示:

String queryString = "SELECT "+ colName+ " FROM TABLEA GROUP BY "+ colName;
  

如果我想简单地运行上面的查询并获得List,那么最好的方法是什么?

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
          }

答案 2 :(得分:8)

使用以下代码

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

答案 3 :(得分:1)

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