使用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命令語句來調用和查看結果:

  

    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     }
View Code

觀察程序運行結果:

  

  CallableStatement對象是Statement對象的子類,因此在調用JdbcUtils.release方法時使用了多態。在prepareCall方法中的參數是指定調用哪個存儲過程的字符串,同時使用到了占位符,那么通過CallableStatement對象對傳入類型的參數設置要替代占位符的數據,而對於輸出類型的參數則調用registerOutParameter方法替代占位符並指定SQL類型。在Java中Types類封裝了各種SQL類型的字段。

  以上就是如何使用JDBC調用MySQL數據庫中的存儲過程的步驟。

 

 

 

      

                


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM