JSP中使用數(shù)據(jù)庫教學(xué)目的課件_第1頁
JSP中使用數(shù)據(jù)庫教學(xué)目的課件_第2頁
JSP中使用數(shù)據(jù)庫教學(xué)目的課件_第3頁
JSP中使用數(shù)據(jù)庫教學(xué)目的課件_第4頁
JSP中使用數(shù)據(jù)庫教學(xué)目的課件_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 第七講 JSP中使用數(shù)據(jù)庫教學(xué)目的 本講講述JSP中使用JDBC實(shí)現(xiàn)數(shù)據(jù)庫的查詢 。 1 數(shù)據(jù)源 2 數(shù)據(jù)庫的查詢 第七講 JSP中使用數(shù)據(jù)庫 在JSP中可以使用Java的JDBC技術(shù),實(shí)現(xiàn)對(duì)數(shù)據(jù)庫中表記錄的查詢、修改和刪除等操作。JDBC技術(shù)在JSP開發(fā)中占有很重要的地位。 JDBC(Java DataBase Connectivity)是Java數(shù)據(jù)庫連接API。簡單地說,JDBC能完成三件事:(1) 與一個(gè)數(shù)據(jù)庫建立連接,(2) 向數(shù)據(jù)庫發(fā)送SQL語句,(3) 處理數(shù)據(jù)庫返回的結(jié)果。 JDBC在設(shè)計(jì)上和ODBC很相似。JDBC和數(shù)據(jù)庫建立連接的一種常見方式是建立起一個(gè)JDBCODBC橋

2、接器。由于ODBC驅(qū)動(dòng)程序被廣泛的使用,建立這種橋接器后,使得JDBC有能力訪問幾乎所有類型的數(shù)據(jù)庫。JDBC也可以直接加載數(shù)據(jù)庫驅(qū)動(dòng)程序訪問數(shù)據(jù)庫,我們將在?節(jié)討論。 如果使用JDBCODBC橋接器訪問數(shù)據(jù)庫,事先必須設(shè)置數(shù)據(jù)源。7.1 數(shù) 據(jù) 源 假設(shè)要訪問SQL Server服務(wù)器上的pubs數(shù)據(jù)庫,該庫有一個(gè)表students 。 為連接一個(gè)SQL-Server數(shù)據(jù)庫,我們需設(shè)置一個(gè)數(shù)據(jù)源。在控制面板選擇ODBC數(shù)據(jù)源。 雙擊ODBC數(shù)據(jù)源圖標(biāo)。這里顯示了用戶已有的數(shù)據(jù)源的名稱。 選擇“用戶DSN”,點(diǎn)擊add按鈕,增加新的數(shù)據(jù)源。 為新增的數(shù)據(jù)源選擇驅(qū)動(dòng)程序,因?yàn)橐L問SQL Ser

3、ver數(shù)據(jù)庫,選擇SQL Server,點(diǎn)擊完成按鈕(為數(shù)據(jù)源選擇了驅(qū)動(dòng)程序),出現(xiàn)設(shè)置數(shù)據(jù)源具體項(xiàng)目的對(duì)話框。在名稱欄里為數(shù)據(jù)源起一個(gè)你自己喜歡的名字,這里我們起的名字是sun(當(dāng)然,如果你喜歡的話,可以把名字叫做moon.)。這個(gè)數(shù)據(jù)源就是指某個(gè)數(shù)據(jù)庫(將來隨著計(jì)算機(jī)的進(jìn)步,我們也可能有能力把數(shù)據(jù)源設(shè)成是一個(gè)衛(wèi)星上來的信號(hào))。在“你想連接哪個(gè)SQL Server?”欄中選擇或輸入一個(gè)數(shù)據(jù)庫服務(wù)器,這里我們選擇了網(wǎng)絡(luò)上的另一臺(tái)機(jī)器:Ping。 單擊“下一步”出現(xiàn)新的畫面,選擇連接SQL Server 的ID。 在這里的對(duì)話框中,選擇“使用用戶輸入登錄標(biāo)識(shí)號(hào)和密碼的SQL Server驗(yàn)證”選

