第08章-JSP數(shù)據(jù)庫(kù)應(yīng)用開發(fā)_第1頁(yè)
第08章-JSP數(shù)據(jù)庫(kù)應(yīng)用開發(fā)_第2頁(yè)
第08章-JSP數(shù)據(jù)庫(kù)應(yīng)用開發(fā)_第3頁(yè)
第08章-JSP數(shù)據(jù)庫(kù)應(yīng)用開發(fā)_第4頁(yè)
第08章-JSP數(shù)據(jù)庫(kù)應(yīng)用開發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章JSP數(shù)據(jù)庫(kù)應(yīng)用開發(fā)本章內(nèi)容數(shù)據(jù)庫(kù)管理系統(tǒng)JDBC概述JDBC中的常用接口連接數(shù)據(jù)庫(kù)典型JSP數(shù)據(jù)庫(kù)連接數(shù)據(jù)庫(kù)操作技術(shù)連接池技術(shù)8.1數(shù)據(jù)庫(kù)管理系統(tǒng)JSP可以訪問并操作很多種數(shù)據(jù)庫(kù)管理系統(tǒng),如SQLServer、MySQL、Oracle、Access、DB2、Sybase和PostgreSQL數(shù)據(jù)庫(kù)等。JDBC的全稱為JavaDataBaseConnectivity,是一套面向?qū)ο蟮膽?yīng)用程序接口〔API〕,制定了統(tǒng)一的訪問各類關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)接口,為各個(gè)數(shù)據(jù)庫(kù)廠商提供了標(biāo)準(zhǔn)接口的實(shí)現(xiàn)。通過JDBC技術(shù),開發(fā)人員可以用純Java語(yǔ)言和標(biāo)準(zhǔn)的SQL語(yǔ)句編寫完整的數(shù)據(jù)庫(kù)應(yīng)用程序,并且真正地實(shí)現(xiàn)了軟件的跨平臺(tái)性。8.2JDBC概述JDBC在Web和Internet應(yīng)用程序中的作用與ODBC在Windows系列平臺(tái)應(yīng)用程序中的作用類似。ODBC(OpenDataBaseConnectivity)稱為開放式數(shù)據(jù)庫(kù)互連技術(shù),由Microsoft公司倡導(dǎo)并得到業(yè)界普遍響應(yīng)的一種數(shù)據(jù)庫(kù)連接技術(shù)。JDBC是由Sun公司制定的,JDBC不是ODBC規(guī)那么派生的,JDBC完全用Java編寫,而ODBC是C語(yǔ)言接口。8.2JDBC概述8.2JDBC概述JDBC是用于執(zhí)行SQL語(yǔ)句的API類包,由一組用Java語(yǔ)言編寫的類和接口組成。JDBC提供了一種標(biāo)準(zhǔn)的應(yīng)用程序設(shè)計(jì)接口,通過它可以訪問各類關(guān)系數(shù)據(jù)庫(kù)。JDBC不能直接訪問數(shù)據(jù)庫(kù),必須依賴于數(shù)據(jù)庫(kù)廠商提供的JDBC驅(qū)動(dòng)程序。通常情況下使用JDBC完成以下操作:〔1〕同數(shù)據(jù)庫(kù)建立連接;〔2〕向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句;〔3〕處理從數(shù)據(jù)庫(kù)返回的結(jié)果。8.2JDBC概述JDBC具有以下優(yōu)點(diǎn):JDBC與ODBC十分相似,便于軟件開發(fā)人員理解;JDBC使軟件開發(fā)人員從復(fù)雜的驅(qū)動(dòng)程序編寫工作中解脫出來,可以完全專著與業(yè)務(wù)邏輯的開發(fā);JDBC支持多種關(guān)系型數(shù)據(jù)庫(kù),大大增加了軟件的可移植性;JDBCAPI是面向?qū)ο蟮?,軟件開發(fā)人員可以將常用的方法進(jìn)行二次封裝,從而提高代碼的重用性。JDBC也具有以下缺點(diǎn):通過JDBC訪問數(shù)據(jù)庫(kù)時(shí)速度將受到一定影響;雖然JDBCAPI是面向?qū)ο蟮模ㄟ^JDBC訪問數(shù)據(jù)庫(kù)依然是面向關(guān)系的;JDBC提供了對(duì)不同廠家的產(chǎn)品的支持,這將對(duì)數(shù)據(jù)源帶來影響。JDBC驅(qū)動(dòng)JDBCTypeI“Bridge”TypeII“Native”TypeIII“Middleware”TypeIV“Pure”O(jiān)DBCODBCDriverCLI(.lib)MiddlewareServer(1)JDBC-ODBCBridgeJDBC-ODBCBridge是通過本地的ODBCDriver連接到RDBMS上。這種連接方式必須將ODBC二進(jìn)制代碼〔許多情況下還包括數(shù)據(jù)庫(kù)客戶機(jī)代碼〕加載到使用該驅(qū)動(dòng)程序的每個(gè)客戶機(jī)上,因此,這種類型的驅(qū)動(dòng)程序最適合于企業(yè)網(wǎng),或者是利用Java編寫的3層結(jié)構(gòu)的應(yīng)用程序效勞器代碼。8.2JDBC概述(2)JDBC-NativeAPIBridgeJDBC-NativeAPIBridge驅(qū)動(dòng)通過調(diào)用本地的native程序?qū)崿F(xiàn)數(shù)據(jù)庫(kù)連接,這種類型的驅(qū)動(dòng)程序把客戶機(jī)API上的JDBC調(diào)用轉(zhuǎn)換為Oracle、Sybase、Informix、DB2或其他DBMS的調(diào)用。需要注意的是,和JDBC-ODBCBridge驅(qū)動(dòng)程序一樣,這種類型的驅(qū)動(dòng)程序要求將某些二進(jìn)制代碼加載到每臺(tái)客戶機(jī)上。8.2JDBC概述(3)JDBC-middlewareJDBC-middleware驅(qū)動(dòng)是一種完全利用Java編寫的JDBC驅(qū)動(dòng),這種驅(qū)動(dòng)程序?qū)DBC轉(zhuǎn)換為與DBMS無(wú)關(guān)的網(wǎng)絡(luò)協(xié)議,然后將這種協(xié)議通過網(wǎng)絡(luò)效勞器轉(zhuǎn)換為DBMS協(xié)議,這種網(wǎng)絡(luò)效勞器中間件能夠?qū)⒓僇ava客戶機(jī)連接到多種不同的數(shù)據(jù)庫(kù)上,使用的具體協(xié)議取決于提供者。通常情況下,這是最為靈活的JDBC驅(qū)動(dòng)程序。8.2JDBC概述(4)PureJDBCDriverPureJDBCDriver驅(qū)動(dòng)是一種完全利用Java編寫的JDBC驅(qū)動(dòng),這種類型的驅(qū)動(dòng)程序?qū)DBC調(diào)用直接轉(zhuǎn)換為DBMS所使用的網(wǎng)絡(luò)協(xié)議。這將允許從客戶機(jī)機(jī)器上直接調(diào)用DBMS效勞器,是Intranet訪問的一個(gè)很實(shí)用的解決方法。它由專門的數(shù)據(jù)庫(kù)廠商提供。8.2JDBC概述JDBC的4種驅(qū)動(dòng)模式總結(jié)驅(qū)動(dòng)名稱說明JDBC-ODBC橋由ODBC驅(qū)動(dòng)提供JDBC的訪問本地接口與Java程序相結(jié)合部分Javadriver把JDBC調(diào)用轉(zhuǎn)化成本地的客戶端API面向數(shù)據(jù)庫(kù)中間件純Javadriver,將JDBC調(diào)用轉(zhuǎn)入DBMS,與網(wǎng)絡(luò)協(xié)議無(wú)關(guān)。然后通過服務(wù)器將調(diào)用轉(zhuǎn)為DBMS協(xié)議直接連接純Javadrive,將JDBC調(diào)用直接轉(zhuǎn)為DBMS使用的網(wǎng)絡(luò)協(xié)議啟動(dòng)MySQL效勞mysqld-nt.exe進(jìn)程

