Programmazione Java - Primavera e JDBCTemplate - Utilizzo di query, queryForList o queryForRowSet?

StackOverflow https://stackoverflow.com/questions/1660756

Domanda

Il mio Java (JDK6) progetto utilizza primavera e JDBCTemplate per tutto il suo accesso al database. Recentemente abbiamo aggiornato da 2,5 a primavera Spring 3 (RC1). Il progetto non fa uso di un ORM come Hibernate EJB .

Se ho bisogno di leggere un gruppo di record, e fare un po 'elaborazione interna con loro, sembra che ci sono diversi metodi (overload): query, queryForList e queryForRowSet

Quali dovrebbero essere i criteri da utilizzare uno invece dell'altro? Ci sono differenze di prestazioni? Migliori pratiche?

Mi può consigliare alcuni riferimenti esterni per ulteriori ricerche su questo argomento?

È stato utile?

Soluzione

Trovo che il modo standard per accedere come elenco è tramite i metodi query(), piuttosto che uno qualsiasi degli altri approcci. La differenza principale tra query e gli altri metodi è che si dovrà attuare una delle interfacce di callback (sia RowMapper, RowCallbackHandler, o ResultSetExtractor) per gestire il vostro set di risultati.

Un RowMapper è probabile che ciò che troverete voi stessi usando la maggior parte del tempo. E 'utilizzato quando ogni riga del set di risultati corrisponde a un oggetto nella vostra lista. Basta implementare un metodo unico mapRow dove si popolano il tipo di oggetto che va nella tua linea e restituirlo. Primavera ha anche un BeanPropertyRowMapper che può riempire gli oggetti in un elenco tramite corrispondenza dei nomi di proprietà di fagioli ai nomi delle colonne (NB questa classe è per comodità non le prestazioni).

Un RowCallbackHandler è più utile quando è necessario i risultati di essere molto più di un semplice elenco. Dovrete gestire il ritorno oggetto da soli si sta utilizzando questo approccio. Io di solito trovo con questo quando ho bisogno di una struttura di carta come il mio tipo di ritorno (vale a dire per i dati raggruppati per un tavolo albero o se sto creando una cache personalizzato in base della chiave primaria).

Un ResultSetExtractor viene utilizzato quando si desidera controllare l'iterazione dei risultati. È implment un metodo unico extractData che sarà il valore di ritorno della chiamata a query. Trovo solo me stesso di utilizzare questo se devo costruire qualche struttura dati personalizzato che è più complesso da costruire utilizzando una delle altre interfacce di callback.

I metodi queryForList() sono utili in quanto non si dispone di implementare questi metodi di callback. Ci sono due modi per utilizzare queryForList. La prima è se siete solo l'interrogazione di una singola colonna dal database (ad esempio, una lista di stringhe) è possibile utilizzare le versioni del metodo che accetta una classe come argomento per dare automaticamente un elenco dei soli oggetti di quelle classi .

Quando si chiama le altre implementazioni di queryForList() si otterrà una lista di nuovo con ogni voce di essere una mappa di per ogni colonna. Anche se questo è bello in quanto si sono salvati la spesa di scrivere i metodi di callback, si occupano di questa struttura dati è abbastanza ingombrante. Vi ritroverete a fare un sacco di fusione in quanto i valori della mappa sono di tipo Object.

In realtà ho mai visto i metodi queryForRowSet utilizzati allo stato selvatico. Questo caricherà l'intero risultato della query in un oggetto CachedRowSet wapped da una molla SqlRowSet. Vedo un grande svantaggio nell'utilizzo di questo oggetto nel senso che se si sta passando il SqlRowSet intorno agli altri strati della vostra applicazione, si sta accoppiando tali livelli per l'implementazione di accesso ai dati.

Non si dovrebbe vedere le differenze enormi di prestazioni tra una di queste chiamate ad eccezione di quanto ho già detto con il BeanPropertyRowMapper. Se si sta lavorando con alcuni complessa manipolazione di un grande set di risultati, si potrebbe essere in grado di ottenere alcuni miglioramenti delle prestazioni di scrivere un ResultSetExtractor ottimizzato per il vostro caso specifico.

Se volete saperne di più avrei consultare il Spring JDBC documentazione e il JavaDoc per le classi che ho menzionati. È anche possibile dare un'occhiata ad alcuni dei libri sul Spring Framework. Anche se è un po 'datato Java Development con Spring Framework ha una sezione molto buona su lavorando con il quadro JDBC. Più di tutto, direi solo provare a scrivere del codice con ogni metodo e vedere che cosa funziona meglio per voi.

Altri suggerimenti

Dal momento che ci si trova nella meravigliosa terra Generics, che cosa si può davvero voglia di fare è usare SimpleJdbcTemplate e utilizzare i suoi metodi query() per Lists di oggetti e queryForObject() per singoli oggetti. Il ragionamento di questo è semplicemente che sono ancora più facile da usare rispetto a quelli in JdbcTemplate.

Una piccola aggiunta alle ottime risposte di cui sopra: i metodi aggiuntivi, come queryForInt, queryForLong, queryForMap, queryForObject, ecc potrebbe sembrare buone opzioni a volte se si sta eseguendo una query semplice e si aspettano una singola riga

Tuttavia, se si potesse ottenere 0 o 1 file più indietro, il metodo queryForList è generalmente più facile, altrimenti che ci si deve prendere IncorrectResultSizeDataAccessException. Ho imparato che il modo difficile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top