版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
JavaWeb程序設(shè)計
——數(shù)據(jù)庫訪問(3)2主要內(nèi)容JDBC操作數(shù)據(jù)庫
ResultSet結(jié)果集
CallableStatement對象連接池3ResultSet結(jié)果集ResultSet類型的對象是SQL語句執(zhí)行的結(jié)果集,其所給出的方法大都是用來通過控制指針的移動來訪問數(shù)據(jù)的,如:
first();last();next();getString(intindex)getRow();
…
…4Statement,PreparedStatement類型的對象用來執(zhí)行各種SQL語句,而ResultSet對象用來控制查詢所返回的數(shù)據(jù)集合。因此,這幾種對象的配合使用可以完成對數(shù)據(jù)庫的基本操作。
當(dāng)采用Statement,PreparedStatement類型的對象進行數(shù)據(jù)庫的操作時,都可以用不同的參數(shù)來確定結(jié)果集ResultSet的返回狀態(tài),如:可讀可寫、游標的類型。具體如下:5
(1)Statement語句
createStatement(intresultSetType,intresultSetConcurrency);
(2)PreparedStatement語句
preparedStatement(Stringsql,intresultSetType,intresultSetConcurrency);6參數(shù)說明(1)resultSetType:ResultSet.TYPE_FORWARD_ONLY:結(jié)果集不可滾動;ResultSet.TYPE_SCROLL_INSENSITIVE:可滾動,但對底層數(shù)據(jù)變化不敏感;ResultSet.TYPE_SCROLL_SENSITIVE:可滾動,但對底層數(shù)據(jù)變化敏感;(2)resultSetConcurrency:ResultSet.CONCUR_READ_ONLY:結(jié)果集不可更新;ResultSet.CONCUR_UPDATETABLE:
結(jié)果集可更新;7例1:使用可滾動結(jié)果集
當(dāng)需要在結(jié)果集中任意的移動游標時,則應(yīng)該采用可滾動的結(jié)果集。
<body>
<%
----加載SQLServer數(shù)據(jù)庫驅(qū)動程序
-----建立與數(shù)據(jù)庫的連接
8try{
//創(chuàng)建返回可滾動結(jié)果集的Statement對象
Statementstmt=conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//執(zhí)行SQL查詢語句得到可滾動結(jié)果集
ResultSetrs=stmt.executeQuery(“SELECT*FROMstudent”);
//移動到第一條記錄
rs.first();
9//使用next()方法順序顯示結(jié)果集
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()方法逆序顯示結(jié)果集
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("關(guān)閉數(shù)據(jù)庫連接時出現(xiàn)異常"+"<br>");
}
}%>
</body>
</html>12例2:使用可更新結(jié)果集
在對數(shù)據(jù)的處理過程中,當(dāng)需要更新結(jié)果集中的數(shù)據(jù)并存儲到數(shù)據(jù)庫中時,使用可更新的結(jié)果集。<body>
<%
----加載SQLServer數(shù)據(jù)庫驅(qū)動程序
-----建立與數(shù)據(jù)庫的連接
13try{
//創(chuàng)建返回可更新結(jié)果集的語句對象
Statementstmt=conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATETABLE);
//執(zhí)行SQL查詢語句得到可更新結(jié)果集
ResultSetrs=stmt.executeQuery(
"SELECT*FROMstudentORDERBYstu_id");
可更新結(jié)果集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()方法提交更新結(jié)果
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//將游標移動到當(dāng)前行
rs.moveToCurrentRow();
rs.previous();
//使用deleteRow()方法刪除一行
rs.deleteRow();
rs.close();
stmt.close();
}catch(SQLExceptione){
out.println("出現(xiàn)SQLException異常"+"<br>");
}%>
</body>
</html>17主要內(nèi)容JDBC操作數(shù)據(jù)庫
ResultSet結(jié)果集
CallableStatement對象連接池18CallableStatement對象CallableStatement對象為訪問數(shù)據(jù)庫使用者提供一種以標準形式調(diào)用存儲過程的途徑。存儲過程是存儲在數(shù)據(jù)庫中的一個對象。什么是存儲過程?
存儲過程(StoredProcedure)
是一組為了完成特定功能的SQL語句集,經(jīng)編譯后存儲在服務(wù)器端數(shù)據(jù)庫中,用戶通過指定存儲過程的名字并給定參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。19存儲過程參數(shù)
存儲過程的參數(shù)分為IN、OUT、INOUT三種類型:(1)IN參數(shù)為輸入?yún)?shù),該參數(shù)的值需要在調(diào)用時指定,且在存儲過程中修改該參數(shù)值不能被返回;(2)OUT參數(shù)為輸出參數(shù),可在存儲過程中修改,并可返回,但在存儲過程調(diào)用時,實際參數(shù)的值被忽略;20存儲過程參數(shù)
存儲過程的參數(shù)分為IN、OUT、INOUT三種類型:(3)INOUT參數(shù)為輸入輸出參數(shù),該參數(shù)的值需要在調(diào)用時指定,可在存儲過程修改,并可以返回;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)特定功能的程序體,不同的應(yīng)用程序都可以通過名稱和參數(shù)調(diào)用存儲過程,對存儲過程的修改完善不會影響應(yīng)用程序,提高了系統(tǒng)的可移植性。存儲過程能夠?qū)崿F(xiàn)較快的執(zhí)行速度 因為存儲過程是經(jīng)過預(yù)編譯和優(yōu)化過的程序代碼。存儲過程能夠減少網(wǎng)絡(luò)流量 客戶端程序通過名稱和參數(shù)調(diào)用存儲過程,而非傳遞整個SQL代碼來執(zhí)行操作。24CallableStatement接口繼承了Statement中的方法,還繼承了PreparedStatement中的方法。CallableStatement方法主要是調(diào)用存儲過程的。(1)調(diào)用存儲過程的語法在JDBC中調(diào)用存儲過程的語法如下:
{call過程名[(?,?,…)]}
不帶參數(shù)存儲過程的語法:
{call過程名}CallableStatement對象25(2)創(chuàng)建CallableStatement對象創(chuàng)建CallableStatement對象是通過Connection接口的prepareCall()方法。下面是創(chuàng)建該對象的樣例,其中包括了對存儲過程geTestData的調(diào)用:
CallableStatementcstmt=con.prepareCall(“{callgetTestData(?,?)}”)
其中,?為IN、OUT或INOUT參數(shù),這要取決于存儲過程getTestData中的定義.26(3)IN和OUT參數(shù)
在用CallableStatement對象調(diào)用存儲過程,當(dāng)存儲過程帶有參數(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類型所對應(yīng)的Java數(shù)據(jù)類型。28例:調(diào)用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ù)
當(dāng)參數(shù)為INOUT類型時,需要對該參數(shù)進行值的傳遞,還要對參數(shù)進行注冊。
①
通過方法:setXXX(),進行參數(shù)值的傳遞,需要注意該方法傳遞的數(shù)據(jù)為Java數(shù)據(jù)類型;
②
用registerOutParameter()方法進行該參數(shù)JDBC數(shù)據(jù)類型的注冊;
③用getXXX()方法獲取該參數(shù)的值,為Java數(shù)據(jù)類型。
因此,①中的Java數(shù)據(jù)類型應(yīng)能對應(yīng)到②中的JDBC數(shù)據(jù)類型,則③和①的數(shù)據(jù)類型應(yīng)該一致。30例:調(diào)用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)檢索結(jié)果
為了實現(xiàn)程序最大的可移植性,由于某些數(shù)據(jù)庫系統(tǒng)的限制,建議先檢索由執(zhí)行CallableStatement對象產(chǎn)生的結(jié)果,然后再調(diào)用getXXX()方法來檢索OUT參數(shù)。
例如:如果CallableStatement對象將返回多個執(zhí)行結(jié)果(調(diào)用execute()方法):ResultSet對象、更新行數(shù),在檢索OUT參數(shù)前應(yīng)先檢索所有的執(zhí)行結(jié)果。
getResultSet(),getUpdate(),
getMoreResults()
然后再調(diào)用getXXX()方法獲取OUT參數(shù)32主要內(nèi)容JDBC操作數(shù)據(jù)庫
ResultSet結(jié)果集
CallableStatement對象
連接池33連接池
對于訪問量非常高的Web應(yīng)用系統(tǒng)來說,每次創(chuàng)建一個連接都會消耗一定的資源,這樣會大大降低系統(tǒng)的訪問效率。為了解決這樣的問題,可以事先創(chuàng)建好一定數(shù)量的連接,然后放入連接池中供用戶使用,用戶在使用完某一連接后,將該連接返回給連接池。34
數(shù)據(jù)庫連接池負責(zé)分配、管理和釋放數(shù)據(jù)庫連接,它允許應(yīng)用程序重復(fù)使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是再重新建立一個。(1)分配、釋放策略當(dāng)用戶請求某一數(shù)據(jù)庫的連接時,首先看連接池中是否有空閑連接;如果沒有空閑連接,在已經(jīng)分配出的連接中,尋找一個合適的連接給用戶使用,這時該連接在多個用戶間復(fù)用;連接池35
例如:可以選擇一個引用計數(shù)(ReferenceCounting)最小的一個連接。用戶在使用完數(shù)據(jù)庫連接后,應(yīng)將其釋放,如果該連接沒有使用者的情況下,則會被放入連接池中。(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服務(wù)器上配置數(shù)據(jù)源(實現(xiàn)線程池機制)37 username=“”
password=“”
maxAct
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村房屋協(xié)議轉(zhuǎn)讓協(xié)議書
- 醫(yī)療事故賠償協(xié)議內(nèi)容
- 《電機技術(shù)應(yīng)用》課件 2.2.4 異步電動機的機械特性
- 中學(xué)課程實施方案(2024-2025學(xué)年)
- (2024)電子商務(wù)創(chuàng)業(yè)園項目可行性研究報告建議書(一)
- 2024年度個人年終工作總結(jié)范文三
- 【9上英RJ】亳州市利辛縣部分學(xué)校聯(lián)考2023-2024學(xué)年九年級上學(xué)期期末考試英語試題
- 2024秋新滬科版物理8年級上冊教學(xué)課件 第6章 熟悉而陌生的力 第2節(jié) 測量:用彈簧測力計測量力
- 2023年高收縮腈綸項目籌資方案
- 2023年柔印CTP項目籌資方案
- 鐵路巡防方案
- 如何創(chuàng)造有意義的人生
- 冬季如何預(yù)防腦卒中
- 安檢基礎(chǔ)知識課件
- 習(xí)思想教材配套練習(xí)題 第一章 新時代堅持和發(fā)展中國特色社會主義
- 現(xiàn)代禮儀饋贈禮儀課件
- 病案室防蟲應(yīng)急預(yù)案演練腳本
- 目標導(dǎo)向的教學(xué):七年級英語第一單元教案
- 部編版一年級下冊道德與法治第3課《我不拖拉》教案(含2課時)
- 數(shù)學(xué)與藝術(shù)的結(jié)合探索數(shù)學(xué)和藝術(shù)之間的聯(lián)系和美妙
- 眼科護理的國內(nèi)外發(fā)展動態(tài)和趨勢
評論
0/150
提交評論