翻開MySQL-Front工具進(jìn)行相關(guān)操作創(chuàng)立數(shù)據(jù)庫(kù)建表驅(qū)動(dòng)下載:///MySQL數(shù)據(jù)庫(kù)及MySQL-Front工具

程序?qū)嵗簐isitDB采用I型驅(qū)動(dòng)訪問Access文件采用IV型驅(qū)動(dòng)訪問MySQL數(shù)據(jù)庫(kù)8.3JDBC中的常用接口驅(qū)動(dòng)程序接口每種數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序都應(yīng)該提供一個(gè)實(shí)現(xiàn)Driver接口的類,簡(jiǎn)稱Driver類,在加載Driver類時(shí),應(yīng)該創(chuàng)立自己的實(shí)例并向類注冊(cè)該實(shí)例。通常情況下通過類的靜態(tài)方法forName(StringclassName),加載要連接數(shù)據(jù)庫(kù)的Driver類,該方法的入口參數(shù)為要加載Driver類的完整包名。成功加載后,會(huì)將Driver類的實(shí)例注冊(cè)到DriverManager類中,如果加載失敗,將拋出ClassNotFoundException異常,即未找到指定Driver類的異常。8.3JDBC中的常用接口驅(qū)動(dòng)程序管理器DriverManager類DriverManager類負(fù)責(zé)管理JDBC驅(qū)動(dòng)程序的根本效勞,是JDBC的管理層,作用于用戶和驅(qū)動(dòng)程序之間,負(fù)責(zé)跟蹤可用的驅(qū)動(dòng)程序,并在數(shù)據(jù)庫(kù)和驅(qū)動(dòng)程序之間建立連接。DriverManager類也處理諸如驅(qū)動(dòng)程序登錄時(shí)間限制及登錄和跟蹤消息的顯示等工作。DriverManager類提供的常用方法如下:getConnection(Stringurl,Stringuser,Stringpassword)靜態(tài)方法,用來獲得數(shù)據(jù)庫(kù)連接,有3個(gè)參數(shù),依次為要連接數(shù)據(jù)庫(kù)的URL、用戶名和密碼,返回值類型為setLoginTimeout(intseconds)靜態(tài)方法,用來設(shè)置每次等待建立數(shù)據(jù)庫(kù)連接的最長(zhǎng)時(shí)間out) 靜態(tài)方法,用來設(shè)置日志的輸出對(duì)象println(Stringmessage)靜態(tài)方法,用來輸出指定消息到當(dāng)前的JDBC日志流8.3JDBC中的常用接口數(shù)據(jù)庫(kù)連接接口Connection接口負(fù)責(zé)與特定數(shù)據(jù)庫(kù)的連接,在連接的上下文中可以執(zhí)行SQL語(yǔ)句并返回結(jié)果,還可以通過getMetaData()方法獲得由數(shù)據(jù)庫(kù)提供的相關(guān)信息,例如數(shù)據(jù)表、存儲(chǔ)過程和連接功能等信息。主要方法:StatementcreateStatement()PreparedStatementprepareStatement(Stringsql)CallableStatementprepareCall(Stringsql)8.3JDBC中的常用接口createStatement()創(chuàng)建并返回一個(gè)Statement實(shí)例,通常在執(zhí)行無(wú)參數(shù)的SQL語(yǔ)句時(shí)創(chuàng)建該實(shí)例prepareStatement()創(chuàng)建并返回一個(gè)PreparedStatement實(shí)例,通常在執(zhí)行包含參數(shù)的SQL語(yǔ)句時(shí)創(chuàng)建該實(shí)例,并對(duì)SQL語(yǔ)句進(jìn)行了預(yù)編譯處理prepareCall()創(chuàng)建并返回一個(gè)CallableStatement實(shí)例,通常在調(diào)用數(shù)據(jù)庫(kù)存儲(chǔ)過程時(shí)創(chuàng)建該實(shí)例setAutoCommit()設(shè)置當(dāng)前Connection實(shí)例的自動(dòng)提交模式,默認(rèn)為true,即自動(dòng)將更改同步到數(shù)據(jù)庫(kù)中,如果設(shè)為false,需要通過執(zhí)行commit()或rollback()方法手動(dòng)將更改同步到數(shù)據(jù)庫(kù)中g(shù)etAutoCommit()查看當(dāng)前的Connection實(shí)例是否處于自動(dòng)提交模式,如果是則返回true,否則返回falsesetSavepoint()在當(dāng)前事務(wù)中創(chuàng)建并返回一個(gè)Savepoint實(shí)例,前提條件是當(dāng)前的Connection實(shí)例不能處于自動(dòng)提交模式,否則將拋出異常releaseSavepoint()從當(dāng)前事務(wù)中移除指定的Savepoint實(shí)例setReadOnly()設(shè)置當(dāng)前Connection實(shí)例的讀取模式,默認(rèn)為非只讀模式,不能在事務(wù)當(dāng)中執(zhí)行該操作,否則將拋出異常,有一個(gè)boolean型的入口參數(shù),設(shè)為true則表示開啟只讀模式,設(shè)為false則表示關(guān)閉只讀模式isReadOnly()查看當(dāng)前的Connection實(shí)例是否為只讀模式,如果是則返回true,否則返回falseisClosed()查看當(dāng)前的Connection實(shí)例是否被關(guān)閉,如果被關(guān)閉則返回true,否則返回falsecommit()將從上一次提交或回滾以來進(jìn)行的所有更改同步到數(shù)據(jù)庫(kù),并釋放Connection實(shí)例當(dāng)前擁有的所有數(shù)據(jù)庫(kù)鎖定rollback()取消當(dāng)前事務(wù)中的所有更改,并釋放當(dāng)前Connection實(shí)例擁有的所有數(shù)據(jù)庫(kù)鎖定;該方法只能在非自動(dòng)提交模式下使用,如果在自動(dòng)提交模式下執(zhí)行該方法,將拋出異常;有一個(gè)入口參數(shù)為Savepoint實(shí)例的重載方法,用來取消Savepoint實(shí)例之后的所有更改,并釋放對(duì)應(yīng)的數(shù)據(jù)庫(kù)鎖定close()立即釋放Connection實(shí)例占用的數(shù)據(jù)庫(kù)和JDBC資源,即關(guān)閉數(shù)據(jù)庫(kù)連接8.3JDBC中的常用接口接口用來執(zhí)行靜態(tài)的SQL語(yǔ)句,并返回執(zhí)行結(jié)果。常用方法:intexecuteUpdate(Stringsql)執(zhí)行insert、update和delete語(yǔ)句ResultSetexecuteQuery(Stringsql)執(zhí)行select語(yǔ)句并返回一個(gè)永遠(yuǎn)不能為null的ResultSet實(shí)例。8.3JDBC中的常用接口方法名稱功能描述executeQuery(Stringsql)執(zhí)行指定的靜態(tài)SELECT語(yǔ)句,并返回一個(gè)永遠(yuǎn)不能為null的ResultSet實(shí)例executeUpdate(Stringsql)執(zhí)行指定的靜態(tài)INSERT、UPDATE或DELETE語(yǔ)句,并返回一個(gè)int型數(shù)值,為同步更新記錄的條數(shù)clearBatch()清除位于Batch中的所有SQL語(yǔ)句,如果驅(qū)動(dòng)程序不支持批量處理將拋出異常addBatch(Stringsql)將指定的SQL命令添加到Batch中,String型入口參數(shù)通常為靜態(tài)的INSERT或UPDATE語(yǔ)句,如果驅(qū)動(dòng)程序不支持批量處理將拋出異常executeBatch()執(zhí)行Batch中的所有SQL語(yǔ)句,如果全部執(zhí)行成功,則返回由更新計(jì)數(shù)組成的數(shù)組,數(shù)組元素的排序與SQL語(yǔ)句的添加順序?qū)?yīng)數(shù)組元素有以下幾種情況:①大于或等于零的數(shù),說明SQL語(yǔ)句執(zhí)行成功,為影響數(shù)據(jù)庫(kù)中行數(shù)的更新計(jì)數(shù);②

