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

Posted

技术标签:

【中文标题】如何在 JdbcTemplate 中查询 List<String>?【英文标题】:How to query for a List<String> in JdbcTemplate? 【发布时间】:2012-11-01 11:50:14 【问题描述】:

我正在使用 Spring 的 JdbcTemplate 并运行如下查询:

SELECT COLNAME FROM TABLEA GROUP BY COLNAME

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

问题

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

    如果我想简单地运行上述查询并获得List&lt;String&gt;,最好的方法是什么?

目前我在做:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

使用以下代码

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

【讨论】:

这工作正常。展望未来,如果查询具有 IN 运算符,我如何将值传递给 this ?请协助!这些值是 In 运算符中的 List【参考方案3】:

有没有办法有占位符,比如?对于列名?例如选择?来自 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
          

【讨论】:

在使用动态查询时,我会将用户输入的任何内容放入我的动态查询中,这是一个可怕的部分。 @birdy:您可能想通过使用简单的正则表达式\\w 来检查字符串是否只有word characters。这将防止任何 sql 注入的可能性。 你应该使用准备好的语句而不是做这些正则表达式的东西。试试这个:getJdbcTemplate().query("SELECT ? FROM TABLEA GROUP BY ?", new RowMapper&lt;String&gt;() public String mapRow(ResultSet rs, int rowNum) throws SQLException return rs.getString(1); , colName, colName); 如果我们有多个参数,我们将如何映射行.. 即.. 代替 columnName 使用 lambda 你可以这样使用: List data = getJdbcTemplate().query(query, (rs, rowNum) -> rs.getString(1));【参考方案4】:

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

【讨论】:

以上是关于如何在 JdbcTemplate 中查询 List<String>?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 spring 的 jdbcTemplate 在 SQL 查询中指定参数

jdbcTemplate方法查询list对象

Spring的JdbcTemplate查询数据库时,使用queryForList().get(0)返回单行查询时会产生异常,请问如何避免?

jdbcTemplate查询结果为对象list

使用 JDBCTemplate 在“IN”子句中将 List<String> 作为查询参数传递时获取 PSQL 异常

spring JdbcTemplate 查询,使用BeanPropertyRowMapper