jsp訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)_第1頁(yè)
已閱讀1頁(yè),還剩61頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、JSP訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),關(guān)系數(shù)據(jù)庫(kù),Access SQL server Oracle,數(shù)據(jù)庫(kù),DBMS,不同DBMS對(duì)底層數(shù)據(jù)有不同的操作方法,為了隱蔽DBMS和數(shù)據(jù)操作的差異性,產(chǎn)生了統(tǒng)一標(biāo)準(zhǔn):SQL,SQL語(yǔ)言,Jdbc結(jié)構(gòu),SQL,driver,DBMS,,,將SQL調(diào)用轉(zhuǎn)化為DBMS API調(diào)用,JDBC結(jié)構(gòu),,,Java.sql.*,JDBC應(yīng)用程序結(jié)構(gòu),,三種常見(jiàn)的JSP通過(guò)JDBC訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的方法在JSP頁(yè)面中直

2、接訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)在Servlet中訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)通過(guò)JavaBean封裝對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn),,在JSP中可使用Java的JDBC技術(shù),實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中表記錄的查詢(xún)、修改和刪除等操作。JDBC(Java DataBase Connectivity)是Java數(shù)據(jù)庫(kù)連接API??赏瓿扇拢号c一個(gè)數(shù)據(jù)庫(kù)建立連接;向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句;處理數(shù)據(jù)庫(kù)返回的結(jié)果。,使用JDBC對(duì)數(shù)據(jù)庫(kù)進(jìn)行一次數(shù)據(jù)庫(kù)操作需要進(jìn)行如下的幾個(gè)步驟:載入JDBC驅(qū)動(dòng)程序

3、定義連接使用的URL建立連接創(chuàng)建語(yǔ)句對(duì)象執(zhí)行數(shù)據(jù)庫(kù)操作處理結(jié)果關(guān)閉連接,,JDBC和數(shù)據(jù)庫(kù)建立連接的一種常見(jiàn)方式是建立起一個(gè)JDBC-ODBC橋接器。由于ODBC驅(qū)動(dòng)程序被廣泛使用,建立這種橋接器后,使得JDBC有能力訪(fǎng)問(wèn)幾乎所有類(lèi)型的數(shù)據(jù)庫(kù)。JDBC也可以直接加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序來(lái)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。如果使用JDBC-ODBC橋接器訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),事先必須設(shè)置數(shù)據(jù)源。,DBC橋接器,直觀(guān)的理解:一個(gè)數(shù)據(jù)源就是一個(gè)數(shù)據(jù)庫(kù)。為了要鏈接到

4、這個(gè)數(shù)據(jù)庫(kù),需要建立一個(gè)JDBC-ODBC橋接器,即加載橋接器驅(qū)動(dòng)程序。 Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); 其中,Class是包java.lang中的一個(gè)類(lèi),該類(lèi)通過(guò)調(diào)用它的靜態(tài)方法forName就可以建立JDBC-ODBC橋接器。建立橋接器可能發(fā)生異常,所以建立橋接器的標(biāo)準(zhǔn)是: try{ Class.forName(“sun.j

5、dbc.odbc.JdbcOdbcDriver”); } catch(ClassNotFoundException e) {},查詢(xún)記錄,要查詢(xún)數(shù)據(jù)庫(kù)中的記錄,必須和數(shù)據(jù)庫(kù)建立連接。由于是以JDBC-ODBC方式訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),就要與數(shù)據(jù)源建立連接。,連接到數(shù)據(jù)庫(kù),首先使用包java.sql中的Connection類(lèi)聲明一個(gè)對(duì)象,然后再使用類(lèi)DriverManager調(diào)用它的靜態(tài)方法getConnection創(chuàng)

6、建這個(gè)連接對(duì)象。 Connection con= DriverManager.getConnection(“jdbc:odbc:數(shù)據(jù)源名字”,”login name”,”password”); 如果還沒(méi)為數(shù)據(jù)源設(shè)置login name和password,則連接形式是: Connection con= DriverManager.getConnection(“jdbc:odbc:數(shù)據(jù)源名字”,””,””);,向數(shù)據(jù)庫(kù)發(fā)送SQL

7、語(yǔ)句,首先使用Statement類(lèi)聲明一個(gè)SQL語(yǔ)句對(duì)象,然后通過(guò)剛才創(chuàng)建的連接數(shù)據(jù)庫(kù)的對(duì)象con調(diào)用方法createStatment()創(chuàng)建這個(gè)SQL語(yǔ)句對(duì)象。 try{ Statement sql=con. createStatment(); } catch(SQLException e){},創(chuàng)建了Statement接口的實(shí)例后,可調(diào)用其中的方法執(zhí)行SQL語(yǔ)句,JDBC中提供了三種執(zhí)行方

8、法,它們是execute()、executeQuery()和executeUpdate()。executeUpdate方法 :這個(gè)方法一般用于執(zhí)行SQL的INSERT、UPDATE或DELETE語(yǔ)句,當(dāng)執(zhí)行INSERT等SQL語(yǔ)句時(shí),此方法的返回值是執(zhí)行了這個(gè)SQL語(yǔ)句后所影響的記錄的總行數(shù)。,Statement,executeQuery方法 :一般用于執(zhí)行SQL的SELECT語(yǔ)句。它的返回值是執(zhí)行SQL語(yǔ)句后產(chǎn)生的一個(gè)ResultS

9、et接口的實(shí)例(結(jié)果集)。 execute方法 :一般是在用戶(hù)不知道執(zhí)行SQL語(yǔ)句后會(huì)產(chǎn)生什么結(jié)果或可能有多種類(lèi)型的結(jié)果產(chǎn)生時(shí)才會(huì)使用。execute()的執(zhí)行結(jié)果包括如下三種情況: 1.包含多個(gè)ResultSet(結(jié)果集); 2.多條記錄被影響; 3.既包含結(jié)果集也有記錄被影響。,Statement,ResultSet,ResultSet 對(duì)象包含了Statement和PreparedStatement的ex

10、ecuteQuery方法中SELECT查詢(xún)的結(jié)果集,即符合指定SQL 語(yǔ)句中條件的所有行。ResultSet.next 方法用于移動(dòng)到 ResultSet 中的下一行,使下一行成為當(dāng)前行。結(jié)果集一般是一個(gè)表,其中有查詢(xún)所返回的列標(biāo)題及相應(yīng)的值。,處理查詢(xún)結(jié)果,有了SQL語(yǔ)句對(duì)象后,這個(gè)對(duì)象就可以調(diào)用相應(yīng)的方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)中表的查詢(xún)和修改,并將查詢(xún)結(jié)果存放在一個(gè)ResultSet類(lèi)聲明的對(duì)象中,即SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)的查詢(xún)操作將返回一個(gè)R

11、esultSet對(duì)象: ResultSet rs=sql.executeQuery(“SELECT * FROM 成績(jī)表”) ResultSet對(duì)象是由統(tǒng)一形式的列組織的數(shù)據(jù)行組成。 ResultSet對(duì)象一次只能看到一個(gè)數(shù)據(jù)行,使用next()方法走到下一數(shù)據(jù)行。獲得一行數(shù)據(jù)后, ResultSet對(duì)象可以使用getxxxx方法獲得字段值,將位置索引(第一列使用1,第二列使用2等等)或字段名傳遞給getxxx

12、x方法的參數(shù)即可。,ResultSet類(lèi)的方法,driver,connection,Statement,ResultSet,close,,,,,注意次序!,順序查詢(xún),使用結(jié)果集Result的next()方法,可以順序地查詢(xún)。一個(gè)結(jié)果最初將游標(biāo)定位在第一行的前面,第一次調(diào)用next()方法使游標(biāo)移動(dòng)到第一行。Next()方法返回一個(gè)boolean型數(shù)據(jù),當(dāng)游標(biāo)移動(dòng)到最后一行之后返回false.,ex60,游動(dòng)查詢(xún),有時(shí)需要在結(jié)果集中前后移

13、動(dòng)或顯示結(jié)果集指定的一條記錄等等。則需返回一個(gè)可滾動(dòng)的結(jié)果集為了得到一個(gè)可滾動(dòng)的結(jié)果集,需先獲得一個(gè)Statement對(duì)象: Statement stmt=con.createStatement(int type, int concurrency); 然后,根據(jù)參數(shù)type, concurrency取值情況,stmt返回相應(yīng)類(lèi)型的結(jié)果集: ResultSet re=stmt.executeQuery(SQL語(yǔ)句);