2,說明SQL語(yǔ)句執(zhí)行成功,但未得到受影響的行數(shù);③3,說明SQL語(yǔ)句執(zhí)行失敗,僅當(dāng)執(zhí)行失敗后繼續(xù)執(zhí)行后面的SQL語(yǔ)句時(shí)出現(xiàn)。如果驅(qū)動(dòng)程序不支持批量,或者未能成功執(zhí)行Batch中的SQL語(yǔ)句之一,將拋出異常close()立即釋放Statement實(shí)例占用的數(shù)據(jù)庫(kù)和JDBC資源,即關(guān)閉Statement實(shí)例8.3JDBC中的常用接口接口繼承于Statement接口,是Statement接口的擴(kuò)展,用來執(zhí)行動(dòng)態(tài)的sql語(yǔ)句,即包含參數(shù)的SQL語(yǔ)句。通過PreparedStatement實(shí)例執(zhí)行的動(dòng)態(tài)SQL語(yǔ)句,將被預(yù)編譯并保存到PreparedStatement實(shí)例中,從而可以反復(fù)并且高效地執(zhí)行該SQL語(yǔ)句。8.3JDBC中的常用接口PreparedStatementps=connection.prepareStatement("select*fromtable_namewhereid>?and(name=?orname=?)");ps.setInt(1,1);ps.setString(2,"wgh");ps.setObject(3,"sk");ResultSetrs=ps.executeQuery();8.3JDBC中的常用接口方法名稱功能描述executeQuery()執(zhí)行前面包含參數(shù)的動(dòng)態(tài)SELECT語(yǔ)句,并返回一個(gè)永遠(yuǎn)不能為null的ResultSet實(shí)例executeUpdate()執(zhí)行前面包含參數(shù)的動(dòng)態(tài)INSERT、UPDATE或DELETE語(yǔ)句,并返回一個(gè)int型數(shù)值,為同步更新記錄的條數(shù)clearParameters()清除當(dāng)前所有參數(shù)的值setXxx()為指定參數(shù)設(shè)置Xxx型值close()立即釋放Statement實(shí)例占用的數(shù)據(jù)庫(kù)和JDBC資源,即關(guān)閉Statement實(shí)例8.3JDBC中的常用接口接口繼承于PreparedStatement接口,是PreparedStatement接口的擴(kuò)展,用來執(zhí)行SQL的存儲(chǔ)過程。8.3JDBC中的常用接口接口類似于一個(gè)數(shù)據(jù)表,通過該接口的實(shí)例可以獲得檢索結(jié)果集,以及對(duì)應(yīng)數(shù)據(jù)表的相關(guān)信息,例如列名和類型等,ResultSet實(shí)例通過執(zhí)行查詢數(shù)據(jù)庫(kù)的語(yǔ)句生成。ResultSet實(shí)例具有指向其當(dāng)前數(shù)據(jù)行的指針。最初,指針指向第一行記錄的前方,通過next()方法可以將指針移動(dòng)到下一行,因?yàn)樵摲椒ㄔ跊]有下一行時(shí)將返回false,所以可以通過while循環(huán)來迭代ResultSet結(jié)果集。在默認(rèn)情況下ResultSet對(duì)象不可以更新,只有一個(gè)可以向前移動(dòng)的指針,因此,只能迭代它一次,并且只能按從第一行到最后一行的順序進(jìn)行。如果需要,可以生成可滾動(dòng)和可更新的ResultSet對(duì)象。8.3JDBC中的常用接口ResultSet接口提供了從當(dāng)前行檢索不同類型列值的getXxx()方法,均有兩個(gè)重載方法,可以通過列的索引編號(hào)或列的名稱檢索,通過列的索引編號(hào)較為高效,列的索引編號(hào)從1開始。對(duì)于不同的getXxx()方法,JDBC驅(qū)動(dòng)程序嘗試將根底數(shù)據(jù)轉(zhuǎn)換為與getXxx()方法相應(yīng)的Java類型,并返回適當(dāng)?shù)腏ava類型的值。8.3JDBC中的常用接口方法名稱功能描述first()移動(dòng)指針到第一行;如果結(jié)果集為空則返回false,否則返回true;如果結(jié)果集類型為TYPE_FORWARD_ONLY將拋出異常last()移動(dòng)指針到最后一行;如果結(jié)果集為空則返回false,否則返回true;如果結(jié)果集類型為TYPE_FORWARD_ONLY將拋出異常previous()移動(dòng)指針到上一行;如果存在上一行則返回true,否則返回false;如果結(jié)果集類型為TYPE_FORWARD_ONLY將拋出異常next()移動(dòng)指針到下一行;指針最初位于第一行之前,第一次調(diào)用該方法將移動(dòng)到第一行;如果存在下一行則返回true,否則返回falsebeforeFirst()移動(dòng)指針到ResultSet實(shí)例的開頭,即第一行之前;如果結(jié)果集類型為TYPE_FORWARD_ONLY將拋出異常afterLast()移動(dòng)指針到ResultSet實(shí)例的末尾,即最后一行之后;如果結(jié)果集類型為TYPE_FORWARD_ONLY將拋出異常absolute()移動(dòng)指針到指定行;有一個(gè)int型入口參數(shù),正數(shù)表示從前向后編號(hào),負(fù)數(shù)表示從后向前編號(hào),編號(hào)均從1開始;如果存在指定行則返回true,否則返回false;如果結(jié)果集類型為TYPE_FORWARD_ONLY將拋出異常relative()移動(dòng)指針到相對(duì)于當(dāng)前行的指定行;有一個(gè)int型入口參數(shù),正數(shù)表示向后移動(dòng),負(fù)數(shù)表示向前移動(dòng),視當(dāng)前行為0;如果存在指定行則返回true,否則返回false;如果結(jié)果集類型為TYPE_FORWARD_ONLY將拋出異常getRow()查看當(dāng)前行的索引編號(hào);索引編號(hào)從1開始,如果位于有效記錄行上則返回一個(gè)int型索引編號(hào),否則返回0findColumn()查看指定列名的索引編號(hào);該方法有一個(gè)String型入口參數(shù),為要查看列的名稱,如果包含指定列,則返回int型索引編號(hào),否則將拋出異常isBeforeFirst()查看指針是否位于ResultSet實(shí)例的開頭,即第一行之前,如果是則返回true,否則返回falseisAfterLast()查看指針是否位于ResultSet實(shí)例的末尾,即最后一行之后,如果是則返回true,否則返回falseisFirst()查看指針是否位于ResultSet實(shí)例的第一行,如果是則返回true,否則返回falseisLast()查看指針是否位于ResultSet實(shí)例的最后一行,如果是則返回true,否則返回falseclose()立即釋放ResultSet實(shí)例占用的數(shù)據(jù)庫(kù)和JDBC資源,當(dāng)關(guān)閉所屬的Statement實(shí)例時(shí)也將執(zhí)行此操作JDBC類的使用DriverManagerDriverConnectionStatementResultSetJDBC類的使用DriverManagerDriverConnectionStatementResultSet負(fù)責(zé)管理JDBC驅(qū)動(dòng)程序的根本效勞,是JDBC的管理層,作用于用戶和驅(qū)動(dòng)程序之間,負(fù)責(zé)跟蹤可用的驅(qū)動(dòng)程序,并在數(shù)據(jù)庫(kù)和驅(qū)動(dòng)程序之間建立連接。另外,處理諸如驅(qū)動(dòng)程序登錄時(shí)間限制及登錄和跟蹤消息的顯示等工作。JDBC類的使用DriverManagerDriverConnectionStatementResultSet每種數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序都提供一實(shí)現(xiàn)接口的類,在加載Driver類時(shí),應(yīng)該創(chuàng)立自己的實(shí)例并向DriverManager類注冊(cè)。通常情況下通過類的靜態(tài)方法forName(StringclassName),加載要連接數(shù)據(jù)庫(kù)的Driver類JDBC類的使用DriverManagerDriverConnectionStatementResultSet接口負(fù)責(zé)與特定數(shù)據(jù)庫(kù)的連接,在連接的上下文中可以執(zhí)行SQL語(yǔ)句并返回結(jié)果,還可以通過其他一些方法獲得由數(shù)據(jù)庫(kù)提供的相關(guān)信息,JDBC類的使用DriverManagerDriverConnectionStatementResultSetStatement接口用來執(zhí)行靜態(tài)的SQL語(yǔ)句,并返回執(zhí)行結(jié)果。例如,對(duì)于insert、update和delete語(yǔ)句,調(diào)用executeUpdate(Stringsql)方法,而select語(yǔ)句那么調(diào)用executeQuery(Stringsql)方法JDBC類的使用DriverManagerDriverConnectionStatementResultSet該接口類似于一個(gè)數(shù)據(jù)表,通過它可獲得檢索結(jié)果集,及對(duì)應(yīng)數(shù)據(jù)表的相關(guān)信息,如列名和類型等,ResultSet實(shí)例通過執(zhí)行查詢數(shù)據(jù)庫(kù)的語(yǔ)句生成。該實(shí)例具有指向其當(dāng)前數(shù)據(jù)行的指針。最初指針指向第一行記錄的前方,通過next()方法可以將指針移動(dòng)到下一行,通過while循環(huán)來迭代ResultSet結(jié)果集。8.4連接數(shù)據(jù)庫(kù)Step1:加載JDBC驅(qū)動(dòng)程序例如:try{Class.forName(

"");}catch(ClassNotFoundExceptione){……}驅(qū)動(dòng)程序類名8.4連接數(shù)據(jù)庫(kù)裝載并注冊(cè)數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序//裝載JdbcOdbcDriver");//裝載并注冊(cè)SQLServerDriver

