2013-09-25 77 views
4

聲明我的理解是,對象不能用於開發企業應用程序,因爲它具有良好應用程序中的各種問題。爲什麼它在新版本中尚未被棄用?如果「準備」陳述優越,爲什麼需要「陳述」對象?

+0

歡迎來到Stackoverflow!這聽起來像你在談論SQL語句。你指的是哪種編程語言和哪種數據庫訪問技術? – Joni

+0

我指的是Java語句,用於JDBC連接的準備語句。 –

+1

看看http://stackoverflow.com/a/3385295/1541533 –

回答

3

Statement是一個非常好的界面。有什麼不好的是通過將字符串連接在一起來創建查詢,特別是包含用戶輸入的字符串。如果你只發出不包含變量的常量查詢,那麼簡單的Statement接口就可以很好地工作。

+0

'Statement'是一個接口,實際上 – leonbloy

+0

@leonbloy當然你是對的!固定。 –

2

聲明

使用通用訪問數據庫。在運行時使用靜態SQL語句時很有用。 Statement接口不能接受參數。

使用JDBC中聲明應該是100%本地化被用於DDL(ALTER, CREATE,GRANT等),因爲這些是不能接受BIND 變量唯一的語句類型。

的PreparedStatement

當您計劃使用SQL語句多次使用。 PreparedStatement接口在運行時接受輸入參數。

PreparedStatements或CallableStatements應該用於每種其他類型的語句 (DML,查詢)。因爲這些是接受綁定變量的語句類型。

+0

似乎有點過分,像企業風格的導遊一樣橫行;爲什麼我們應該使用'PreparedStatement'作爲''SELECT COUNT(*)FROM USERS'「? –

1

JDBC驅動程序可以以不同的方式處理SQL語句。具體來說,在Oracle中,PreparedStatement想要綁定它看到的所有內容,如:NAME。

這對Oracle觸發器是有問題的,它使用:NEW和:OLD名稱來表示新舊行。

因此,當您嘗試使用PreparedStatement創建Oracle觸發器時,它將失敗,因爲沒有任何內容綁定到NEW /:OLD的引用。

您必須使用正常的Statement.execute()調用來執行此操作。

+0

Out of Box答案.. :)謝謝 –

1

另外PreparedStatement比Statement更安全。

當您使用Statement並且您從用戶那裏獲得輸入並將其直接傳遞給查詢時請小心。

用戶可以使用SQL注入破解您的系統。