2012-11-13 8 views
9

Ich bin mit Federn jdbctemplate und Ausführen einer Abfrage wie unten abfragen:wie für eine Liste <String> in jdbctemplate

SELECT COLNAME FROM TABLEA GROUP BY COLNAME

Es gibt keine benannten Parameter sind vergangen, jedoch Spaltenname, COLNAME, wird vom Benutzer übergeben werden.

Fragen

  1. Gibt es eine Möglichkeit Platzhalter zu haben, wie ? für Spaltennamen? Zum Beispiel SELECT ? FROM TABLEA GROUP BY ?

  2. Wenn ich will einfach die obige Abfrage ausführen und ein List<String> bekommen, was ist der beste Weg?

Derzeit ich tue:

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

Antwort

7

Gibt es eine Möglichkeit Platzhalter zu haben, wie? für Spaltennamen? Zum Beispiel SELECT? VON TABLEA GROUP BY?

Verwenden dynamische Abfrage wie folgt:

String queryString = "SELECT "+ colName+ " FROM TABLEA GROUP BY "+ colName; 

Wenn ich will einfach die obige Abfrage ausführen und eine Liste bekommen, was ist der beste Weg?

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

EDIT: Um SQL-Injection-Stopp, überprüfen Sie nicht Wort Zeichen im colName als:

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

In dynamische Abfrage werde ich sein setzen, was der Benutzer in meine dynamische Abfrage eingibt, die ein Teil beängstigend ist. – birdy

+0

@birdy: Sie können überprüfen, ob die Zeichenfolge nur 'Wortzeichen 'enthält, indem Sie eine einfache Regex' \\ w' verwenden. Dies verhindert jegliche SQL-Injektionsmöglichkeit. –

+4

Sie sollten vorbereitete Anweisungen verwenden, anstatt dieses Regex-Zeug zu machen. Versuchen Sie dies: '' 'getJdbcTemplate(). Abfrage (" SELECT? FROM TABLEA GROUP BY? ", Neue RowMapper ()) öffentliche String mapRow (ResultSet rs, int rowNum) löst SQLException { zurück rs.getString (1); } }, colName, colName); '' – Jean

1

Sie keine Platzhalter für Spaltennamen, Tabellennamen, Datentypnamen verwenden können, oder grundsätzlich alles, was keine Daten sind.

6

Verwenden folgenden Code

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

18

Um eine Liste der String zu füllen, müssen Sie nicht benutzerdefinierte Reihe Mapper verwenden. Implementieren Sie es mit queryForList.

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

BeanPropertyRowMapper für mich große Werke:

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