prepareStatement會先初始化SQL,先把這個SQL提交到數據庫中進行預處理,屢次使用可提升效率。
sql
createStatement不會初始化,沒有預處理,每次都是從0開始執行SQL。數據庫
prepareStatement能夠在SQL中用?替換變量xss
代碼以下:函數
int sid=1001; ps=conn.prepareStatement("select * from Cust where ID=?"); int s=1001; ps.setInt(1, s); rs = ps.executeQuery();
createStatement不支持?替換變量,只能在sql中拼接參數性能
int sid=1001; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from Cust where ID="+sid);
Statement ─ 由方法 createStatement 所建立。Statement 對象用於發送簡單的 SQL 語句。spa
PreparedStatement ─ 由方法 prepareStatement 所建立。PreparedStatement 對象用於發送帶有一個或多個輸入參數( IN 參數)的 SQL 語句。PreparedStatement 擁有一組方法,用於設置 IN 參數的值。執行語句時,這些 IN 參數將被送到數據庫中。PreparedStatement 的實例擴展了 Statement ,所以它們都包括了 Statement 的方法。PreparedStatement 對象有可能比 Statement 對象的效率更高,由於它已被預編譯過並存放在那以供未來使用。code
CallableStatement ─ 由方法 prepareCall 所建立。CallableStatement 對象用於執行 SQL 儲存程序 ─ 一組可經過名稱來調用(就象函數的調用那樣)的 SQL 語句。CallableStatement 對象從 PreparedStatement 中繼承了用於處理 IN 參數的方法,並且還增長了用於處理 OUT 參數和 INOUT 參數的方法。orm
如下所列提供的方法能夠快速決定應用哪一個Connection方法來建立不一樣類型的SQL 語句:
createStatement 方法用於: 簡單的SQL語句(不帶參數) 對象
prepareStatement 方法用於:帶一個或多個IN參數的SQL語句,常常被執行的簡單SQL語句 繼承
prepareCall 方法用於: 調用已儲存過程
我的認爲,不管從代碼的可讀性和可維護性,仍是從提升性能方面,或者說避免xss攻擊方面,都應該使用prepareStatement。