2009-07-08 30 views
32

在很多編程語言中這樣的事情是可能的準備語句:使用變量,而不是用JDBC參數指數編制聲明

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ${name}"); 
statement.setString("name", "IBM"); 

但不能與java.sql.PreparedStatement中。在Java中,必須使用參數索引:

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ?"); 
statement.setString(1, "IBM"); 

是否有類似於第一個示例中的字符串變量的解決方案? 「$ {。*}」不是在SQL語言的其他地方使用,還是存在任何衝突?因此,我會自己實現它(解析SQL字符串並將每個變量替換爲「?」,然後以Java方式執行)。

問候, 凱

+4

我一直困惑不已了。 http://www.javaworld.com/javaworld/jw-04-2007/jw-04-jdbc.html有一些我曾經用過的東西。 – akarnokd 2009-07-08 12:53:31

+0

嘿kd304,我想知道爲什麼你沒有留下你的消息作爲答案,而不是使用評論。因爲我認爲這是解決這個問題的方法。 – Zardoz 2009-07-08 13:32:38

+0

@tokel:我不確定你的問題是不是理論上的問題,我的評論並沒有真正回答你輸入的問題。 – akarnokd 2009-07-08 21:24:08

回答

5

使用PreparedStatement的原料,這是不可能的,就像你說的。 CallableStatement是可能的,但這需要存儲過程而不僅僅是一個SQL語句。

像Hibernate這樣的ORM層也提供了命名參數替換,Hibernate也允許你執行本地SQL,完全繞過OR映射功能。所以如果你真的熱衷於使用命名參數,你可以使用Hibernate作爲這樣做的一種方式;你只能使用其功能的一小部分。