Class.forName("");DriveManager.registerDriver(

new());//裝載并注冊(cè)O(shè)racleDriver");DriveManager.registerDriver(

new());//裝載并注冊(cè)MySQLDriver

");8.4連接數(shù)據(jù)庫(kù)Step2:創(chuàng)立到數(shù)據(jù)庫(kù)的連接DriverManager.getConnection(Stringurl,Stringuser,Stringpwd);例如:Connectionconn=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=db_database08","sa","");建立與數(shù)據(jù)庫(kù)的連接Connectioncon=DriverManager.getConnection(dburl,user,pwd);JDBCURL的一般形式:jdbc:driverType:driverSubType://parameterODBC的URL:jdbc:odbc:DataSourceNameMySQL的URL:jdbc:mysql://localhost:3306/DBNameOracle的URL:

jdbc:oracle:thin:@localhost:1521:sidSQLServer的URL:jdbc:microsoft:sqlserver://

localhost:1433;DatabaseName=DBName8.4連接數(shù)據(jù)庫(kù)8.4連接數(shù)據(jù)庫(kù)Step3:執(zhí)行SQL語(yǔ)句〔1〕Statement實(shí)例:只能用來執(zhí)行靜態(tài)的SQL語(yǔ)句;〔2〕PreparedStatement實(shí)例:增加了執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的功能;〔3〕CallableStatement對(duì)象:增加了執(zhí)行數(shù)據(jù)庫(kù)存儲(chǔ)過程的功能。8.4連接數(shù)據(jù)庫(kù)Step4:獲得查詢結(jié)果通過Statement接口的executeUpdate()或executeQuery()方法,可以執(zhí)行SQL語(yǔ)句,同時(shí)將返回執(zhí)行結(jié)果。如果執(zhí)行的是executeUpdate()方法,將返回一個(gè)int型數(shù)值,代表影響數(shù)據(jù)庫(kù)記錄的條數(shù),即插入、修改或刪除記錄的條數(shù);如果執(zhí)行的是executeQuery()方法,將返回一個(gè)ResultSet型的結(jié)果集,其中不僅包含所有滿足查詢條件的記錄,還包含相應(yīng)數(shù)據(jù)表的相關(guān)信息,例如,列的名稱、類型和列的數(shù)量等。8.4連接數(shù)據(jù)庫(kù)Step5:關(guān)閉連接在建立Connection,Statement和ResultSet實(shí)例時(shí),均需占用一定的數(shù)據(jù)庫(kù)和JDBC資源,所以每次訪問數(shù)據(jù)庫(kù)結(jié)束后,應(yīng)該及時(shí)銷毀這些實(shí)例,釋放它們占用的所有資源,方法是通過各個(gè)實(shí)例的close()方法,并且在關(guān)閉時(shí)建議按照以下的順序:resultSet.close();statement.close();connection.close();8.5數(shù)據(jù)庫(kù)訪問實(shí)例readableManiDB8.6數(shù)據(jù)庫(kù)操作技術(shù)

