J2ee Jdbc存儲過程調用
首先給大家出個題目,看看有想法沒有,
求二者的關系
男A與女B結婚生了男C
男X與女Y結婚生了女Z
男C與女Z結婚...
這就是人間的結婚生子一代傳一代的關系
(要考慮一人多次結婚的情況)
目的:
設置Table,欄位自定,
寫一SQL函數(shù)求出若干年前后的任意兩人之間的關系,假定身份證號碼不重復,當輸入兩身份證后就能得出他們的關系
下面是正文
Jdbc存儲過程是保存起來的可以接受和返回用戶提供的參數(shù)的 Transact-SQL 語句的集合。 可以創(chuàng)建一個過程供永久使用,或在一個會話中臨時使用(局部臨時過程),或在所有會話中臨時使用(全局臨時過程)。 也可以創(chuàng)建在 Microsoft® SQL Server™ 啟動時自動運行的存儲過程。 用戶定義函數(shù),它是返回值的已保存的 Transact-SQL 例程。用戶定義函數(shù)不能用于執(zhí)行一組修改全局數(shù)據(jù)庫狀態(tài)的操作。 與系統(tǒng)函數(shù)一樣,用戶定義函數(shù)可以從查詢中喚醒調用。也可以像存儲過程一樣,通過 EXECUTE 語句執(zhí)行。 總之: 自定義函數(shù):有且只有一個返回值,就像普通的函數(shù)一樣,可以直接在表達式中嵌入調用并可以隨處調用。 存儲過程:可以沒有返回值,也可以有任意個輸出參數(shù),必須單獨調用
存儲過程很好吧,尤其是涉及到多表聯(lián)合更新的問題,就效率易用兩個方面來說就都NB的了。既然這么好的東西,你說說在實際的WEB application里面不用豈不是可惜了,話說到咱們的WEB APP中,要是NB的企業(yè)一般是不會用什么 structs hibernate spring jsf等等框架,但是不能說這些東西不優(yōu)秀不好用,相反一些公司的一般項目用這些東西的優(yōu)點自不必多說。但是現(xiàn)在流行的ssh也不是很好的支持存儲過程,見網(wǎng)上也說hibernate 3.X支持存儲過程,笨人沒有用過,不敢妄加評論,方正2.X不行,有高人說spring支持,查了查看看,里面說到底也是用jdbc,而且還是先要從文件系統(tǒng)里面讀取配置數(shù)據(jù)源的XML文件,解析出來相應的數(shù)據(jù)連接,我測試了一下,單次訪問,速度都明顯的需要等待,試想如果訪問量大的話,速度效率自然不敢恭維。既然本身就是用jdbc,為何不直接生成一個專門處理存儲過程的類,里面用jdbc去處理呢。而且就這個方法也有人用,感覺不是很多,笨人測試了一下,速度明顯比那個提取XML文件的方法高,于是在沒有找到更好辦法時間,我決定暫時用這個笨方法:
下面我給出幾個例子,以后好復習學習:
- create table bankMoney(
- Id varchar(5) primary key not null,
- userID varchar(20),
- sex varchar(2),
- userMoney int
- )
這個table 是隨便搞的,意義混亂,不要當真,說明問題就行
第一種情況:沒有輸入返回記錄集
- create proc selectNoParam
- as
- select * from bankMoney
- java code:
- Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
- Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=bbs", "sa", "sa");
- CallableStatement cs = con.prepareCall("{call selectNoParam()}");
- ResultSet rs = cs.executeQuery();
- while(rs.next()){
- System.out.println(rs.getString("Id")+" " + rs.getString("userid")+" " + rs.getString("sex")+" " + rs.getString("userMoney"));
- }
第二種情況:
有輸入?yún)?shù),沒有輸出參數(shù)的例子。這里的delbankMoney(?),一個問號代表一個參數(shù),包括輸入?yún)?shù)和輸出參數(shù),
//從左到右index從1開始依次增大。一般來說在聲明定義存儲過程時間,后面一般放輸出參數(shù)
--刪除相應員工
- create proc delbankMoney(@paramId varchar(5))
- as
- delete from bankMoney where Id = @paramIdjava code:
- CallableStatement cs = con.prepareCall("{call delbankMoney(?)}");
- cs.setString(1, "001");
- cs.execute();
第三中情況:一個輸入,一個輸出,后面的問號代表輸出,可以有多個輸出,具體怎么設置要根據(jù)你在數(shù)據(jù)庫中的聲明順序
- Proc code:
- create proc testOutPut(@paramId int,@paramSalary int output)
- as
- select @paramSalary = userMoney from bankMoney where Id = @paramId
- java code:
- CallableStatement cs = con.prepareCall("{call testOutPut(?,?)}");
- cs.setString(1, "001");
- cs.registerOutParameter(2, java.sql.Types.TINYINT);
- cs.executeUpdate();
- System.out.println("001號員工工資為:"+cs.getObject(2));
- cs.close();
- con.close();
Jdbc存儲過程調用基本上就是這樣了。
【編輯推薦】