天天看點

Statement、PreparedStatement和CallableStatement異同

1.Statement、PreparedStatement和CallableStatement都是接口(interface)。 

2.Statement繼承自Wrapper、PreparedStatement繼承自Statement、CallableStatement繼承自PreparedStatement。 

3. 

Statement接口提供了執行語句和擷取結果的基本方法; 

PreparedStatement接口添加了處理 IN 參數的方法; 

CallableStatement接口添加了處理 OUT 參數的方法。 

4. 

a.Statement: 

普通的不帶參的查詢SQL;支援批量更新,批量删除; 

b.PreparedStatement: 

可變參數的SQL,編譯一次,執行多次,效率高; 

安全性好,有效防止Sql注入等問題; 

支援批量更新,批量删除; 

c.CallableStatement: 

繼承自PreparedStatement,支援帶參數的SQL操作; 

支援調用存儲過程,提供了對輸出和輸入/輸出參數(INOUT)的支援; 

Statement每次執行sql語句,資料庫都要執行sql語句的編譯 , 

最好用于僅執行一次查詢并傳回結果的情形,效率高于PreparedStatement。 

PreparedStatement是預編譯的,使用PreparedStatement有幾個好處 

1. 在執行可變參數的一條SQL時,PreparedStatement比Statement的效率高,因為DBMS預編譯一條SQL當然會比多次編譯一條SQL的效率要高。 

2. 安全性好,有效防止Sql注入等問題。 

3.  對于多次重複執行的語句,使用PreparedStament效率會更高一點,并且在這種情況下也比較适合使用batch; 

4.  代碼的可讀性和可維護性。 

注: 

executeQuery:傳回結果集(ResultSet)。 

executeUpdate: 執行給定SQL語句,該語句可能為 INSERT、UPDATE 或 DELETE 語句, 

或者不傳回任何内容的SQL語句(如 SQL DDL 語句)。 

execute: 可用于執行任何SQL語句,傳回一個boolean值, 

表明執行該SQL語句是否傳回了ResultSet。如果執行後第一個結果是ResultSet,則傳回true,否則傳回false。

代碼:

Statement用法:   
String sql = "select seq_orderdetailid.nextval as test dual";   
Statement stat1=conn.createStatement();   
ResultSet rs1 = stat1.executeQuery(sql);   
if ( rs1.next() ) {   
    id = rs1.getLong(1);   
}   
  
INOUT參數使用:   
CallableStatement cstmt = conn.prepareCall("{call revise_total(?)}");   
cstmt.setByte(1, 25);   
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);   
cstmt.executeUpdate();   
byte x = cstmt.getByte(1);   
  
Statement的Batch使用:   
Statement stmt  = conn.createStatement();   
String sql = null;   
for(int i =0;i<20;i++){   
    sql = "insert into test(id,name)values("+i+","+i+"_name)";   
    stmt.addBatch(sql);   
}   
stmt.executeBatch();   
  
PreparedStatement的Batch使用:   
PreparedStatement pstmt  = con.prepareStatement("UPDATE EMPLOYEES  SET SALARY = ? WHERE ID =?");   
for(int i =0;i<length;i++){   
    pstmt.setBigDecimal(1, param1[i]);   
    pstmt.setInt(2, param2[i]);   
    pstmt.addBatch();   
}   
pstmt.executeBatch();   
  
PreparedStatement用法:   
PreparedStatement pstmt  = con.prepareStatement("UPDATE EMPLOYEES  SET SALARY = ? WHERE ID =?");   
pstmt.setBigDecimal(1, 153.00);   
pstmt.setInt(2, 1102);   
pstmt. executeUpdate();
           

本文轉自:http://langgufu.iteye.com/blog/1559386