存儲過程在我們的數據庫中使用是比較頻繁的一種結構,他可以大大簡化sql語句的書寫。在java中,我們利用CallableStatement接口,進行存儲過程的調用。
CallableStatement 接口:超級接口有PreparedStatement, Statement, Wrapper。
用於執行 SQL 存儲過程的接口。JDBC API 提供了一個存儲過程 SQL 轉義語法,該語法允許對所有 RDBMS 使用標準方式調用存儲過程。此轉義語法有一個包含結果參數的形式和一個不包含結果參數的形式。如果使用結果參數,則必須將其註冊爲 OUT 參數。其他參數可用於輸入、輸出或同時用於二者。參數是根據編號按順序引用的,第一個參數的編號是 1。
IN 參數值是使用繼承自 PreparedStatement 的 set 方法設置的。在執行存儲過程之前,必須註冊所有 OUT 參數的類型;它們的值是在執行後通過此類提供的 get 方法獲取的。
CallableStatement 可以返回一個 ResultSet 對象或多個 ResultSet 對象。多個 ResultSet 對象是使用繼承自 Statement 的操作處理的。
Types 類:定義用於標識一般 SQL 類型(稱爲 JDBC 類型)的常量的類。在其中有許多靜態的變量標示。
此類永遠是不可序列化的。
設定的存儲過程代碼:在dos模式下記得轉換結束標誌
mysql> create procedure p(
-> in v_a int,in v_b int,out v_c int,inout v_d int)
-> begin
-> if(v_a > v_b) then
-> select v_a into v_c;
-> else
-> select v_b into v_c;
-> end if;
-> select (v_d+1) into v_d;
-> end; //
Query OK, 0 rows affected (0.08 sec)
// 求輸入參數的最大值,在v_d上加1再賦值給v_d
-----------------------------------------------------------------------
public class JdbcCall {
public static void main(String[] args){
Connection conn =null;
CallableStatement ctmt = null; //注意此時爲CallableStatement
ResultSet rs = null;
try{
Class.forName("com.mysql.jdbc.Driver"); //建立驅動
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/studemo","root","root");//建立連接
ctmt = conn.prepareCall("Call p(?,?,?,?)"); //創建語句
ctmt.setInt(1, 2); //參數值的設置參數一表示佔位符位置,參數二表示傳遞的值
ctmt.setInt(2, 4);
//ctmt.setInt(3, x); 3爲輸出不需要進行設置值
ctmt.setInt(4, 6); // 4 既爲輸入,又爲輸出
ctmt.registerOutParameter(3, Types.INTEGER);
ctmt.registerOutParameter(4, Types.INTEGER);
// 每一個輸出參數都要進行註冊設置輸出類型 參數一 佔位符位置,參數二表示類型。Types也是java.sql下的一個類
ctmt.execute();//執行語句
System.out.println(ctmt.getInt(3)); // 通過get方法進行獲取
System.out.println(ctmt.getInt(4));
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(rs!=null){rs.close();rs=null;}
if(ctmt!=null){ctmt.close();ctmt=null;}
if(conn!=null){conn.close();conn=null;}
}catch(SQLException e){
e.printStackTrace();
}
}
}
}