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

下載本文檔

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

文檔簡介

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

應用程序常常需要和數(shù)據(jù)庫交互,將數(shù)據(jù)保存到數(shù)據(jù)庫,從數(shù)據(jù)庫取出數(shù)據(jù)等等。應用程序?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ù)庫的標準,數(shù)據(jù)庫廠商要實現(xiàn)這些標準來完成真正的數(shù)據(jù)庫連接和操作。這就像Java語言中的接口和實現(xiàn)類,JDBC的標準提供接口,數(shù)據(jù)庫廠商提供實現(xiàn)類。接口只是定義如何做某件事,但是不能真正做;實現(xiàn)類能真正能完成接口中定義的操作。JDBC工作原理JDBC主要功能有三個:與數(shù)據(jù)庫建立連接;向數(shù)據(jù)庫發(fā)送SQL語句;處理數(shù)據(jù)返回的結(jié)果。JDBC訪問數(shù)據(jù)庫步驟創(chuàng)建與數(shù)據(jù)庫連接

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

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

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

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

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

ResultSet的常用方法如下:booleannext():將指針移動到下一行intgetInt(intcolunmIndex):以整數(shù)形式按列的編號獲取指定列的內(nèi)容intgetInt(StringcolunmName):以整數(shù)形式按列名稱獲取指定列的內(nèi)容FloatgetFloat(intcolunmIndex):以浮點數(shù)形式按列的編號獲取指定列的內(nèi)容FloatgetFloat(StringcolunmName):以浮點數(shù)形式按列名稱獲取指定列的內(nèi)容StringgetString(intcolunmIndex):以字符串形式按列的編號獲取指定列的內(nèi)容StringgetString(StringcolunmName):以字符串形式按列名稱獲取指定列的內(nèi)容DategetDate(intcolunmIndex):以Date形式按列的編號獲取指定列的內(nèi)容DategetDate(StringcolunmName):以Date形式按列名稱獲取指定列的內(nèi)容JDBC操作最后要依次關(guān)閉資源對象。關(guān)閉ResultSet、Statement、Connection等資源,注意關(guān)閉順序與建立順序相反。此處也可以只寫一次關(guān)閉連接的方法,一般來說連接關(guān)閉,其它的操作都會關(guān)閉,但為了養(yǎng)成良好的編碼習慣,最好將所有打開的對象全部依次關(guān)閉。數(shù)據(jù)庫編程應用編寫一個JSP頁面,輸出電商平臺的所有客戶列表。設計注冊表單,接受用戶輸入信息,將信息插入到數(shù)據(jù)庫中。(用戶注冊部分功能)Reg.html:<body><formaction="reg.jsp"method="post">姓名:<inputtype="text"name="uname"><br><br>密碼:<inputtype="password"name="upass"><br><br><inputtype="submit"value="注冊"><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框中輸入了帶單引號的內(nèi)容,如:會發(fā)現(xiàn)執(zhí)行出現(xiàn)了操作數(shù)據(jù)庫失敗。原因是使用statement語句對象,需要一個完整的sql語句,但如果輸入的內(nèi)容中包含單引號,就會造成數(shù)據(jù)輸入的不正確。這種情況的解決辦法是可以使用Statement的子接口來完成語句對象的創(chuàng)建---PreparedStatement。

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

JDBC類型

java類型

DATALINK.URLDATEjava.sql.DateTIMEjava.sql.TimeBIGINTlongSMALLINTshortCHAR,VARCHAR,LONGVARCHARStringJAVA_OBJECTjavaclassNUMERICjava,math.BigDecimalINTEGERint,IntegerREALfloat,FloatDOUBLEdouble,DoubleBIT,BOOLEANboolean,BooleanARRAYArrayTINYINTbyteBINARY,VARBINARY,LONGVARBINARYbyte[]在程序中可以用循環(huán)語句生成這一系列的語句,從而方便此類SQL語句的生成??梢杂肞reparedStatement對象的publicvoidaddBatch()throwsSQLException方法將其加入到一個批次作業(yè)。最后用PreparedStatement對象的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)中,如果在較短的時間內(nèi)訪問數(shù)據(jù)庫的請求量不大,那么在前面例子中使用的數(shù)據(jù)庫連接方法是可以滿足需求的。但隨著請求數(shù)不斷增加,系統(tǒng)的開銷越來越大,響應Web請求的速度越來越慢,甚至導致系統(tǒng)無法響應Web請求。造成這種結(jié)果的原因是由于傳統(tǒng)數(shù)據(jù)庫訪問模式存在下面的一些缺陷:

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

溫馨提示

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

評論

0/150

提交評論