JDBC之Statement,PreparedStatement,CallableStatement的區別

Statement、 PreparedStatement 、CallableStatement 區別和聯繫

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

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

3. Statement接口提供了執行語句和獲取結果的基本方法; 
    PreparedStatement接口添加了處理 IN 參數的方法; 
    CallableStatement接口添加了處理 OUT 參數的方法。 
sql

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。 
數據庫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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()
相關文章
相關標籤/搜索