2011-03-31 33 views
9

「預編譯」語句的作用是什麼,因爲我看到 如果我編寫一個準備好的語句,並且語法錯誤,編譯時不會報告 任何問題!什麼是預編譯JDBC PreparedStatement的工作?

因此,如果預編譯預準備語句不檢查語法有效性,它究竟會做什麼?

+0

您認爲該錯誤在哪裏?在編譯時,或者當你調用'prepare ..(..)' – Bozho 2011-03-31 08:51:45

+2

這取決於數據庫和驅動程序。 JDBC規範沒有規定這一點。 – skaffman 2011-03-31 08:52:50

+0

當我調用prepareStatement – xdevel2000 2011-03-31 08:53:07

回答

14

創建PreparedStatements可能涉及SQL語法驗證甚至DB服務器往返,這完全取決於所使用的JDBC驅動程序。一些司機會進行往返或驗證,其他司機不會。

因此,在一些JDBC驅動程序上,PreparedStatement不像正常的Statement那樣「準備好」。 (換句話說:對於某些JDBC驅動程序,PreparedStatement表示服務器端資源(類似於Connection),而在另一些上則是純客戶端結構)。

的一個重要區別,不過是一個PreparedStatement將幫助你在這是保證,以避免任何轉義或格式問題,如果您嘗試將值手動插入SQL語句字符串,你將有辦法處理動態參數值並使用正常的Statement執行它。

該功能是「準備」語句的選擇事前或不indepdendent,所以它是由每一個JDBC驅動程序提供的,即使它沒有做任何其他的準備步驟。

+0

...因此我們可以說prepareStatement方法向數據庫發送用於編譯的SQL字符串,並且如果提供的話DB執行驗證檢查。在編譯語句之後,被髮回,並被封裝到一個PreparedStatement對象中。 – xdevel2000 2011-03-31 11:45:20

+1

@xdevel:是的,有些JDBC驅動程序/數據庫會這樣做。服務器通常會發回一個句柄。然後,當你執行'PreparedStatement'時,JDBC驅動程序只是簡單地告訴服務器「使用這些參數執行語句4:...」)。 – 2011-03-31 12:00:55

1

「語句編譯」是在數據庫上發生的,它可以幫助它更快速,更高效地返回結果。如果您使用PreparedStatement,那麼它允許數據庫重新使用已編譯的語句,並且不必再次執行它。錯誤的SQL可能會導致嚴重編譯數據庫語句,但並非總是如此。