如何在jdbctemplate中查询列表<String>

bir*_*rdy 25 java jdbc spring-jdbc jdbctemplate

我正在使用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"));
Run Code Online (Sandbox Code Playgroud)

小智 67

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

List<String>data=jdbcTemplate.queryForList(query,String.class)
Run Code Online (Sandbox Code Playgroud)


Yog*_*ngh 14

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

使用动态查询如下:

String queryString = "SELECT "+ colName+ " FROM TABLEA GROUP BY "+ colName;
Run Code Online (Sandbox Code Playgroud)

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

List<String> data = getJdbcTemplate().query(query, new RowMapper<String>(){
                            public String mapRow(ResultSet rs, int rowNum) 
                                                         throws SQLException {
                                    return rs.getString(1);
                            }
                       });
Run Code Online (Sandbox Code Playgroud)

编辑:要停止SQL注入,请检查colName中的非单词字符:

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

  • 您应该使用预准备语句而不是执行此正则表达式.试试这个:```getJdbcTemplate().query("SELECT?FROM TABLEA GROUP BY?",new RowMapper <String>(){public String mapRow(ResultSet rs,int rowNum)抛出SQLException {return rs.getString(1) ;}},colName,colName);``` (7认同)

小智 12

使用以下代码

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