2012-11-13 15 views
9

sto usando molle jdbctemplate e l'esecuzione di una query come di seguito:come eseguire una query per un elenco <String> in jdbctemplate

SELECT COLNAME FROM TABLEA GROUP BY COLNAME

ci sono denominati parametri passati, tuttavia, il nome della colonna, COLNAME, volontà essere passato dall'utente

Domande

  1. C'è un modo per avere i segnaposto, come ? per i nomi di colonna? Ad esempio SELECT ? FROM TABLEA GROUP BY ?

  2. Se voglio semplicemente eseguire la query precedente e ottenere un List<String> qual è il modo migliore?

Attualmente sto facendo:

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

risposta

7

C'è un modo per avere i segnaposto, come? per i nomi delle colonne? Ad esempio, SELEZIONA? DAL GRUPPO TABLEA DA?

Usa query dinamica, come di seguito:

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

Se voglio correre semplicemente la query precedente e ottenere un elenco qual è il modo migliore?

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

EDIT: smettere di SQL Injection, verificare la presenza di caratteri non di parola nella colName come:

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

In utilizzando query dinamica sarò mettendo tutto ciò che l'utente entra nella mia query dinamica che è una parte spaventosa. – birdy

+0

@birdy: potresti voler controllare che la stringa abbia solo "caratteri di parola" usando una semplice espressione regolare "\\ w". Ciò impedirà qualsiasi possibilità di iniezione sql. –

+4

Dovresti usare le istruzioni preparate invece di fare questa roba delle espressioni regolari. Prova: '' 'getJdbcTemplate(). Query (" SELECT? FROM TABLEA GROUP BY? ", Nuovo RowMapper () { public String mapRow (ResultSet rs, int rowNum) genera SQLException { return rs.getString (1); } }, colName, colName); '' ' – Jean

1

Non è possibile utilizzare i segnaposto per i nomi di colonna, i nomi delle tabelle, i nomi dei tipi di dati, o sostanzialmente tutto ciò che non è dati.

6

Usa seguente codice

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

18

per compilare un elenco di stringa, non è necessario usare fila mapper personalizzato. Implementalo usando queryForList.

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

BeanPropertyRowMapper grandi opere per me:

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