Java Web程序開發(fā)與分析課件:數(shù)據(jù)庫訪問(三)_第1頁
Java Web程序開發(fā)與分析課件:數(shù)據(jù)庫訪問(三)_第2頁
Java Web程序開發(fā)與分析課件:數(shù)據(jù)庫訪問(三)_第3頁
Java Web程序開發(fā)與分析課件:數(shù)據(jù)庫訪問(三)_第4頁
Java Web程序開發(fā)與分析課件:數(shù)據(jù)庫訪問(三)_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論