14、,Type取值決定滾動(dòng)方式,取值可以是:,,,ex61,隨機(jī)查詢(xún),ex62,參數(shù)查詢(xún),ex63,排序查詢(xún),,ex64,分析結(jié)果集查詢(xún),,ex65,使用通配符查詢(xún),可以使用SQL語(yǔ)句操作符like進(jìn)行模式般配,使用”%”代替一個(gè)或多個(gè)字符,用一個(gè)下劃線(xiàn)”_”代替一個(gè)字符。 例:rs.executeQuery(“select * from students where 姓名 like ‘王’ ”),更新記錄,用SQL語(yǔ)句更新記錄中字段的

15、值。 Statement對(duì)象調(diào)用方法: public int executeUpdate(String sqlStatement); 通過(guò)參數(shù)sqlStatement指定的方式實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表中記錄的字段值的更新。,注意事項(xiàng),可使用一個(gè)Statement對(duì)象進(jìn)行更新和查詢(xún)操作,但當(dāng)查詢(xún)語(yǔ)句返回結(jié)果集后,如果沒(méi)有立即輸出結(jié)果集的記錄,而接著執(zhí)行了更新語(yǔ)句,那么結(jié)果集就不能輸出記錄。要想輸出記錄就必須重新返回結(jié)果集。,ex

16、66,添加記錄,對(duì)于添加記錄注意事項(xiàng)與上同刪除記錄,ex67,用結(jié)果集更新數(shù)據(jù)庫(kù)中的表,盡管可以用SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行更新,也可以使用內(nèi)存中的ResultSet對(duì)象對(duì)底層數(shù)據(jù)庫(kù)進(jìn)行更新。,用結(jié)果集更新數(shù)據(jù)庫(kù)中的表,步驟:由Connection對(duì)象調(diào)用如下方法,到一個(gè)可以更新底層數(shù)據(jù)庫(kù)的Statement對(duì)象sql;Statement對(duì)象sql調(diào)用如下方法得到ResultSet對(duì)象rs:rs調(diào)用相應(yīng)updateXXX

17、方法對(duì)rs中所有的行的列值進(jìn)行更新操作。例:將rs移動(dòng)到第n行后,然后調(diào)用updateRow()方法,更新底層數(shù)據(jù)庫(kù)表中的第n條記錄。rs也可以調(diào)用rs.insertRow()方法將更新的結(jié)果集作為一條新的記錄插入到底層數(shù)據(jù)庫(kù)表中。如果rs的某列的值未被更新,那么插入到底層數(shù)據(jù)庫(kù)表中的記錄的相應(yīng)字段值為null.,,ResultSet對(duì)象常用的更新操作方法:,,,ex68,分頁(yè)顯示記錄,假設(shè)總記錄為m,每頁(yè)顯示數(shù)量是n,那么總頁(yè)數(shù)的計(jì)

18、算公式是:如果m除以n的余數(shù)大于0,總頁(yè)數(shù)等于m除以n的商加1;如果m除以n的余數(shù)等于0,總頁(yè)數(shù)等于m除以n的商;如果準(zhǔn)備顯示第p頁(yè)的內(nèi)容,應(yīng)當(dāng)把游標(biāo)移動(dòng)到第(p-1)*n+1條記錄處。,ex69,連接數(shù)據(jù)庫(kù)其他方法,連接Oracle 可通過(guò)JDBC-ODBC橋接器和Oracle數(shù)據(jù)庫(kù)建立連接,但這種連接質(zhì)量依賴(lài)于ODBC.,,查詢(xún)excel電子表,可以通過(guò)JDBC-ODBC橋接器訪(fǎng)問(wèn)Excel電子表格。,ex70,使用同

19、步連接,數(shù)據(jù)庫(kù)操作中,建立連接是耗時(shí)最大的操作之一。如果客戶(hù)訪(fǎng)問(wèn)的是同一數(shù)據(jù)庫(kù),那么為每一個(gè)客戶(hù)建立一個(gè)連接是不合理的。當(dāng)多個(gè)客戶(hù)請(qǐng)求一個(gè)JSP頁(yè)面時(shí),JSP引擎為每個(gè)客戶(hù)啟動(dòng)一個(gè)線(xiàn)程而不是一個(gè)進(jìn)程,這些線(xiàn)程由Web服務(wù)器進(jìn)程來(lái)管理,它們共享JSP頁(yè)面的成員變量。在處理多線(xiàn)程問(wèn)題時(shí),可將線(xiàn)程共享的變量放入一個(gè)synchronized塊,或?qū)⑿薷脑撟兞康姆椒ㄓ胹ynchronized來(lái)修飾,這樣,當(dāng)一個(gè)客戶(hù)用synchronized塊或