在開發(fā)Web應(yīng)用程序時(shí),經(jīng)常需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,最常用的數(shù)據(jù)庫(kù)操作技術(shù),包括向數(shù)據(jù)庫(kù)查詢、添加、修改或刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù),這些操作即可以通過靜態(tài)的SQL語(yǔ)句實(shí)現(xiàn),也可以通過動(dòng)態(tài)的SQL語(yǔ)句實(shí)現(xiàn),還可以通過存儲(chǔ)過程實(shí)現(xiàn),具體采用的實(shí)現(xiàn)方式要根據(jù)實(shí)際情況而定。8.6.1查詢操作JDBC中提供了兩種實(shí)現(xiàn)數(shù)據(jù)查詢的方法,一種是通過Statement對(duì)象執(zhí)行靜態(tài)的SQL語(yǔ)句實(shí)現(xiàn);另一種是通過PreparedStatement對(duì)象執(zhí)行動(dòng)態(tài)的SQL語(yǔ)句實(shí)現(xiàn)。由于PreparedStatement類是Statement類的擴(kuò)展,一個(gè)PreparedStatement對(duì)象包含一個(gè)預(yù)編譯的SQL語(yǔ)句,該SQL語(yǔ)句可能包含一個(gè)或多個(gè)參數(shù),這樣應(yīng)用程序可以動(dòng)態(tài)地為其賦值,所以PreparedStatement對(duì)象執(zhí)行的速度比Statement對(duì)象快。因此在執(zhí)行較多的SQL語(yǔ)句時(shí),建議使用PreparedStatement對(duì)象。8.6.2添加操作同查詢操作相同,JDBC中也提供了兩種實(shí)現(xiàn)數(shù)據(jù)添加操作的方法,一種是通過Statement對(duì)象執(zhí)行靜態(tài)的SQL語(yǔ)句實(shí)現(xiàn);另一種是通過PreparedStatement對(duì)象執(zhí)行動(dòng)態(tài)的SQL語(yǔ)句實(shí)現(xiàn)。通過Statement對(duì)象和PreparedStatement對(duì)象實(shí)現(xiàn)數(shù)據(jù)添加操作的方法同實(shí)現(xiàn)查詢操作的方法根本相同,所不同的就是執(zhí)行的SQL語(yǔ)句及執(zhí)行方法不同,實(shí)現(xiàn)數(shù)據(jù)添加操作時(shí)采用的是executeUpdate()方法,而實(shí)現(xiàn)數(shù)據(jù)查詢時(shí)使用的是executeQuery()方法。實(shí)現(xiàn)數(shù)據(jù)添加操作使用的SQL語(yǔ)句為INSERT語(yǔ)句,其語(yǔ)法格式如下:8.6.2添加操作Insert[INTO]table_name[(column_list)]values(data_values)上面語(yǔ)法中各參數(shù)說明如下表所示。參數(shù)描述[INTO]可選項(xiàng),無(wú)特殊含義,可以將它用在INSERT和目標(biāo)表之前table_name要添加記錄的數(shù)據(jù)表名稱column_list是表中的字段列表,表示向表中哪些字段插入數(shù)據(jù);如果是多個(gè)字段,字段之間用逗號(hào)分隔;不指定column_list,默認(rèn)向數(shù)據(jù)表中所有字段插入數(shù)據(jù)data_values要添加的數(shù)據(jù)列表,各個(gè)數(shù)據(jù)之間使用逗號(hào)分隔;數(shù)據(jù)列表中的個(gè)數(shù)、數(shù)據(jù)類型必須和字段列表中的字段個(gè)數(shù)、數(shù)據(jù)類型相一致values引入要插入的數(shù)據(jù)值的列表;對(duì)于column_list(如果已指定)中或者表中的每個(gè)列,都必須有一個(gè)數(shù)據(jù)值;必須用圓括號(hào)將值列表括起來;如果VALUES列表中的值與表中的值和表中列的順序不相同,或者未包含表中所有列的值,那么必須使用column_list明確地指定存儲(chǔ)每個(gè)傳入值的列8.6.2添加操作Statementstmt=conn.createStatement();intrtn=stmt.executeUpdate("insertintotb_user(name,pwd)values('hope','111')");