4、項(xiàng),并且我們選擇用戶名為sa (不需要密碼),單擊“下一步”出現(xiàn)選擇數(shù)據(jù)庫的對(duì)話框。 選中“改變默認(rèn)的數(shù)據(jù)庫為”復(fù)選框,在下拉菜單里,我們選擇用戶sa有權(quán)限操作的數(shù)據(jù)庫pubs。單擊“下一步”出現(xiàn)完成數(shù)據(jù)源設(shè)置的對(duì)話框。 單擊“完成”出現(xiàn)你所配置的數(shù)據(jù)源的信息窗口。 點(diǎn)擊“測(cè)試數(shù)據(jù)源”按鈕,如果正常就會(huì)出現(xiàn)數(shù)據(jù)源設(shè)置成功的窗口。續(xù)前頁:7.3 查詢記錄 要查詢數(shù)據(jù)庫中的記錄,必須和數(shù)據(jù)庫建立連接,由于使用的是JDBC-ODBC方式訪問數(shù)據(jù)庫,那么就要與數(shù)據(jù)源建立連接。 (1)連接到數(shù)據(jù)庫 首先使用包java.sql中的Connection類聲明一個(gè)對(duì)象,然后再使用類DriverManager調(diào)

5、用它的靜態(tài)方法getConnection創(chuàng)建這個(gè)連接對(duì)象:Connection con = DriverManager.getConnection(jdbc:odbc:數(shù)據(jù)源名字,login name, password ); 假如您沒有為數(shù)據(jù)源設(shè)置login name 和password,那么連接形式是:Connection con = DriverManager. getConnection(jdbc:odbc:數(shù)據(jù)源名字, , );與數(shù)據(jù)庫pubs(它就是數(shù)據(jù)源sun)建立連接,格式如下: try Connection con = DriverManager. getConnection

6、(jdbc:odbc:sun, sa, ); catch(SQLException e) 這樣就建立了到數(shù)據(jù)庫pubs的連接。 (2)向數(shù)據(jù)庫發(fā)送SQL語句。 首先使用Statement聲明一個(gè)SQL語句對(duì)象,然后通過剛才創(chuàng)建的連接數(shù)據(jù)庫的對(duì)象con調(diào)用方法createStatment()創(chuàng)建這個(gè)SQL語句對(duì)象。try Statement sql=con.createStatement();catch(SQLException e ) (3)處理查詢結(jié)果 有了SQL語句對(duì)象后,這個(gè)對(duì)象就可以調(diào)用相應(yīng)的方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫中表的查詢和修改。并將查詢結(jié)果存放在一個(gè)ResultSet類聲明的對(duì)象中,也就

7、是說SQL語句對(duì)數(shù)據(jù)庫的查詢操作將返回一個(gè)ResultSet對(duì)象:ResultSet rs=sql.executeQuery(SELECT * FROM 成績表);7.3.1 順序查詢 使用結(jié)果集Result的next()方法,可以順序的查詢。一個(gè)結(jié)果集將游標(biāo)最初定位在第一行的前面,第一次調(diào)用next()方法使游標(biāo)移動(dòng)到第一行。next()方法返回一個(gè)boolean型數(shù)據(jù),當(dāng)游標(biāo)移動(dòng)到最后一行之后返回false。 在下面的例子1中,我們查詢數(shù)據(jù)庫pubs(數(shù)據(jù)源sun)中students表里的包含全部字段的記錄。圖7.1 順序查詢例子1(效果如圖7.1所示)Example7_1.jsp: %

8、Connection con; Statement sql; ResultSet rs; tryClass.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e) try con=DriverManager.getConnection(jdbc:odbc:sun,sa,); sql=con.createStatement(); rs=sql.executeQuery(SELECT * FROM students); out.print(); out.print(); out.print(+學(xué)號(hào)); out.p

