1. 程式人生 > >使用jdbc呼叫儲存過程的理解

使用jdbc呼叫儲存過程的理解

 本篇講述如何使用JDBC來呼叫MySQL資料庫中的儲存過程。建議在學習如何使用JDBC呼叫儲存過程前,請先了解如何在資料庫中使用儲存過程。

  儲存過程是指在資料庫系統中,一組為了完成特定功能的SQL語句集,儲存在資料庫中,經過第一次編譯後以後再呼叫任意次都不需要重新編譯了。說白了就是一堆SQL語句的合併,中間加了點邏輯控制,俗稱為資料庫中的函式。在一些金融等大型企業中,基本都是由內部人員編寫好儲存過程,然後由外部程式設計師呼叫儲存過程,因為內部資料邏輯處理方式涉及商業機密等等。

  也就是說我們現在有兩種方式來處理資料庫中的資料,一是通過JDBC從資料庫中取出資料然後通過業務層編寫處理資料的邏輯程式碼;二是在資料庫中定義資料的儲存過程,在這個儲存過程中完成對資料的邏輯操作,就好比資料庫中的函式,而我們在Java程式中只要呼叫資料庫中的這個儲存過程即可。

操作:

  在MySQL資料庫中確定要呼叫哪個儲存過程,包括確定該儲存過程的引數列表為哪些SQL型別。

  在JDBC中通過連結Connection物件,呼叫prepareCall(…)方法,在prepareCall方法中的引數為字串,內容應該為”{call  儲存過程名(?(佔位符,個數根據儲存過程引數來定)...)}”,呼叫這個方法後返回CallableStatement物件。

  通過返回的CallableStatement物件對於傳入型別的引數(IN),如PreparedStatement物件一樣設定佔位符的替代引數,而對於佔位符對應的引數是輸出型別(INOUT),則呼叫CallableStatement物件的registerOutParameter(…)方法,該方法第一個引數指明替代第幾個佔位符,第二個引數指明該儲存過程的輸出引數在資料庫中的SQL型別,在Java程式中可以使用Types類的欄位指定。

  最後通過CallableStatement物件的execute()方法執行儲存過程,即可通過getXXX方法獲取prepareCall方法引數中佔位符型別為輸出的引數值。

 

  下面通過一個例子來說明。

例:

  我們現在資料庫中自定義一個儲存過程,這個儲存過程的功能是在我們傳入的每一個字串引數面前加上一段字串,即將兩端字串連線,最後返回:

複製程式碼
delimiter //

create procedure addPrefix(in inputParam varchar(255),inout inOutParam varchar(255))

begin
select concat('long live sd...',inputParam) into inOutParam; end // delimiter ;
複製程式碼

  分析:第一行我們將MySQL中的分隔符先定義為“//”,因為等會在儲存過程的邏輯程式碼中會使用到“;”,不先定義別的分隔符的話邏輯程式碼還沒寫完資料庫就執行了。第二行定義儲存過程的名稱,同時在引數列表中定義引數輸入輸出型別(IN,OUT,INOUT),引數名稱,引數型別(SQL資料型別)。第三行開始以關鍵字“BEGIN”開始,以“END”和剛才定義的分隔符結束,在這兩個中間就是平常的SQL語句了,也就是在這個部分編寫我們處理引數的邏輯。最後,我們將MySQL資料庫的分隔符重新定義回分號“;”。

  

  注:在資料庫中定義儲存過程時,應先選擇使用的庫,這裡我使用jdbcdemo庫。

  這裡順便一說在MySQL中如何使用SQL命令來呼叫儲存過程,對於我們上面剛剛建立的儲存過程,可以使用如下SQL命令語句來呼叫和檢視結果:

  

1 2 3 4 5 6 set  @inputParam =  'LRR' ;   call addPrefix(@inputParam,@result);   select  @result;

 

  因為我們使用到了輸入引數,因此在呼叫儲存過程之前需要先設定好輸入型別In的引數,在MySQL中,使用“@”代表該引數是一個使用者變數,而對於輸出型別out或inout也需要一個自定義使用者變數,最後由select將結果顯示,結果如下圖所示:

  

  (注:使用者變數在退出MySQL命令列視窗後會自動釋放資源)

  下面開始介紹在Java中如何呼叫資料庫中的儲存過程。

 

  建立Java工程,在工程中匯入資料庫連線驅動的jar包。在【src】目錄下新建一個database.properties檔案,內容如下:

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/jdbcdemo
    username=root
    password=root

  構建JDBC的工具類,包括註冊驅動,獲取連線,釋放資源和連線等,這部分同《JDBC操作資料庫的學習(2)》中相同,此處略。

  接著,我們將使用JDBC來呼叫上面剛剛定義的儲存過程:

複製程式碼
 1 public void callableTest() throws SQLException {
 2         Connection conn = null;
 3         CallableStatement st = null;
 4         ResultSet rs = null;
 5         try{
 6             conn = JdbcUtils.getConnection();
 7             st = conn.prepareCall("{call addPrefix(?,?)}");
 8             st.setString(1, "love LRR");
 9             st.registerOutParameter(2, Types.VARCHAR);
10             st.execute();
11             String contactPrefix = st.getString(2);
12             System.out.println(contactPrefix);
13 
14         }finally{
15             JdbcUtils.release(conn, st, rs);
16         }
17     }
複製程式碼

觀察程式執行結果:

  

  CallableStatement物件是Statement物件的子類,因此在呼叫JdbcUtils.release方法時使用了多型。在prepareCall方法中的引數是指定呼叫哪個儲存過程的字串,同時使用到了佔位符,那麼通過CallableStatement物件對傳入型別的引數設定要替代佔位符的資料,而對於輸出型別的引數則呼叫registerOutParameter方法替代佔位符並指定SQL型別。在Java中Types類封裝了各種SQL型別的欄位。

  以上就是如何使用JDBC呼叫MySQL資料庫中的儲存過程的步驟。

原文連線。感謝博主!