2010-04-01 246 views
3

我喜歡JdbcTemplate的顯而易見的簡單性,但對於它的工作原理我有點困惑。看來每個操作(query()或update())都會從數據源獲取連接並關閉它。使用Spring JdbcTemplate進行多個數據庫操作

很漂亮,但是如何在同一個連接中執行多個SQL查詢?我可能想要按順序執行多個操作(例如,SELECT後跟INSERT,然後是提交),或者我可能想要執行嵌套查詢(SELECT,然後根據每行的結果執行第二個SELECT)。

我該如何做到這一點與JdbcTemplate。我使用正確的課程嗎?

回答

6

如何在同一連接中執行多個SQL 查詢?

這裏的正確答案是"use transactions"。如果您開始交易,然後使用JdbcTemplate執行多個操作,那麼每個操作都將在交易範圍內,因此保證使用相同的連接。

如果你不想捲入到交易,那麼備選方案是使用上JdbcTemplate更基本的操作,像execute(ConnectionCallback action),在那裏,您提供的被賦予了ConnectionConnectionCallback一個實例,可以在其上,然後執行您選擇的任何操作。當然,但是這樣做並不會在任何實際操作中得到JdbcTemplate的幫助。

在Spring中交易真的很容易,你應該考慮使用它們(參見上面的鏈接)。

+0

您實際上不需要使用實際的事務來使用相同的連接。然而,就像在Spring中使用事務一樣,需要使用TransactionProxyFactoryBean或事務模板。您使用PROPAGATION_SUPPORTS或PROPAGATION_NEVER進行傳播,它將重用相同的連接,但不會啓動真實的事務。 – 2011-11-06 03:28:01

+0

如果您正在使用連接池,您不必擔心語句之間沒有獲得相同的連接嗎? – 2013-10-29 19:21:08

4

我假設你想交易?如果是這樣,看看Spring, JdbcTemplate and Transactions

在附註上,我建議你看看Ibatis。 Spring JDBC似乎很方便,但它有一個主要問題:結果集到對象的默認映射使用Spring類,在處理大型結果集時實際上非常慢。你可以通過爲這些查詢編寫自己的行映射器來解決這個問題,但是我個人並不想寫這種樣板文件。

給你一個區別的例子:我有一個查詢需要50秒的時間,而基於Spring反射的行映射器花了2秒鐘的時間用一個手工編碼的行映射器。

此外,Spring JDBC使用內聯SQL。在Java中,這很糟糕,因爲Java(令人討厭)沒有很好的多行String格式。

+0

「結果集默認映射到對象使用Spring類」你能詳細說明嗎?我總是使用RowMappers來處理類似於查詢對象的任何事情。還有什麼其他選擇? – 2010-04-01 23:59:43

+0

我也很好奇「默認映射」在這裏的含義以及它們如何使用反射。我認爲RowMappers是JdbcTemplate的麪包和黃油。 – spaaarky21 2012-04-20 21:45:10

+0

@mattb,@ spaaarky21 Spring可以將結果集映射到對象,例如使用'BeanPropertyRowMapper'類(您可以使用它的谷歌示例)。簡單的查詢如下:'List orders = jt.query(「SELECT * FROM orders WHERE custId =?」,new BeanPropertyRowMapper (MyOrder.class),id);'然後你不必包裝你的實現'RowMapper ',而是將字段映射到'MyOrder'類的setter。 – 2014-04-13 20:18:59

相關問題