如何在預處理語句中處理數組?即我想做一個查詢,我得到的一個參數是我想在查詢中使用的字符串數組(不要選擇在數組中有字段的行)?Java - 編寫語句和數組
回答
某些JDBC驅動程序可能(在JDBC 4之前)包含支持預處理語句中數組類型參數的專有擴展 - 您需要諮詢API才能實現此目的。這意味着你必須在SQL中使用和操作類似數組的類型。
一個解決方法是使用臨時表。這是元步驟,這樣的解決方案:
- 開始交易(如果您是內部事務 方法,這是自動的 - EJB或Spring);
- 使用帶準備語句的JDBC批量插入創建並填充具有arrary元素的臨時表(臨時表必須具有事務範圍 - 這也是數據庫專用的,但至少由Oracle支持);
- 構建您所需的SQL,其中包含與臨時表的連接以使用數組值(它可以是顯式內部或外部JOIN或隱式連接,例如使用EXISTS等);
- 提交(或回滾,如果應用程序異常)事務(這應該銷燬臨時表;併發事務應該對臨時表的同名沒有衝突)。
示例:將IN表達式替換爲JOIN臨時表。
IBM DB2也可以做到這一點(具有事務性的臨時表範圍)。我喜歡這個想法,但與僅僅動態構建IN子句相比,有什麼好處? – 2009-08-29 07:00:06
我無法證明它,但差異看起來像O(log(n))與O(n)甚至更糟。創建和填充臨時表的開銷對於較大的n(n> 5)可以忽略不計。最初我們介紹了這一點,以克服具有大量元素的IN運算符的性能問題。在添加使用法透明和簡潔的便利方法後,我們再也不會回頭再次使用IN(在元素數量不同的情況下)。 – topchef 2009-08-29 22:09:52
快速性能評論:通過用臨時表代替IN,你基本上用內連接代替OR運算符。任何DBA都會同意由此帶來的性能收益是巨大的。 – topchef 2009-08-29 22:11:23
這可能現在不會幫你,但我讀到JDBC 4將支持在2003版SQL中定義的數組類型。
這幾乎取決於正在使用的RDBMS。這些功能通常可以使用供應商的jdbc驅動程序擴展來完成。
2變種,我發現是(對於Oracle): http://blogs.itemis.de/kloss/2009/03/05/arrays-preparedstatements-jdbc-and-oracle/
http://www.angelfire.com/home/jasonvogel/java_jdbc_arrays.html
嘗試看看是否會幫助你。
- 1. Java編寫語句錯誤
- 2. java編寫類似語句的整數
- 3. mysqli編寫語句和mysqli_real_escape_string
- 4. 編寫語句和花車
- 5. Mysql select JAVA語句編寫準備
- 6. 編寫語句Mysql
- 7. php編寫語句
- 8. 編寫IF語句
- 9. 數組和if語句中的語句
- 10. 在case語句後編寫JOIN語句
- 11. 如何編寫一個if語句來處理兩組數組?
- 12. 編寫語句和IN表達式
- 13. 用Hibernate Session和Spring MVC編寫語句
- 14. 用MySQL和JDBC編寫語句緩存
- 15. C#編寫語句和多個查詢
- 16. 使用%和concat編寫的PDO語句
- 17. 不知道如何在if語句中編寫或和語句
- 18. 數組和if語句
- 19. if ... else語句和數組
- 20. Laravel - Where語句和數組
- 21. PDO編寫的語句 - NULLs
- 22. 編寫一條sql語句
- 23. 用MySQL編寫語句?
- 24. 幫助編寫SELECT語句
- 25. 編寫調試語句
- 26. 如何編寫SQL語句?
- 27. MYSQL PHP編寫語句
- 28. 多線程編寫語句
- 29. MySQLi編寫條件語句
- 30. 如何編寫sql語句
看看這個問題:http://stackoverflow.com/questions/178479/alternatives-for-java-sql-preparedstatement-in-clause-issue – ChssPly76 2009-08-29 06:18:12