《電子商務(wù)平臺(tái)開發(fā)技術(shù)》課件第五章_第1頁
《電子商務(wù)平臺(tái)開發(fā)技術(shù)》課件第五章_第2頁
《電子商務(wù)平臺(tái)開發(fā)技術(shù)》課件第五章_第3頁
《電子商務(wù)平臺(tái)開發(fā)技術(shù)》課件第五章_第4頁
《電子商務(wù)平臺(tái)開發(fā)技術(shù)》課件第五章_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第五章JDBC數(shù)據(jù)庫連接

應(yīng)用程序常常需要和數(shù)據(jù)庫交互,將數(shù)據(jù)保存到數(shù)據(jù)庫,從數(shù)據(jù)庫取出數(shù)據(jù)等等。應(yīng)用程序?qū)?shù)據(jù)庫的操作主要是4種:插入記錄、刪除記錄、更新記錄、查詢符合條件的記錄,這4種操作常稱為CRUD?,F(xiàn)在的數(shù)據(jù)庫主要是關(guān)系數(shù)據(jù)庫。常見的關(guān)系數(shù)據(jù)庫有Oracle、DB2、MicrosoftSQLServer2000、MySql等。JDBC概念JDBC是JavaDataBaseConnectivity(Java數(shù)據(jù)連接)技術(shù)的簡稱,是一種可用于執(zhí)行SQL語句的JavaAPI。它由一些Java語言編寫的類和接口組成;程序員通過使用JDBC可以方便的將SQL語句傳送給幾乎任何一種數(shù)據(jù)庫。JDBC規(guī)范定義了如何操作數(shù)據(jù)庫的標(biāo)準(zhǔn),數(shù)據(jù)庫廠商要實(shí)現(xiàn)這些標(biāo)準(zhǔn)來完成真正的數(shù)據(jù)庫連接和操作。這就像Java語言中的接口和實(shí)現(xiàn)類,JDBC的標(biāo)準(zhǔn)提供接口,數(shù)據(jù)庫廠商提供實(shí)現(xiàn)類。接口只是定義如何做某件事,但是不能真正做;實(shí)現(xiàn)類能真正能完成接口中定義的操作。JDBC工作原理JDBC主要功能有三個(gè):與數(shù)據(jù)庫建立連接;向數(shù)據(jù)庫發(fā)送SQL語句;處理數(shù)據(jù)返回的結(jié)果。JDBC訪問數(shù)據(jù)庫步驟創(chuàng)建與數(shù)據(jù)庫連接

從編程角度出發(fā),有兩個(gè)類負(fù)責(zé)與數(shù)據(jù)庫建立連接,第一個(gè)是DriverManager,它是JDBCAPI提供的為數(shù)不多的實(shí)際類之一,DriverManager負(fù)責(zé)管理已注冊(cè)驅(qū)動(dòng)程序的集合,實(shí)質(zhì)上就是提取使用驅(qū)動(dòng)程序的細(xì)節(jié),這樣程序員就不必直接處理它們。第二個(gè)類是實(shí)際處理的JDBCDriver類,它是由獨(dú)立廠商提供的,負(fù)責(zé)建立數(shù)據(jù)庫連接和處理所有與數(shù)據(jù)庫的通信。創(chuàng)建數(shù)據(jù)庫連接,分為以下幾步:1、加載驅(qū)動(dòng)程序。加載MySql數(shù)據(jù)庫驅(qū)動(dòng):Class.forName(“com.mysql.jdbc.Driver”);加載sqlserver數(shù)據(jù)庫驅(qū)動(dòng)程序:Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);加載oracle數(shù)據(jù)庫驅(qū)動(dòng)程序:Class.forName(“oracle.jdbc.driver.OracleDriver”);2、創(chuàng)建連接對(duì)象:如果驅(qū)動(dòng)程序可以正常加載,接下來使用DriverManager類的getConnection(Stringurl,Stringuser,Stringpassword)方法連接數(shù)據(jù)庫。該方法得到一個(gè)數(shù)據(jù)庫的連接,返回一個(gè)Connection對(duì)象。該方法需要三個(gè)參數(shù):連接地址、用戶名、密碼。Connectioncon=DriverManger.getConnection(url,user,password);編寫一個(gè)程序,測試數(shù)據(jù)庫連接

通過JDBC執(zhí)行SQL語句數(shù)據(jù)庫成功連接后,如果進(jìn)行數(shù)據(jù)庫操作,需要使用Statement接口完成,此接口可以使用Connection接口中提供的createStatement()方法進(jìn)行實(shí)例化。java.sql.Statement對(duì)象代表一條發(fā)送到數(shù)據(jù)庫執(zhí)行的SQL語句。有三種Statement對(duì)象:Statement對(duì)象用于執(zhí)行不帶參數(shù)的簡單SQL語句;PreparedStatement對(duì)象用于執(zhí)行帶或不帶參數(shù)的預(yù)編譯SQL語句;CallableStatement對(duì)象用于執(zhí)行對(duì)數(shù)據(jù)庫存儲(chǔ)過程的調(diào)用。

