2012-11-13 11 views
9

Używam sprężyny jdbctemplate i uruchomienie kwerendy jak poniżej:jak zapytać o listę <String> w jdbctemplate

SELECT COLNAME FROM TABLEA GROUP BY COLNAME

Brak wymienione parametry są przekazywane jednak nazwę kolumny, COLNAME, będzie zostać przekazane przez użytkownika.

Pytania

  1. Czy istnieje sposób, aby mieć zastępcze, jak ? dla nazw kolumn? Na przykład: SELECT ? FROM TABLEA GROUP BY ?

  2. Jeśli chcę po prostu uruchomić powyższe zapytanie i uzyskać List<String> jaki jest najlepszy sposób?

Obecnie robię:

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

Odpowiedz

7

Czy istnieje sposób, aby mieć zastępcze, jak? dla nazw kolumn? Na przykład WYBIERZ? OD TABLEA GROUP BY?

Korzystanie zapytania dynamiczny jak poniżej:

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

Jeśli chcę wystarczy uruchomić powyższe zapytanie, a otrzymasz listę Jaki jest najlepszy sposób?

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

EDIT: Zatrzymanie SQL Injection, sprawdź dla niezarejestrowanych znaków słownych w colName jak:

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

Korzystając dynamiczne zapytanie będę oddanie co użytkownik wprowadza do mojego dynamicznego kwerendy, która jest przerażająca część. – birdy

+0

@birdy: Możesz chcieć sprawdzić, czy ciąg ma tylko "znaki słowne" za pomocą prostego wyrażenia regularnego '\\ w'. Zapobiegnie to możliwej iniekcji sql. –

+4

Powinieneś używać przygotowanych instrukcji zamiast robić to, co chcesz. Wypróbuj to: 'getJdbcTemplate(). Query (" SELECT? FROM TABLEA GROUP BY? ", Nowy RowMapper () { public String mapRow (ResultSet rs, int rowNum) wyrzuca SQLException { return rs.getString (1); } }, colName, colName); '' ' – Jean

1

nie można używać zastępczych nazw kolumn, nazwy tabel, nazwy typów danych, lub w zasadzie wszystko, co nie jest danymi.

6

użyć poniższy kod

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

18

Aby zapełnić listę String, nie musisz używać niestandardowych wierszy mapowania. Zaimplementuj go, używając queryForList.

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

BeanPropertyRowMapper działa świetnie dla mnie:

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