20、synchronized方法修改一個(gè)共享變量時(shí),其他線(xiàn)程必須等待,直到該線(xiàn)程執(zhí)行完該方法或同步塊。這樣可把connection對(duì)象作為一個(gè)成員變量被所有的客戶(hù)共享,第一個(gè)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的客戶(hù)負(fù)責(zé)建立連接,以后所有客戶(hù)共享這個(gè)連接。,ex71,網(wǎng)上投票,,ex72,,String 的長(zhǎng)度是不可變的,StringBuffer的長(zhǎng)度是可變的。如果對(duì)字符串中的長(zhǎng)度經(jīng)常進(jìn)行操作,特別是內(nèi)容要修改時(shí),使用StringBuffer,如果最后需要Stri

21、ng,那么使用StringBuffer的toString()方法。,數(shù)據(jù)庫(kù)連接池,在基于數(shù)據(jù)庫(kù)的 Web系統(tǒng)中,如果在較短的時(shí)間內(nèi),訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的請(qǐng)求量不大 但隨著請(qǐng)求數(shù)不斷增加,系統(tǒng)的開(kāi)銷(xiāo)越來(lái)越大,響應(yīng) Web請(qǐng)求的速度越來(lái)越慢,就會(huì)導(dǎo)致系統(tǒng)無(wú)法響應(yīng)Web 請(qǐng)求。,,造成這種結(jié)果的原因是由于傳統(tǒng)數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)模式存在下面的一些缺陷:每次數(shù)據(jù)庫(kù)請(qǐng)求都需要建立一次數(shù)據(jù)庫(kù)連接,而每建立一次數(shù)據(jù)庫(kù)連接就需要花費(fèi) 0.05s~1s的時(shí)間,這個(gè)時(shí)間

22、相對(duì)于數(shù)據(jù)庫(kù)本身的操作時(shí)間和軟件本身的執(zhí)行時(shí)間來(lái)說(shuō),是非常漫長(zhǎng)的。由于沒(méi)有對(duì)連接數(shù)據(jù)庫(kù)的連接數(shù)量進(jìn)行控制,因此可能出現(xiàn)超出數(shù)據(jù)庫(kù)處理能力的連接數(shù)量和處理請(qǐng)求,導(dǎo)致系統(tǒng)的崩潰。單獨(dú)管理每一個(gè)連接,并進(jìn)行使用后的資源回收。在這種方式下,如果某些連接出現(xiàn)了異常,導(dǎo)致無(wú)法正常關(guān)閉連接,那么將會(huì)導(dǎo)致資源的嚴(yán)重浪費(fèi)甚至數(shù)據(jù)庫(kù)服務(wù)器的內(nèi)存泄漏。由于以上的缺點(diǎn),開(kāi)發(fā)人員設(shè)計(jì)出一種叫做“連接池”的技術(shù),來(lái)處理傳統(tǒng)連接方式帶來(lái)的問(wèn)題。,連接池的基本原

23、理,在應(yīng)用共享資源的開(kāi)發(fā)中,有一個(gè)很著名的設(shè)計(jì)模式:資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配﹑釋放所造成的一系列問(wèn)題而設(shè)計(jì)的。在數(shù)據(jù)庫(kù)領(lǐng)域,這個(gè)設(shè)計(jì)模式的很重要的應(yīng)用就是數(shù)據(jù)庫(kù)連接池。,連接池的基本原理,數(shù)據(jù)庫(kù)連接池的基本思想就是為數(shù)據(jù)庫(kù)連接建立一個(gè)“存儲(chǔ)池”。數(shù)據(jù)庫(kù)建立初期,預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫(kù)連接時(shí),只需從“連接池”中申請(qǐng)一個(gè),使用完畢之后再將該連接作為公共資源保存在“連接