Statement接口提供的執(zhí)行SQL語句的常用方法有以下幾個(gè),均會(huì)拋出SQLException異常:(1)executeQuery()(2)execute()(3)executeUpdate()(4)voidaddBatch(Stringsql):增加一個(gè)待執(zhí)行的SQL語句。(5)int[]executeBatch():批量執(zhí)行SQL語句。(6)voidclose():關(guān)閉Statement。

ResultSet對(duì)象1、ResultSet對(duì)象的使用ResultSet對(duì)象包含SQL語句的執(zhí)行結(jié)果,是executeQuery()方法的返回值,被稱為結(jié)果集,它代表符合SQL語句條件的所有行。它通過一套get方法提供了對(duì)這些行中數(shù)據(jù)的訪問,即使用getXXX方法檢索數(shù)據(jù),例如getInt()用于檢索整型值,getString()用于檢索字符串值等等get方法很多,究竟用哪一個(gè)getXXX()方法,由列的數(shù)據(jù)類型來決定。

Strings=rs.getString(“title”);Strings=rs.getString(2);2、游標(biāo)ResultSet對(duì)象自動(dòng)維護(hù)指向其當(dāng)前數(shù)據(jù)行的游標(biāo)。結(jié)果集游標(biāo)即可以從第一行移動(dòng)到最后一行,也可以從最后一行移動(dòng)到第一行。每調(diào)用一次next()方法,游標(biāo)向下移動(dòng)一行。最初它位于第一行之前,因此第一次調(diào)用next(),將把游標(biāo)置于第一行上,使它成為當(dāng)前行。隨著每次調(diào)用next(),導(dǎo)致游標(biāo)向下移動(dòng)一行,按照從上至下的次序獲取ResultSet行。在ResultSet對(duì)象或其對(duì)應(yīng)的Statement對(duì)象關(guān)閉之前,游標(biāo)一直保持有效。

ResultSet的常用方法如下:booleannext():將指針移動(dòng)到下一行intgetInt(intcolunmIndex):以整數(shù)形式按列的編號(hào)獲取指定列的內(nèi)容intgetInt(StringcolunmName):以整數(shù)形式按列名稱獲取指定列的內(nèi)容FloatgetFloat(intcolunmIndex):以浮點(diǎn)數(shù)形式按列的編號(hào)獲取指定列的內(nèi)容FloatgetFloat(StringcolunmName):以浮點(diǎn)數(shù)形式按列名稱獲取指定列的內(nèi)容StringgetString(intcolunmIndex):以字符串形式按列的編號(hào)獲取指定列的內(nèi)容StringgetString(StringcolunmName):以字符串形式按列名稱獲取指定列的內(nèi)容DategetDate(intcolunmIndex):以Date形式按列的編號(hào)獲取指定列的內(nèi)容DategetDate(StringcolunmName):以Date形式按列名稱獲取指定列的內(nèi)容JDBC操作最后要依次關(guān)閉資源對(duì)象。關(guān)閉ResultSet、Statement、Connection等資源,注意關(guān)閉順序與建立順序相反。此處也可以只寫一次關(guān)閉連接的方法,一般來說連接關(guān)閉,其它的操作都會(huì)關(guān)閉,但為了養(yǎng)成良好的編碼習(xí)慣,最好將所有打開的對(duì)象全部依次關(guān)閉。數(shù)據(jù)庫編程應(yīng)用編寫一個(gè)JSP頁面,輸出電商平臺(tái)的所有客戶列表。設(shè)計(jì)注冊(cè)表單,接受用戶輸入信息,將信息插入到數(shù)據(jù)庫中。(用戶注冊(cè)部分功能)Reg.html:<body><formaction="reg.jsp"method="post">姓名:<inputtype="text"name="uname"><br><br>密碼:<inputtype="password"name="upass"><br><br><inputtype="submit"value="注冊(cè)"><inputtype="reset"value="取消"></form>Reg.jsp<body> <% request.setCharacterEncoding("gbk"); Stringname=request.getParameter("uname"); Stringpass=request.getParameter("upass");try{Class.forName("org.gjt.mm.mysql.Driver");Connectioncon=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");Statementsta=con.createStatement();sta.executeUpdate("insertintouser_table(name,pass)values('"+name+"','"+pass+"')"); sta.close(); con.close(); }catch(Exceptione) { e.printStackTrace(); } %></body>在上面例子中,如果在姓名的text框中輸入了帶單引號(hào)的內(nèi)容,如:會(huì)發(fā)現(xiàn)執(zhí)行出現(xiàn)了操作數(shù)據(jù)庫失敗。原因是使用statement語句對(duì)象,需要一個(gè)完整的sql語句,但如果輸入的內(nèi)容中包含單引號(hào),就會(huì)造成數(shù)據(jù)輸入的不正確。這種情況的解決辦法是可以使用Statement的子接口來完成語句對(duì)象的創(chuàng)建---PreparedStatement。

在JDBC應(yīng)用中,通常會(huì)以PreparedStatement代替Statement。也就是說,在熟練掌握J(rèn)DBC編程后,任何時(shí)候都不要使用Statement,這是因?yàn)椋?1)用PreparedStatement來代替Statement會(huì)使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護(hù)性上來說.都比直接用Statement的代碼高很多檔次。(2)PreparedStatement是預(yù)編譯過的,會(huì)提高性能。每種數(shù)據(jù)庫都會(huì)盡最大努力對(duì)預(yù)編譯語句提供最大的性能優(yōu)化。因?yàn)轭A(yù)編譯語句有可能被重復(fù)調(diào)用,所以語句在被DB的編譯器編譯后的執(zhí)行代碼被緩存下來,那么下次調(diào)用時(shí)只要是相同的預(yù)編譯語句就不需要編譯,只要將參數(shù)直接傳入編譯過的語句執(zhí)行代碼中。(3)極大地提高了安全性。使用預(yù)編譯語句,傳入的任何內(nèi)容就不會(huì)和原來的語句發(fā)生任何匹配的關(guān)系,只要全使用預(yù)編譯語句,就不用對(duì)傳入的數(shù)據(jù)做任何過濾。PreparedStatment常用方法如下:intexecuteUpdate():執(zhí)行設(shè)置的預(yù)處理SQL語句ResultSetexecuteQuery():執(zhí)行數(shù)據(jù)庫查詢操作,返回ResultSetvoidsetInt(intparameterIndex,intx):指定要設(shè)置的索引編號(hào),設(shè)置整數(shù)內(nèi)容voidsetFloat(intparameterIndex,F(xiàn)loatx):指定要設(shè)置的索引編號(hào),設(shè)置浮點(diǎn)數(shù)內(nèi)容voidsetString(intparameterIndex,Stringx):指定要設(shè)置的索引編號(hào),設(shè)置字符串內(nèi)容voidsetDate(intparameterIndex,Datex):指定要設(shè)置的索引編號(hào),設(shè)置java.sql.Date型內(nèi)容在使用PreparedStatement時(shí),SQL語句與Statement完全相同,但是具體內(nèi)容采用“?”作為占位符形式出現(xiàn),后面設(shè)置時(shí)按照“?”占位符的順序設(shè)置具體的內(nèi)容?!?”按照從左到右出現(xiàn)的位置其值從1開始,以后依次加1,究竟用哪一個(gè)setXXX()方法,由”?”所表示的參數(shù)類型來決定,因?yàn)閄的類型是java.sql.Types中的類型,而參數(shù)的類型是某種數(shù)據(jù)庫中的數(shù)據(jù)類型,因此應(yīng)該保證它們的類型能夠相對(duì)應(yīng)。

