2012-11-13 62 views
9

我用彈簧的JdbcTemplate和運行像下面的查詢查詢列表 如何在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")); 

回答

7

有沒有辦法有佔位符,怎麼樣?列名稱?例如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 
      } 
+1

在使用任何用戶進入我的這是一個可怕的部分動態查詢動態查詢,我將推杆。 – birdy

+0

@birdy:你可能想用一個簡單的正則表達式\\ w'來檢查字符串是否只有'單詞字符'。這將防止任何SQL注入的可能性。 –

+4

你應該使用準備好的語句,而不是做這個正則表達式的東西。試試這個:getJdbcTemplate()。query(「SELECT?FROM TABLEA GROUP BY?」,new RowMapper (){ public String mapRow(ResultSet rs,int rowNum) throws SQLException返回rs。的getString(1); } },colName,colName);''' – Jean

1

不能使用列名,表名,數據類型名稱的佔位符,或者基本上任何不是數據的東西。

6

使用下面的代碼

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

18

要填充字符串的列表,你不需要使用自定義行映射。使用queryForList來實現它。

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

BeanPropertyRowMapper爲我的偉大工程:

public List<String> getListOfStrings(){ 
     return jdbcTemplate.query("SELECT * FROM strings", new BeanPropertyRowMapper(String.class)); 
    }