版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
JavaWeb程序設計
——數(shù)據(jù)庫訪問(3)2主要內容JDBC操作數(shù)據(jù)庫
ResultSet結果集
CallableStatement對象連接池3ResultSet結果集ResultSet類型的對象是SQL語句執(zhí)行的結果集,其所給出的方法大都是用來通過控制指針的移動來訪問數(shù)據(jù)的,如:
first();last();next();getString(intindex)getRow();
…
…4Statement,PreparedStatement類型的對象用來執(zhí)行各種SQL語句,而ResultSet對象用來控制查詢所返回的數(shù)據(jù)集合。因此,這幾種對象的配合使用可以完成對數(shù)據(jù)庫的基本操作。
當采用Statement,PreparedStatement類型的對象進行數(shù)據(jù)庫的操作時,都可以用不同的參數(shù)來確定結果集ResultSet的返回狀態(tài),如:可讀可寫、游標的類型。具體如下:5
(1)Statement語句
createStatement(intresultSetType,intresultSetConcurrency);
(2)PreparedStatement語句
preparedStatement(Stringsql,intresultSetType,intresultSetConcurrency);6參數(shù)說明(1)resultSetType:ResultSet.TYPE_FORWARD_ONLY:結果集不可滾動;ResultSet.TYPE_SCROLL_INSENSITIVE:可滾動,但對底層數(shù)據(jù)變化不敏感;ResultSet.TYPE_SCROLL_SENSITIVE:可滾動,但對底層數(shù)據(jù)變化敏感;(2)resultSetConcurrency:ResultSet.CONCUR_READ_ONLY:結果集不可更新;ResultSet.CONCUR_UPDATETABLE:
結果集可更新;7例1:使用可滾動結果集
當需要在結果集中任意的移動游標時,則應該采用可滾動的結果集。
<body>
<%
----加載SQLServer數(shù)據(jù)庫驅動程序
-----建立與數(shù)據(jù)庫的連接
8try{
//創(chuàng)建返回可滾動結果集的Statement對象
Statementstmt=conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//執(zhí)行SQL查詢語句得到可滾動結果集
ResultSetrs=stmt.executeQuery(“SELECT*FROMstudent”);
//移動到第一條記錄
rs.first();
9//使用next()方法順序顯示結果集
while(rs.next()){
intid=rs.getInt(1);
Stringname=rs.getString(2);
Stringaddress=rs.getString("address");
Datebirthday=rs.getDate(4);
out.println(id+""+name+""+
address+""+birthday+"<br>");
}
10//使用previous()方法逆序顯示結果集
while(rs.previous()){
intid=rs.getInt(1);
Stringname=rs.getString(2);
Stringaddress=rs.getString("address");
Datebirthday=rs.getDate(4);
out.println(id+""+name+""+
address+""+birthday+"<br>");
}11rs.close();
stmt.close();
}catch(SQLExceptione){
out.println("出現(xiàn)SQLException異常"+"<br>");
}finally{
try{
if(conn!=null)conn.close();
}catch(SQLExceptione){
out.println("關閉數(shù)據(jù)庫連接時出現(xiàn)異常"+"<br>");
}
}%>
</body>
</html>12例2:使用可更新結果集
在對數(shù)據(jù)的處理過程中,當需要更新結果集中的數(shù)據(jù)并存儲到數(shù)據(jù)庫中時,使用可更新的結果集。<body>
<%
----加載SQLServer數(shù)據(jù)庫驅動程序
-----建立與數(shù)據(jù)庫的連接
13try{
//創(chuàng)建返回可更新結果集的語句對象
Statementstmt=conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATETABLE);
//執(zhí)行SQL查詢語句得到可更新結果集
ResultSetrs=stmt.executeQuery(
"SELECT*FROMstudentORDERBYstu_id");
可更新結果集14//將游標移動到最后一行
rs.last();
intstuID=rs.getInt("stu_id");
//使用updateXXX方法更新列值
rs.updateString(2,
"newName"+Integer.toString(stuID));
rs.updateString("address","newAddr");
rs.updateDate("birthday",newDate(79,7,stuID%29));
//使用updateRow()方法提交更新結果
rs.updateRow();15//將游標移動到插入行
rs.moveToInsertRow();
stuID++;
//使用updateXXX方法更新列值
rs.updateInt("stu_id",stuID);
rs.updateString(2,"Name"+Integer.toString(stuID));
rs.updateString("address","Addr"+Integer.toString(stuID));
rs.updateDate("birthday",newDate(79,7,stuID%29));
//使用insertRow()方法提交插入行
rs.insertRow();16//將游標移動到當前行
rs.moveToCurrentRow();
rs.previous();
//使用deleteRow()方法刪除一行
rs.deleteRow();
rs.close();
stmt.close();
}catch(SQLExceptione){
out.println("出現(xiàn)SQLException異常"+"<br>");
}%>
</body>
</html>17主要內容JDBC操作數(shù)據(jù)庫
ResultSet結果集
CallableStatement對象連接池18CallableStatement對象CallableStatement對象為訪問數(shù)據(jù)庫使用者提供一種以標準形式調用存儲過程的途徑。存儲過程是存儲在數(shù)據(jù)庫中的一個對象。什么是存儲過程?
存儲過程(StoredProcedure)
是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在服務器端數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給定參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。19存儲過程參數(shù)
存儲過程的參數(shù)分為IN、OUT、INOUT三種類型:(1)IN參數(shù)為輸入?yún)?shù),該參數(shù)的值需要在調用時指定,且在存儲過程中修改該參數(shù)值不能被返回;(2)OUT參數(shù)為輸出參數(shù),可在存儲過程中修改,并可返回,但在存儲過程調用時,實際參數(shù)的值被忽略;20存儲過程參數(shù)
存儲過程的參數(shù)分為IN、OUT、INOUT三種類型:(3)INOUT參數(shù)為輸入輸出參數(shù),該參數(shù)的值需要在調用時指定,可在存儲過程修改,并可以返回;21例:不帶參數(shù)的存儲過程CREATEPROCEDUREauthor_inforAS SELECTau_lname,au_fname,title,pub_name FROMauthorsaINNERJOINtitleauthorta ONa.au_id=ta.au_idINNERJOINtitlest ONt.title_id=ta.title_idINNERJOINpublishersp ONt.pub_id=p.pub_id22
CREATEPROCEDUREsalequa@stor_idchar(4),@sumsmallintAS SELECTord_num,ord_date,payterms,title_id,qty FROMsales WHEREstor_id=@stor_id SELECT@sum=sum(qty) FROMsales WHEREstor_id=@stor_id例:帶參數(shù)的存儲過程23存儲過程的優(yōu)點存儲過程可以實現(xiàn)模塊化管理 存儲過程是實現(xiàn)特定功能的程序體,不同的應用程序都可以通過名稱和參數(shù)調用存儲過程,對存儲過程的修改完善不會影響應用程序,提高了系統(tǒng)的可移植性。存儲過程能夠實現(xiàn)較快的執(zhí)行速度 因為存儲過程是經(jīng)過預編譯和優(yōu)化過的程序代碼。存儲過程能夠減少網(wǎng)絡流量 客戶端程序通過名稱和參數(shù)調用存儲過程,而非傳遞整個SQL代碼來執(zhí)行操作。24CallableStatement接口繼承了Statement中的方法,還繼承了PreparedStatement中的方法。CallableStatement方法主要是調用存儲過程的。(1)調用存儲過程的語法在JDBC中調用存儲過程的語法如下:
{call過程名[(?,?,…)]}
不帶參數(shù)存儲過程的語法:
{call過程名}CallableStatement對象25(2)創(chuàng)建CallableStatement對象創(chuàng)建CallableStatement對象是通過Connection接口的prepareCall()方法。下面是創(chuàng)建該對象的樣例,其中包括了對存儲過程geTestData的調用:
CallableStatementcstmt=con.prepareCall(“{callgetTestData(?,?)}”)
其中,?為IN、OUT或INOUT參數(shù),這要取決于存儲過程getTestData中的定義.26(3)IN和OUT參數(shù)
在用CallableStatement對象調用存儲過程,當存儲過程帶有參數(shù)時,需要對IN參數(shù)進行傳遞,對OUT參數(shù)進行注冊。
①
將IN參數(shù)傳給CallableStatement對象是通過方法:setXXX(),該方法繼承自PreparedStatement;
②
如果存儲過程返回OUT參數(shù),則在執(zhí)行CallableStatement對象之前,需要先注冊每個OUT參數(shù)的JDBC類型,注冊是用registerOutParameter()方法完成的。
27③在執(zhí)行完成后,使用getXXX()方法取回返回參數(shù)值,其中“XXX”數(shù)據(jù)類型為各返回參數(shù)所注冊的JDBC類型所對應的Java數(shù)據(jù)類型。28例:調用getTestData存儲過程(兩個OUT參數(shù))
CallableStatementcstmt=con.prepareCall(“{callgetTestData(?,?)}”);
cstmt.registerOutParameter(1,java.sql.Types.
TINYINT);
cstmt.registerOutParameter(2,java.sql.Types.
DECIMAL,3);
cstmt.executeQuery();
bytex=cstmt.getByte(1);
java.math.BigDecimaln=cstmt.getBigDecimal(2,3);注冊輸出參數(shù)生成CallableStatment對象獲取輸出值29(4)INOUT參數(shù)
當參數(shù)為INOUT類型時,需要對該參數(shù)進行值的傳遞,還要對參數(shù)進行注冊。
①
通過方法:setXXX(),進行參數(shù)值的傳遞,需要注意該方法傳遞的數(shù)據(jù)為Java數(shù)據(jù)類型;
②
用registerOutParameter()方法進行該參數(shù)JDBC數(shù)據(jù)類型的注冊;
③用getXXX()方法獲取該參數(shù)的值,為Java數(shù)據(jù)類型。
因此,①中的Java數(shù)據(jù)類型應能對應到②中的JDBC數(shù)據(jù)類型,則③和①的數(shù)據(jù)類型應該一致。30例:調用getTestData存儲過程(1個INOUT參數(shù))
CallableStatementcstmt=con.prepareCall(“{callgetTestData(?)}”);
cstmt.setByte(1,25);
cstmt.registerOutParameter(1,java.sql.Types.
TINYINT);
cstmt.executeUpdate();
bytex=cstmt.getByte(1);
注冊參數(shù)生成CallableStatment對象獲取參數(shù)值傳遞參數(shù)值31(5)檢索結果
為了實現(xiàn)程序最大的可移植性,由于某些數(shù)據(jù)庫系統(tǒng)的限制,建議先檢索由執(zhí)行CallableStatement對象產(chǎn)生的結果,然后再調用getXXX()方法來檢索OUT參數(shù)。
例如:如果CallableStatement對象將返回多個執(zhí)行結果(調用execute()方法):ResultSet對象、更新行數(shù),在檢索OUT參數(shù)前應先檢索所有的執(zhí)行結果。
getResultSet(),getUpdate(),
getMoreResults()
然后再調用getXXX()方法獲取OUT參數(shù)32主要內容JDBC操作數(shù)據(jù)庫
ResultSet結果集
CallableStatement對象
連接池33連接池
對于訪問量非常高的Web應用系統(tǒng)來說,每次創(chuàng)建一個連接都會消耗一定的資源,這樣會大大降低系統(tǒng)的訪問效率。為了解決這樣的問題,可以事先創(chuàng)建好一定數(shù)量的連接,然后放入連接池中供用戶使用,用戶在使用完某一連接后,將該連接返回給連接池。34
數(shù)據(jù)庫連接池負責分配、管理和釋放數(shù)據(jù)庫連接,它允許應用程序重復使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個。(1)分配、釋放策略當用戶請求某一數(shù)據(jù)庫的連接時,首先看連接池中是否有空閑連接;如果沒有空閑連接,在已經(jīng)分配出的連接中,尋找一個合適的連接給用戶使用,這時該連接在多個用戶間復用;連接池35
例如:可以選擇一個引用計數(shù)(ReferenceCounting)最小的一個連接。用戶在使用完數(shù)據(jù)庫連接后,應將其釋放,如果該連接沒有使用者的情況下,則會被放入連接池中。(2)配置策略一般情況下,在配置數(shù)據(jù)庫連接池時,需要考慮初始連接池的連接數(shù)目和連接池的最大連接數(shù)目。連接池36(1)在Tomcat安裝目錄下的子目錄conf下,打開Server.xml文件。然后在</host>標簽前添加數(shù)據(jù)源的描述代碼:
<Context>
<Resourcename=“jdbc/mydb”
type=“javax.sql.DataSource” driverClassName=“com.microsoft.sqlserver.jdbc.SQLServerDriver”
url=“jdbc:sqlserver://localhost:1433;DataBaseName=mydb”
在Tomcat服務器上配置數(shù)據(jù)源(實現(xiàn)線程池機制)37 username=“”
password=“”
maxAct
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024某廣告公司與某品牌之間的2024年度廣告投放合同
- 2024年餐館老板與廚師協(xié)議3篇
- 2024年采購合同:醫(yī)療設備購買與技術支持服務
- 2024性格不合離婚協(xié)議書-夫妻情感修復方案3篇
- 2024技術服務與支持協(xié)議版A版
- 2024年新款智能IC卡供應合同合同范本版B版
- 2024文藝演出合同模板:網(wǎng)絡直播文藝表演合作協(xié)議3篇
- 2024年裝修工程清包勞動力服務協(xié)議一
- 2024年版招標協(xié)議部門工作職責明細版B版
- 2024年研究報告修改與完善協(xié)議
- 1000MW機組鍋爐過渡段T23水冷壁管檢修導則(征求意見稿)
- 夾層鋼結構施工方案鋼結構夾層施工方案
- 人教版九年級數(shù)學上冊期末復習課件全套
- YS/T 752-2011復合氧化鋯粉體
- GB/T 28708-2012管道工程用無縫及焊接鋼管尺寸選用規(guī)定
- GB/T 231.2-2012金屬材料布氏硬度試驗第2部分:硬度計的檢驗與校準
- GA/T 975-2019警用裝備名詞術語
- 《天津市安全生產(chǎn)條例》試習題 -參考答案
- 傳統(tǒng)運動養(yǎng)生法課件
- iatf16949培訓教材課件
- 牛津滬教版六上英語Unit 2 My summer holiday課件
評論
0/150
提交評論