如何在 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<String>
,最好的方法是什么?
目前我在做:
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有没有办法有占位符,比如?对于列名?例如选择?来自 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<String>() public String mapRow(ResultSet rs, int rowNum) throws SQLException return rs.getString(1); , colName, colName);
如果我们有多个参数,我们将如何映射行.. 即.. 代替 columnName
使用 lambda 你可以这样使用: List您不能将占位符用于列名、表名、数据类型名或基本上任何不是数据的内容。
【讨论】:
以上是关于如何在 JdbcTemplate 中查询 List<String>?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 spring 的 jdbcTemplate 在 SQL 查询中指定参数
Spring的JdbcTemplate查询数据库时,使用queryForList().get(0)返回单行查询时会产生异常,请问如何避免?