應(yīng)用Statement對(duì)象向數(shù)據(jù)表tb_user中添加數(shù)據(jù)的關(guān)鍵代碼如下:利用PreparedStatement對(duì)象向數(shù)據(jù)表tb_user中添加數(shù)據(jù)的關(guān)鍵代碼如下:PreparedStatementpStmt=conn.prepareStatement("insertintotb_user(name,pwd)values(?,?)");pStmt.setString(1,"dream");pStmt.setString(2,"111");intrtn=pStmt.executeUpdate();8.6.3修改操作同添加操作相同,JDBC中也提供了兩種實(shí)現(xiàn)數(shù)據(jù)修改操作的方法,一種是通過Statement對(duì)象執(zhí)行靜態(tài)的SQL語(yǔ)句實(shí)現(xiàn);另一種是通過PreparedStatement對(duì)象執(zhí)行動(dòng)態(tài)的SQL語(yǔ)句實(shí)現(xiàn)。通過Statement對(duì)象和PreparedStatement對(duì)象實(shí)現(xiàn)數(shù)據(jù)修改操作的方法同實(shí)現(xiàn)添加操作的方法根本相同,所不同的就是執(zhí)行的SQL語(yǔ)句不同,實(shí)現(xiàn)數(shù)據(jù)修改操作使用的SQL語(yǔ)句為UPDATE語(yǔ)句,其語(yǔ)法格式如下:UPDATEtable_nameSET<column_name>=<expression>[….,<lastcolumn_name>=<lastexpression>][WHERE<search_condition>]8.6.3修改操作參數(shù)描述table_name需要更新的數(shù)據(jù)表名SET指定要更新的列或變量名稱的列表column_name含有要更改數(shù)據(jù)的列的名稱;column_name必須駐留于UPDATE子句中所指定的表或視圖中;標(biāo)識(shí)列不能進(jìn)行更新;如果指定了限定的列名稱,限定符必須同UPDATE子句中的表或視圖的名稱相匹配expression變量、字面值、表達(dá)式或加上括號(hào)返回單個(gè)值的subSELECT語(yǔ)句;expression返回的值將替換column_name中的現(xiàn)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論