java調(diào)用存儲(chǔ)過程(stored procedures)的HelloWorld例子

java調(diào)用存儲(chǔ)過程(stored procedures)的HelloWorld程序
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。


馬克-to-win:有點(diǎn)數(shù)據(jù)庫基礎(chǔ)的人都知道。存儲(chǔ)過程(stored procedures)和java沒什么關(guān)系。它是一段純粹的數(shù)據(jù)庫sql語言的程序,事先存儲(chǔ)在數(shù)據(jù)庫中。沒有java程序調(diào)用,人家自己獨(dú)立運(yùn)行的也挺好?,F(xiàn)在的問題就是,你有一個(gè)java程序,你想調(diào)用現(xiàn)有的一段存儲(chǔ)過程,如何做這件事兒?我們底下的實(shí)驗(yàn)就是先向數(shù)據(jù)庫存進(jìn)去一個(gè)名為p4的存儲(chǔ)過程,然后再編一段java程序去調(diào)用它。

以下就是我向我的數(shù)據(jù)庫中,插入一個(gè)叫做p4的存儲(chǔ)過程的截圖。




















下面解釋一下:delimiter是定義邊界的意思。delimiter $就是定義$為邊界。一個(gè)$和下一個(gè)$之間就像一個(gè)區(qū)域一樣,在這個(gè)區(qū)域之間的東西才會(huì)被執(zhí)行。mysql缺省默認(rèn)來講見到;就執(zhí)行,但看到delimiter $ 以后,就只會(huì)忍饑挨餓盯著直到下一個(gè)$出現(xiàn),才會(huì)執(zhí)行兩個(gè)$之間的命令。
最后的delimiter ; 就把分隔符從$換回到默認(rèn)的 ;(注意 delimiter后邊一定有一個(gè)空格)

create procedure p4(OUT cnt int)

--創(chuàng)建MySQL存儲(chǔ)過程p4
--此存儲(chǔ)過程的過程名是p4,該過程包含1個(gè)參數(shù),
--是輸出類型的(以O(shè)UT標(biāo)示),參數(shù)名是cnt,類型是int

select count(*) into cnt from test.login;

--再查詢表test.login中count(*),將其輸出到輸出類型的參數(shù)cnt里面

call p4(@a);

調(diào)用p4存儲(chǔ)過程,下面的@a是個(gè)mysql中的臨時(shí)變量,就對應(yīng)剛才的cnt。

順便,如果想刪除一個(gè)procedure,我們就用drop procedure p4;


mysql> use test
mysql> delimiter $
mysql> create procedure p4(OUT cnt int)
-> begin
-> select count(*) into cnt from test.login;
-> end
-> $
Query OK, 0 rows affected (0.00 sec)

-> delimiter ;

mysql> call p4(@a);
Query OK, 0 rows affected (0.00 sec)
mysql> select @a;
+------+
| @a |
+------+
| 2 |
+------+
1 row in set (0.00 sec)


下面的java程序就調(diào)用上面的p4存儲(chǔ)過程。




例:4.1.1
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;
public class TestMark_to_win {
    public static void main(String[] args) throws ClassNotFoundException,
            SQLException {
        String dbUrl = "jdbc:mysql://localhost:3306/test";
        String user = "root";
        String password = "1234";

        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection(dbUrl, user, password);
        System.out.println("Connection is ok");

        CallableStatement cs = con.prepareCall("{call p4(?)}");
        cs.registerOutParameter(1, Types.INTEGER);
        cs.execute();
/*int getInt(int parameterIndex)
    Retrieves the value of the designated JDBC INTEGER parameter as an int in the Java programming language.
    Parameters:
        parameterIndex - the first parameter is 1, the second is 2, and so on */
        System.out.println(cs.getInt(1));
       
        cs.close();
        con.close();
    }
}

result is:

Connection is ok
2