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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

JavaWeb程序設計

——數據庫訪問(3)2主要內容JDBC操作數據庫

ResultSet結果集

CallableStatement對象連接池3ResultSet結果集ResultSet類型的對象是SQL語句執行的結果集,其所給出的方法大都是用來通過控制指針的移動來訪問數據的,如:

first();last();next();getString(intindex)getRow();

…4Statement,PreparedStatement類型的對象用來執行各種SQL語句,而ResultSet對象用來控制查詢所返回的數據集合。因此,這幾種對象的配合使用可以完成對數據庫的基本操作。

當采用Statement,PreparedStatement類型的對象進行數據庫的操作時,都可以用不同的參數來確定結果集ResultSet的返回狀態,如:可讀可寫、游標的類型。具體如下:5

(1)Statement語句

createStatement(intresultSetType,intresultSetConcurrency);

(2)PreparedStatement語句

preparedStatement(Stringsql,intresultSetType,intresultSetConcurrency);6參數說明(1)resultSetType:ResultSet.TYPE_FORWARD_ONLY:結果集不可滾動;ResultSet.TYPE_SCROLL_INSENSITIVE:可滾動,但對底層數據變化不敏感;ResultSet.TYPE_SCROLL_SENSITIVE:可滾動,但對底層數據變化敏感;(2)resultSetConcurrency:ResultSet.CONCUR_READ_ONLY:結果集不可更新;ResultSet.CONCUR_UPDATETABLE:

結果集可更新;7例1:使用可滾動結果集

當需要在結果集中任意的移動游標時,則應該采用可滾動的結果集。

<body>

<%

----加載SQLServer數據庫驅動程序

-----建立與數據庫的連接

8try{

//創建返回可滾動結果集的Statement對象

Statementstmt=conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY);

//執行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("出現SQLException異常"+"<br>");

}finally{

try{

if(conn!=null)conn.close();

}catch(SQLExceptione){

out.println("關閉數據庫連接時出現異常"+"<br>");

}

}%>

</body>

</html>12例2:使用可更新結果集

在對數據的處理過程中,當需要更新結果集中的數據并存儲到數據庫中時,使用可更新的結果集。<body>

<%

----加載SQLServer數據庫驅動程序

-----建立與數據庫的連接

13try{

//創建返回可更新結果集的語句對象

Statementstmt=conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_UPDATETABLE);

//執行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("出現SQLException異常"+"<br>");

}%>

</body>

</html>17主要內容JDBC操作數據庫

ResultSet結果集

CallableStatement對象連接池18CallableStatement對象CallableStatement對象為訪問數據庫使用者提供一種以標準形式調用存儲過程的途徑。存儲過程是存儲在數據庫中的一個對象。什么是存儲過程?

存儲過程(StoredProcedure)

是一組為了完成特定功能的SQL語句集,經編譯后存儲在服務器端數據庫中,用戶通過指定存儲過程的名字并給定參數(如果該存儲過程帶有參數)來執行它。19存儲過程參數

存儲過程的參數分為IN、OUT、INOUT三種類型:(1)IN參數為輸入參數,該參數的值需要在調用時指定,且在存儲過程中修改該參數值不能被返回;(2)OUT參數為輸出參數,可在存儲過程中修改,并可返回,但在存儲過程調用時,實際參數的值被忽略;20存儲過程參數

存儲過程的參數分為IN、OUT、INOUT三種類型:(3)INOUT參數為輸入輸出參數,該參數的值需要在調用時指定,可在存儲過程修改,并可以返回;21例:不帶參數的存儲過程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例:帶參數的存儲過程23存儲過程的優點存儲過程可以實現模塊化管理 存儲過程是實現特定功能的程序體,不同的應用程序都可以通過名稱和參數調用存儲過程,對存儲過程的修改完善不會影響應用程序,提高了系統的可移植性。存儲過程能夠實現較快的執行速度 因為存儲過程是經過預編譯和優化過的程序代碼。存儲過程能夠減少網絡流量 客戶端程序通過名稱和參數調用存儲過程,而非傳遞整個SQL代碼來執行操作。24CallableStatement接口繼承了Statement中的方法,還繼承了PreparedStatement中的方法。CallableStatement方法主要是調用存儲過程的。(1)調用存儲過程的語法在JDBC中調用存儲過程的語法如下:

{call過程名[(?,?,…)]}

不帶參數存儲過程的語法:

{call過程名}CallableStatement對象25(2)創建CallableStatement對象創建CallableStatement對象是通過Connection接口的prepareCall()方法。下面是創建該對象的樣例,其中包括了對存儲過程geTestData的調用:

CallableStatementcstmt=con.prepareCall(“{callgetTestData(?,?)}”)

其中,?為IN、OUT或INOUT參數,這要取決于存儲過程getTestData中的定義.26(3)IN和OUT參數

在用CallableStatement對象調用存儲過程,當存儲過程帶有參數時,需要對IN參數進行傳遞,對OUT參數進行注冊。

將IN參數傳給CallableStatement對象是通過方法:setXXX(),該方法繼承自PreparedStatement;

如果存儲過程返回OUT參數,則在執行CallableStatement對象之前,需要先注冊每個OUT參數的JDBC類型,注冊是用registerOutParameter()方法完成的。

27③在執行完成后,使用getXXX()方法取回返回參數值,其中“XXX”數據類型為各返回參數所注冊的JDBC類型所對應的Java數據類型。28例:調用getTestData存儲過程(兩個OUT參數)

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);注冊輸出參數生成CallableStatment對象獲取輸出值29(4)INOUT參數

當參數為INOUT類型時,需要對該參數進行值的傳遞,還要對參數進行注冊。

通過方法:setXXX(),進行參數值的傳遞,需要注意該方法傳遞的數據為Java數據類型;

用registerOutParameter()方法進行該參數JDBC數據類型的注冊;

③用getXXX()方法獲取該參數的值,為Java數據類型。

因此,①中的Java數據類型應能對應到②中的JDBC數據類型,則③和①的數據類型應該一致。30例:調用getTestData存儲過程(1個INOUT參數)

CallableStatementcstmt=con.prepareCall(“{callgetTestData(?)}”);

cstmt.setByte(1,25);

cstmt.registerOutParameter(1,java.sql.Types.

TINYINT);

cstmt.executeUpdate();

bytex=cstmt.getByte(1);

注冊參數生成CallableStatment對象獲取參數值傳遞參數值31(5)檢索結果

為了實現程序最大的可移植性,由于某些數據庫系統的限制,建議先檢索由執行CallableStatement對象產生的結果,然后再調用getXXX()方法來檢索OUT參數。

例如:如果CallableStatement對象將返回多個執行結果(調用execute()方法):ResultSet對象、更新行數,在檢索OUT參數前應先檢索所有的執行結果。

getResultSet(),getUpdate(),

getMoreResults()

然后再調用getXXX()方法獲取OUT參數32主要內容JDBC操作數據庫

ResultSet結果集

CallableStatement對象

連接池33連接池

對于訪問量非常高的Web應用系統來說,每次創建一個連接都會消耗一定的資源,這樣會大大降低系統的訪問效率。為了解決這樣的問題,可以事先創建好一定數量的連接,然后放入連接池中供用戶使用,用戶在使用完某一連接后,將該連接返回給連接池。34

數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個。(1)分配、釋放策略當用戶請求某一數據庫的連接時,首先看連接池中是否有空閑連接;如果沒有空閑連接,在已經分配出的連接中,尋找一個合適的連接給用戶使用,這時該連接在多個用戶間復用;連接池35

例如:可以選擇一個引用計數(ReferenceCounting)最小的一個連接。用戶在使用完數據庫連接后,應將其釋放,如果該連接沒有使用者的情況下,則會被放入連接池中。(2)配置策略一般情況下,在配置數據庫連接池時,需要考慮初始連接池的連接數目和連接池的最大連接數目。連接池36(1)在Tomcat安裝目錄下的子目錄conf下,打開Server.xml文件。然后在</host>標簽前添加數據源的描述代碼:

<Context>

<Resourcename=“jdbc/mydb”

type=“javax.sql.DataSource” driverClassName=“com.microsoft.sqlserver.jdbc.SQLServerDriver”

url=“jdbc:sqlserver://localhost:1433;DataBaseName=mydb”

在Tomcat服務器上配置數據源(實現線程池機制)37 username=“”

password=“”

maxAct

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論