JDBC類型

java類型

DATALINK.URLDATEjava.sql.DateTIMEjava.sql.TimeBIGINTlongSMALLINTshortCHAR,VARCHAR,LONGVARCHARStringJAVA_OBJECTjavaclassNUMERICjava,math.BigDecimalINTEGERint,IntegerREALfloat,FloatDOUBLEdouble,DoubleBIT,BOOLEANboolean,BooleanARRAYArrayTINYINTbyteBINARY,VARBINARY,LONGVARBINARYbyte[]在程序中可以用循環(huán)語句生成這一系列的語句,從而方便此類SQL語句的生成??梢杂肞reparedStatement對(duì)象的publicvoidaddBatch()throwsSQLException方法將其加入到一個(gè)批次作業(yè)。最后用PreparedStatement對(duì)象的publicint[]executeBatch()throwsSQLException方法一次執(zhí)行所有加入的批次作業(yè)。PrepareStatementp=con.prepareStatement(“insertintocityvalues(?)”);for(inti=0;i<aa.length;i++){ p.setString(1,aa[i]);p.addBatch();}p.excuetBatch();該段代碼可以將數(shù)組aa中的所有城市名稱批次加入表city中。

數(shù)據(jù)庫連接池在基于數(shù)據(jù)庫的Web系統(tǒng)中,如果在較短的時(shí)間內(nèi)訪問數(shù)據(jù)庫的請(qǐng)求量不大,那么在前面例子中使用的數(shù)據(jù)庫連接方法是可以滿足需求的。但隨著請(qǐng)求數(shù)不斷增加,系統(tǒng)的開銷越來越大,響應(yīng)Web請(qǐng)求的速度越來越慢,甚至導(dǎo)致系統(tǒng)無法響應(yīng)Web請(qǐng)求。造成這種結(jié)果的原因是由于傳統(tǒng)數(shù)據(jù)庫訪問模式存在下面的一些缺陷:

(1)每次數(shù)據(jù)庫請(qǐng)求都需要建立一次數(shù)據(jù)庫連接,而每建立一次數(shù)據(jù)庫連接就需要花費(fèi)0.05s~1s的時(shí)間,這個(gè)時(shí)間相對(duì)于數(shù)據(jù)庫本身的操作時(shí)間和軟件本身的執(zhí)行時(shí)間來說,是非常漫長的。(2)由于沒有對(duì)連接數(shù)據(jù)庫的連接數(shù)量進(jìn)行控制,因此可能出現(xiàn)超出數(shù)據(jù)庫處理能力

溫馨提示

  • 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)論