我發現標準的訪問方式是通過query()
方法而不是任何其他方法。 query
和其他方法之間的主要區別是您必須實現其中一個回調接口(RowMapper
,RowCallbackHandler
或ResultSetExtractor
)來處理您的結果集。
A RowMapper
很可能是您在大部分時間使用的。它在結果集的每一行對應於列表中的一個對象時使用。你只需要實現一個方法mapRow
,在那裏填充你的行中的對象類型並返回它。 Spring還有一個BeanPropertyRowMapper
,它可以通過將bean屬性名稱與列名稱進行匹配來填充列表中的對象(注意這個類是爲了方便而不是性能)。
A RowCallbackHandler
當你需要你的結果不僅僅是一個簡單的列表時更有用。你必須自己管理返回對象,你正在使用這種方法。當我需要一個地圖結構作爲我的返回類型時(即用於樹表的分組數據,或者如果我正在創建基於主鍵的自定義緩存),我通常會發現自己正在使用它。
當您想要控制結果的迭代時,使用ResultSetExtractor
。你暗示一個方法extractData
將是query
調用的返回值。如果我必須構建一些使用其他回調接口構建的更復雜的自定義數據結構,我纔會發現自己使用這種方法。
queryForList()
方法很有價值,因爲您不必實現這些回調方法。有兩種使用queryForList的方法。首先,如果僅查詢數據庫中的單個列(例如字符串列表),則可以使用將Class作爲參數的方法版本自動爲您提供這些類的唯一對象列表。
當調用queryForList()
的其他實現時,您會得到一個列表,每個條目都是每列的映射。雖然這樣做很好,因爲您可以節省編寫回調方法的開銷,但處理這種數據結構相當笨拙。由於地圖的值爲Object
,因此您會發現自己正在進行大量的投射。
我從來沒有見過野外使用的queryForRowSet
方法。這會將整個查詢結果加載到由Spring SqlRowSet彈出的CachedRowSet
對象中。如果您將SqlRowSet
傳遞給應用程序的其他層,我將看到使用此對象的一個大缺點,那就是將這些層耦合到您的數據訪問實現。
除了我提到的BeanPropertyRowMapper
之外,您不應該在這些調用之間看到任何巨大的性能差異。如果您正在處理大型結果集的一些複雜操作,則可以通過針對您的特定案例編寫優化的ResultSetExtractor
來獲得性能上的提升。
如果你想了解更多,我會諮詢Spring JDBC documentation和JavaDoc for the classes I've mentioned。你也可以看看Spring框架上的一些書籍。雖然有點過時了Java Development with the Spring Framework在使用JDBC框架方面有很好的一面。最重要的是,我會說只是嘗試用每種方法編寫一些代碼,看看最適合您的是什麼。
AFIK兼容Java 5的查詢方法在JDBCTemplate中也可用於Spring 3 – Adrian 2009-11-02 12:34:20
現在我檢查了JdbcTemplate在Spring 2.5.6中沒有使用泛型,而是在3.0.0中。我聞到了將來的棄用... :) – Esko 2009-11-02 16:10:58
SimpleJdbcTemplate現在確實被棄用 – Helenesh 2017-03-21 12:05:18