9、rint(+姓名);續(xù)前頁: out.print(+數(shù)學(xué)成績); out.print(+英語成績); out.print(+物理成績); out.print(); while(rs.next() out.print(); out.print(+rs.getString(1)+); out.print(+rs.getString(2)+); out.print(+rs.getInt(數(shù)學(xué)成績)+); out.print(+rs.getInt(英語成績)+); out.print(+rs.getInt(物理成績)+); out.print() ; out.print(); con.close();

10、 catch(SQLException e1) % 在下面的例子2中查詢“英語成績”字段值大于80的記錄,但只顯示“姓名”字段(第2個(gè)字段)和“英語成績”字段。例子2Example7_2.jsp: = 80 ); out.print(); out.print(); out.print(+姓名); out.print(+英語成績); out.print(); while(rs.next() out.print(); out.print(+rs.getString(2)+); out.print(+rs.getInt(英語成績)+); out.print() ; out.print(); con.

11、close(); catch(SQLException e1) %7.3.2 游動(dòng)查詢 前面我們學(xué)習(xí)了使用Result的next()方法順序地查詢數(shù)據(jù),但有時(shí)候我們需要在結(jié)果集中前后移動(dòng)、或顯示結(jié)果集指定的一條記錄等等。這時(shí),我們必須要返回一個(gè)可滾動(dòng)的結(jié)果集。為了得到一個(gè)可滾動(dòng)的結(jié)果集,和上一節(jié)不同的是,我們必須使用下述方法先獲得一個(gè)Statement對(duì)象: Statement stmt=con.createStatement(int type ,int concurrency); 然后,根據(jù)參數(shù)的type、concurrency的取值情況,stmt返回相應(yīng)類型的結(jié)果集: ResultSet

12、re=stmt.executeQuery(SQL語句);滾動(dòng)查詢經(jīng)常用到ResultSet的下述方法: public boolean previous():將游標(biāo)向上移動(dòng),該方法返回boolean型數(shù)據(jù),當(dāng)移到結(jié)果集第一行之前時(shí)返回false. public void beforeFirst:將游標(biāo)移動(dòng)到結(jié)果集的初始位置,即在第一行之前。 public void afterLast():將游標(biāo)移到結(jié)果集最后一行之后。 public void first():將游標(biāo)移到結(jié)果集的第一行。 public void last():將游標(biāo)移到結(jié)果集的最后一行。 public boolean isAfte

13、rLast():判斷游標(biāo)是否在最后一行之后。 public boolean isBeforeFirst():判斷游標(biāo)是否在第一行之前 public boolean ifFirst():判斷游標(biāo)是否指向結(jié)果集的第一行。 public boolean isLast():判斷游標(biāo)是否指向結(jié)果集的最后一行。 public int getRow():得到當(dāng)前游標(biāo)所指行的行號(hào),行號(hào)從1開始,如果結(jié)果集沒有行,返回0 public boolean absolute(int row):將游標(biāo)移到參數(shù)row指定的行號(hào)。 注意,如果row取負(fù)值,就是倒數(shù)的行數(shù),absolute(-1)表示移到最后一行,absol

14、ute(-2)表示移到倒數(shù)第2行。當(dāng)移動(dòng)到第一行前面或最后一行的后面時(shí),該方法返回false。 在下面的例子中,首先將游標(biāo)移動(dòng)到最后一行,然后再獲取行號(hào),這樣就獲得表中的記錄數(shù)目。然后我們倒序輸出結(jié)果集中的記錄,即首先輸出最后一行。最后單獨(dú)輸出第5條記錄。例子3Example7_3.jsp: % String name,number; int math,physics,english; Connection con; Statement sql; ResultSet rs; tryClass.forName(sun.jdbc.odbc.JdbcOdbcDriver); 續(xù)前頁: out.pri

15、nt(); /為了逆序輸出記錄,需將游標(biāo)移動(dòng)到最后一行之后: rs.afterLast(); while(rs.previous() out.print(); number=rs.getString(1); out.print(+number+); name=rs.getString(2); out.print(+name+); math=rs.getInt(數(shù)學(xué)成績); out.print(+math+); english=rs.getInt(英語成績); out.print(+english+); physics=rs.getInt(物理成績); out.print(+physics+);

16、 out.print() ; 續(xù)前頁: out.print(); out.print(單獨(dú)輸出第5條記錄); rs.absolute(5); number=rs.getString(1); out.print(number+,); name=rs.getString(2); out.print(name+,); math=rs.getInt(數(shù)學(xué)成績); out.print(math+,); english=rs.getInt(英語成績); out.print(english+,); physics=rs.getInt(物理成績); out.print(physics+。); con.clos

17、e(); catch(SQLException e1) %7.3.3 隨機(jī)查詢 在下面的例子中,我們隨機(jī)從結(jié)果集中取出4條記錄,并計(jì)算4條記錄的數(shù)學(xué)成績的平均值。用Math類的靜態(tài)方法random()可以產(chǎn)生一個(gè)大于0小于1的隨機(jī)數(shù),再用下述公式: int i=(int)(Math.random()*number+1); 產(chǎn)生一個(gè)1到number之間的隨機(jī)數(shù),根據(jù)這個(gè)隨機(jī)數(shù)將游標(biāo)移動(dòng)到相應(yīng)的行,并輸出該行,算法的進(jìn)一步細(xì)節(jié)可見下述例子4。例子4Example7_4.jsp: % String xuehao,name; int math; Connection con; Statement sq

18、l; ResultSet rs; tryClass.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e) try con=DriverManager.getConnection(jdbc:odbc:sun,sa,); sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);續(xù)前頁: /返回可滾動(dòng)的結(jié)果集: rs=sql.executeQuery(SELECT * FROM students); o

19、ut.print(); out.print(); out.print(+學(xué)號(hào)); out.print(+姓名); out.print(+數(shù)學(xué)成績); out.print(); /將游標(biāo)移動(dòng)到最后一行: rs.last(); /獲取最后一行的行號(hào): int lownumber=rs.getRow(); /獲取記錄數(shù): int number=lownumber; double sum=0; int 抽取數(shù)目=4; int old_i=0,0,0,0; int k=抽取數(shù)目; int j=0;續(xù)前頁: while(抽取數(shù)目0) int i=(int)(Math.random()*number+1);

