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