使用JDBC調用存儲過程和函數

原文鏈接:http://www.yiidian.com/jdbc/jdbc-callablestatement.html

1 CallableStatement接口

CallableStatement接口用於調用存儲過程和函數。

通過使用存儲過程和函數,我們可以在數據庫上編寫業務邏輯,這將使性能更好,因爲它們是預編譯的。

2 存儲過程和函數的區別?

file

3 獲取CallableStatement對象

Connection接口的prepareCall() 方法返回CallableStatement對象。語法如下:

public CallableStatement prepareCall("{ call procedurename(?,?...?)}");

下面給出了獲取CallableStatement對象代碼示例:

CallableStatement stmt=con.prepareCall("{call myprocedure(?,?)}");

上面代碼調用了接收2個參數(可能是輸入參數或輸出參數)的存儲過程:myprocedure。

4 調用存儲過程的示例

4.1 創建存儲過程

在MySQL的test數據庫中,執行以下SQL創建pro_insert_user存儲過程:

DELIMITER $$
CREATE PROCEDURE pro_insert_user(username VARCHAR(50),PASSWORD VARCHAR(50))
BEGIN

INSERT INTO t_user(username,PASSWORD) VALUES(username,PASSWORD); 

END $$

存儲過程中涉及的t_user表的表結構如下:

CREATE TABLE `t_user` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `username` varchar(50) DEFAULT NULL,
   `password` varchar(50) DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

4.2 編寫示例代碼

CallProDemo:

package com.yiidian;

import java.io.*;
import java.sql.*;

/**
 * 一點教程網 - http://www.yiidian.com
 */
public class CallProDemo {
    public static void main(String args[])throws Exception {
        try {
            Class.forName("com.mysql.jdbc.Driver");

            Connection con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/test", "root", "root");

            CallableStatement stmt=con.prepareCall("{call pro_insert_user(?,?)}");
            stmt.setString(1,"mark");
            stmt.setString(2,"123");
            stmt.execute();

            System.out.println("存儲過程調用成功!");

            con.close();
        }catch(Exception e){
            System.out.println(e);
        }
    }
}

4.3 運行測試

執行完畢程序後,查看t_user表是否多了一條記錄:

file

5 調用函數的示例

在下面的示例中,我們調用pro_sum函數,該函數接收兩個輸入參數並返回給定數字的總和。在這裏,我們使用到了CallableStatement接口的registerOutParameter() 方法,該方法將輸出參數註冊爲其相應的類型。它向CallableStatement提供有關所顯示結果類型的信息。

Types類定義了許多常量如INTEGER,VARCHAR,FLOAT,DOUBLE,BLOB,CLOB等。

5.1 創建存儲過程

在MySQL的test數據庫中,執行以下SQL創建fun_sum函數:

DELIMITER $$
CREATE FUNCTION fun_sum(n1 INT,n2 INT)
RETURNS INT
BEGIN

DECLARE total INT;  
SET total = n1+n2;  
RETURN total;

END $$

file

5.2 編寫示例代碼

CallFunDemo:

package com.yiidian;

import java.io.*;
import java.sql.*;

/**
 * 一點教程網 - http://www.yiidian.com
 */
public class CallFunDemo {
    public static void main(String args[])throws Exception {
        try {
            Class.forName("com.mysql.jdbc.Driver");

            Connection con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/test", "root", "root");

            CallableStatement stmt=con.prepareCall("{?= call fun_sum(?,?)}");
            stmt.setInt(2,10);
            stmt.setInt(3,43);
            stmt.registerOutParameter(1,Types.INTEGER);
            stmt.execute();

            System.out.println(stmt.getInt(1));

            con.close();
        }catch(Exception e){
            System.out.println(e);
        }
    }
}

5.3 運行測試

file

file

歡迎關注我的公衆號::一點教程。獲得獨家整理的學習資源和日常乾貨推送。 如果您對我的系列教程感興趣,也可以關注我的網站:yiidian.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章