20、/隨機(jī)獲取一個(gè)1到number之間的數(shù)。 boolean boo=false; for(int m=0;mold_i.length;m+) /查找該行是否已被取出。 if(i=old_im) boo=true; if(boo) continue; /假如該行已被取出,結(jié)束本次循環(huán),繼續(xù)產(chǎn)生隨機(jī)數(shù)。 rs.absolute(i); /游標(biāo)移到這一行。 out.print(); xuehao=rs.getString(1); /獲取該行學(xué)號(hào)字段的值。 out.print(+xuehao+); name=rs.getString(2); /獲取該行姓名字段的值。 out.print(+name+);

21、 math=rs.getInt(數(shù)學(xué)成績); /獲取改行數(shù)學(xué)成績字段的值7.3.4 參數(shù)查詢 在下面的例子中,客戶通過Example5_5.jsp頁面輸入查詢條件,如按姓名查詢成績或按分?jǐn)?shù)段查詢學(xué)生成績等等。輸入姓名提交給byname.jsp頁面,輸入分?jǐn)?shù)段提交給byscore.jsp頁面。 例子5Example5_5.jsp: 成績查詢 輸入姓名: 續(xù)前頁: 根據(jù)分?jǐn)?shù)查詢名單: 英語分?jǐn)?shù)在 和 之間 數(shù)學(xué)分?jǐn)?shù)在 和 之間 續(xù)前頁: catch(ClassNotFoundException e) try con=DriverManager.getConnection(jdbc:odbc:sun

22、,sa,); sql=con.createStatement(); String condition=SELECT * FROM students WHERE 姓名 = +name+; rs=sql.executeQuery(condition); out.print(); out.print(); out.print(+學(xué)號(hào)); out.print(+姓名); out.print(+數(shù)學(xué)成績); out.print(+英語成績); out.print(+物理成績); out.print(); while(rs.next() out.print(); out.print(+rs.getStri

23、ng(1)+); out.print(+rs.getString(2)+); out.print(+rs.getInt(數(shù)學(xué)成績)+); 續(xù)前頁: out.print(+rs.getInt(英語成績)+); out.print(+rs.getInt(物理成績)+); out.print() ; out.print(); con.close(); catch(SQLException e) %byscore.jsp: % /獲取提交的分?jǐn)?shù)的最大值和最小值: String englishmax=request.getParameter(englishmax); if(englishmax=null

24、) englishmax=100; String englishmin=request.getParameter(englishmin); if(englishmin=null) englishmin=0; String mathmax=request.getParameter(mathmax); if(mathmax=null) mathmax=100; 續(xù)前頁: String mathmin=request.getParameter(mathmin); if(mathmin=null) mathmin=0; Connection con=null; Statement sql=null;

25、ResultSet rs=null; tryClass.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e) try con=DriverManager.getConnection(jdbc:odbc:sun,sa,); sql=con.createStatement(); String eCondition=英語成績 = +englishmin; String mCondition=數(shù)學(xué)成績 = +mathmin; String condition=SELECT * FROM students WHERE

26、 +mCondition+ and +eCondition; rs=sql.executeQuery(condition);續(xù)前頁: out.print(); out.print(); out.print(+學(xué)號(hào)); out.print(+姓名); out.print(+數(shù)學(xué)成績); out.print(+英語成績); out.print(+物理成績); out.print(); while(rs.next() out.print(); out.print(+rs.getString(1)+); out.print(+rs.getString(2)+); out.print(+rs.getIn

27、t(數(shù)學(xué)成績)+); out.print(+rs.getInt(英語成績)+); out.print(+rs.getInt(物理成績)+); out.print() ; out.print(); con.close(); catch(SQLException e) %7.3.5 排序查詢 可以在SQL語句中使用ORDER BY子語句,對(duì)記錄排序。在下面的例子中,使用SQL語句的ORDER BY子語句查詢所同學(xué)的成績,可以選擇按3科的總分從低到高排列記錄、按姓氏拼音排序或英語成績排序。 例如,按總成績排序查詢的SQL語句:SELECT * FROM student ORDER BY 數(shù)學(xué)成績+英語成績+物理成績。例子6Example7_6:查詢成績: 按姓氏排序 按總分排序 按英語排序 byname1.jsp: % /獲取提交的排序方式: String name=request.getParameter(R); if(name=null) name=; byte b=name.getBytes(IS

溫馨提示

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

評(píng)論

0/150

提交評(píng)論