24、池”中,以供其他連接申請(qǐng)使用。,,當(dāng)需要連接時(shí),就不用再需要重新建立連接,這樣就在很大程度上提高了數(shù)據(jù)庫(kù)連接處理的速度;同時(shí),還可以通過(guò)設(shè)定連接池最大連接數(shù)來(lái)防止系統(tǒng)無(wú)控制的與數(shù)據(jù)庫(kù)連接;更為重要的是可以通過(guò)連接池管理機(jī)制監(jiān)視數(shù)據(jù)庫(kù)的連接的數(shù)量以及各連接的使用情況,為系統(tǒng)開(kāi)發(fā)﹑測(cè)試及性能調(diào)整提供依據(jù)。,,除了向連接池請(qǐng)求分配數(shù)據(jù)庫(kù)連接之外,由于不能使用同一個(gè)連接次數(shù)過(guò)多,連接池還負(fù)責(zé)按照一定的規(guī)則釋放使用次數(shù)較多的連接,并重新生成新的連

25、接實(shí)例。保持連接池中所有連接的可用性。,在Tomcat中配置連接池,在Tomcat5.5下配置數(shù)據(jù)庫(kù)連接池的步驟,以連接MS SQLServer數(shù)據(jù)庫(kù)為例: 1、首先是確保Tomcat安裝目錄的\common\lib目錄(或者是\webapps\yourweb\WEB-INF\lib目錄,具體位于哪個(gè)目錄,根據(jù)實(shí)際應(yīng)用情況而定)中已經(jīng)包含了JDBC連接數(shù)據(jù)庫(kù)所必須的三個(gè)jar文件。,,將JDBC驅(qū)動(dòng)器安裝后的lib目錄下的三個(gè)jar文

26、件拷貝到Tomcat安裝目錄的common/lib目錄下即。這樣在JSP頁(yè)面中使用數(shù)據(jù)庫(kù)連接時(shí),就可以使用JDBC驅(qū)動(dòng)中提供的接口和類(lèi)。,,2、修改Tomcat安裝目錄的conf子目錄中的server.xml文件,在元素中添加如下的內(nèi)容,用以配置連接數(shù)據(jù)庫(kù)的各項(xiàng)信息:,每個(gè)字段都有自己的含義 :,name:定義數(shù)據(jù)庫(kù)連接的名稱(chēng)。driverClassNam:指定JDBC驅(qū)動(dòng)器的類(lèi)。username:表示登陸數(shù)據(jù)庫(kù)時(shí)使用的用戶(hù)名。

27、password:為登陸數(shù)據(jù)庫(kù)的密碼。maxIdle:為數(shù)據(jù)庫(kù)連接的最大空閑時(shí)間。超過(guò)此空閑時(shí)間,數(shù)據(jù)庫(kù)連接將被標(biāo)記為不可用,然后被釋放。設(shè)為0表示無(wú)限制。maxWait:表示最大建立連接等待時(shí)間。如果超過(guò)此時(shí)間將接到異常。設(shè)為-1表示無(wú)限制。maxActive:表示連接池的最大數(shù)據(jù)庫(kù)連接數(shù)。設(shè)為0表示無(wú)限制。url:表示的是需要連接的數(shù)據(jù)庫(kù)的地址和名稱(chēng)。,,需要注意的一個(gè)問(wèn)題是,在測(cè)試使用的數(shù)據(jù)庫(kù)中,需要為此處使用的用戶(hù)名指定

28、相應(yīng)的權(quán)限。,,3、修改Tomcat安裝目錄的conf子目錄中的context.xml文件,在元素中加入以下內(nèi)容: 元素代表一個(gè)Web應(yīng)用,連接池需要讀取該元素中的信息完成數(shù)據(jù)庫(kù)的連接。有關(guān)server.xml中各類(lèi)元素的具體含義和基本配置方式,自行查閱。,可以使用如下的文件來(lái)測(cè)試對(duì)于數(shù)據(jù)庫(kù)連接池的配置是否正確:,ex73,使用連接池訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的實(shí)例,,ex74,PreparedStatement,PreparedSta

29、tement接口是Statement接口的子接口,它直接繼承并重載了Statement的方法。PreparedStatement接口的常用方法見(jiàn)圖6-5。,圖6-5 PreparedStatement接口的常用方法,創(chuàng)建PreparedStatement對(duì)象形式如下: PreparedStatement psm=con.prepareStatement("INSERT INTO users(u_name,u_pass)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論