如何在JdbcTemplate中查询List<String>?

48

我正在使用Spring的JdbcTemplate,并执行以下查询:

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个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
114

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

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

23
有没有一种方法可以使用类似于 "?" 的占位符来代替列名?例如: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中的非单词字符:

          Pattern pattern = Pattern.compile("\\W");
          if(pattern.matcher(str).find()){
               //throw exception as invalid column name
          }

1
在使用动态查询时,我将把用户输入的任何内容放入我的动态查询中,这是一个令人担忧的部分。 - birdy
@birdy:你可能想通过使用简单的正则表达式“\w”来检查字符串是否只包含“单词字符”。这将防止任何SQL注入可能性。 - Yogendra Singh
9
你应该使用预处理语句而不是进行正则表达式操作。尝试使用以下代码:getJdbcTemplate().query("SELECT ? FROM TABLEA GROUP BY ?", new RowMapper<String>(){ public String mapRow(ResultSet rs, int rowNum) throws SQLException { return rs.getString(1); } }, colName, colName); - Jean
如果我们有多个参数,我们将如何映射行..即..在columnName的位置 - MS Ibrahim
使用lambda表达式,您可以这样做: List<String> data = getJdbcTemplate().query(query, (rs, rowNum) -> rs.getString(1)); - Fabio Araujo

23

使用以下代码:

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


这个工作得很好。接下来,如果查询中有IN运算符,我该如何传递值?请协助!这些值是In运算符内的List<BigInteger>。 - Karthik_S_A

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,