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