第11章JDBC數(shù)據(jù)庫編程課件_第1頁
第11章JDBC數(shù)據(jù)庫編程課件_第2頁
第11章JDBC數(shù)據(jù)庫編程課件_第3頁
第11章JDBC數(shù)據(jù)庫編程課件_第4頁
第11章JDBC數(shù)據(jù)庫編程課件_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Java實(shí)用教程第11章JDBC數(shù)據(jù)庫編程《JSP程序設(shè)計(jì)教程》課件制作人:XXX第11章JDBC數(shù)據(jù)庫編程11.1JDBC概述11.2JDBC中的常用接口11.3連接數(shù)據(jù)庫11.4操作數(shù)據(jù)庫10.5網(wǎng)絡(luò)聊天11.5應(yīng)用JDBC事務(wù)課件制作人:XXX11.2JDBC中的常用接口JDBC提供了眾多的接口和類,通過這些接口和類,可以實(shí)現(xiàn)與數(shù)據(jù)庫的通信,本節(jié)將詳細(xì)介紹一些常用的JDBC接口和類。課件制作人:XXX11.2.1Driver接口每種數(shù)據(jù)庫的驅(qū)動(dòng)程序都應(yīng)該提供一個(gè)實(shí)現(xiàn)java.sql.Driver接口的類,簡稱Driver類,在加載某一驅(qū)動(dòng)程序的Driver類時(shí),它應(yīng)該創(chuàng)建自己的實(shí)例并向java.sql.DriverManager類注冊該實(shí)例。通常情況下通過java.lang.Class類的靜態(tài)方法forName(StringclassName),加載欲連接數(shù)據(jù)庫的Driver類,該方法的入口參數(shù)為欲加載Driver類的完整路徑。成功加載后,會(huì)將Driver類的實(shí)例注冊到DriverManager類中,如果加載失敗,將拋出ClassNotFoundException異常,即未找到指定Driver類的異常。課件制作人:XXX11.2.2DriverManager類java.sql.DriverManager類負(fù)責(zé)管理JDBC驅(qū)動(dòng)程序的基本服務(wù),是JDBC的管理層,作用于用戶和驅(qū)動(dòng)程序之間,負(fù)責(zé)跟蹤可用的驅(qū)動(dòng)程序,并在數(shù)據(jù)庫和驅(qū)動(dòng)程序之間建立連接;另外,DriverManager類也處理諸如驅(qū)動(dòng)程序登錄時(shí)間限制及登錄和跟蹤消息的顯示等工作。成功加載Driver類并在DriverManager類中注冊后,DriverManager類即可用來建立數(shù)據(jù)庫連接。當(dāng)調(diào)用DriverManager類的getConnection()方法請求建立數(shù)據(jù)庫連接時(shí),DriverManager類將試圖定位一個(gè)適當(dāng)?shù)腄river類,并檢查定位到的Driver類是否可以建立連接,如果可以則建立連接并返回,如果不可以則拋出SQLException異常。課件制作人:XXXDriverManager類DriverManager類提供的常用靜態(tài)方法如下表所示:方法名稱功能描述getConnection(Stringurl,Stringuser,Stringpassword)用來獲得數(shù)據(jù)庫連接,3個(gè)入口參數(shù)依次為要連接數(shù)據(jù)庫的URL、用戶名和密碼,返回值的類型為java.sql.ConnectionsetLoginTimeout(intseconds)用來設(shè)置每次等待建立數(shù)據(jù)庫連接的最長時(shí)間setLogWriter(java.io.PrintWriterout)用來設(shè)置日志的輸出對(duì)象println(Stringmessage)用來輸出指定消息到當(dāng)前的JDBC日志流課件制作人:XXX11.2.3Connection接口java.sql.Connection接口代表與特定數(shù)據(jù)庫的連接,在連接的上下文中可以執(zhí)行SQL語句并返回結(jié)果,還可以通過getMetaData()方法獲得由數(shù)據(jù)庫提供的相關(guān)信息,例如數(shù)據(jù)表、存儲(chǔ)過程和連接功能等信息。Connection接口提供的常用方法如下表所示。課件制作人:XXX方法名稱功能描述createStatement()創(chuàng)建并返回一個(gè)Statement實(shí)例,通常在執(zhí)行無參的SQL語句時(shí)創(chuàng)建該實(shí)例prepareStatement()創(chuàng)建并返回一個(gè)PreparedStatement實(shí)例,通常在執(zhí)行包含參數(shù)的SQL語句時(shí)創(chuàng)建該實(shí)例,并對(duì)SQL語句進(jìn)行了預(yù)編譯處理prepareCall()創(chuàng)建并返回一個(gè)CallableStatement實(shí)例,通常在調(diào)用數(shù)據(jù)庫存儲(chǔ)過程時(shí)創(chuàng)建該實(shí)例setAutoCommit()設(shè)置當(dāng)前Connection實(shí)例的自動(dòng)提交模式。默認(rèn)為true,即自動(dòng)將更改同步到數(shù)據(jù)庫中;如果設(shè)為false,需要通過執(zhí)行commit()或rollback()方法手動(dòng)將更改同步到數(shù)據(jù)庫中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ù)庫,并釋放Connection實(shí)例當(dāng)前擁有的所有數(shù)據(jù)庫鎖定rollback()取消當(dāng)前事務(wù)中的所有更改,并釋放當(dāng)前Connection實(shí)例擁有的所有數(shù)據(jù)庫鎖定。該方法只能在非自動(dòng)提交模式下使用,如果在自動(dòng)提交模式下執(zhí)行該方法,將拋出異常。有一個(gè)參數(shù)為Savepoint實(shí)例的重載方法,用來取消Savepoint實(shí)例之后的所有更改,并釋放對(duì)應(yīng)的數(shù)據(jù)庫鎖定close()立即釋放Connection實(shí)例占用的數(shù)據(jù)庫和JDBC資源,即關(guān)閉數(shù)據(jù)庫連接11.2.4Statement接口java.sql.Statement接口用來執(zhí)行靜態(tài)的SQL語句,并返回執(zhí)行結(jié)果。例如,對(duì)于INSERT、UPDATE和DELETE語句,調(diào)用executeUpdate(Stringsql)方法;對(duì)于SELECT語句,則調(diào)用executeQuery(Stringsql)方法,并返回一個(gè)永遠(yuǎn)不能為null的ResultSet實(shí)例。Statement接口提供的常用方法如下表所示。課件制作人:XXX方法名稱功能描述executeQuery(Stringsql)執(zhí)行指定的靜態(tài)SELECT語句,并返回一個(gè)永遠(yuǎn)不能為null的ResultSet實(shí)例executeUpdate(Stringsql)執(zhí)行指定的靜態(tài)INSERT、UPDATE或DELETE語句,并返回一個(gè)int型數(shù)值,此數(shù)為同步更新記錄的條數(shù)clearBatch()清除位于Batch中的所有SQL語句。如果驅(qū)動(dòng)程序不支持批量處理將拋出異常addBatch(Stringsql)將指定的SQL命令添加到Batch中。String型入口參數(shù)通常為靜態(tài)的INSERT或UPDATE語句。如果驅(qū)動(dòng)程序不支持批量處理將拋出異常executeBatch()執(zhí)行Batch中的所有SQL語句,如果全部執(zhí)行成功,則返回由更新計(jì)數(shù)組成的數(shù)組,數(shù)組元素的排序與SQL語句的添加順序?qū)?yīng)。數(shù)組元素有以下幾種情況:①:大于或等于零的數(shù):說明SQL語句執(zhí)行成功,此數(shù)為影響數(shù)據(jù)庫中行數(shù)的更新計(jì)數(shù);②:說明SQL語句執(zhí)行成功,但未得到受影響的行數(shù)③:說明SQL語句執(zhí)行失敗,僅當(dāng)執(zhí)行失敗后繼續(xù)執(zhí)行后面的SQL語句時(shí)出現(xiàn)。如果驅(qū)動(dòng)程序不支持批量、或者未能成功執(zhí)行Batch中的SQL語句之一,將拋出異常close()立即釋放Statement實(shí)例占用的數(shù)據(jù)庫和JDBC資源11.2.5PreparedStatement接口java.sql.PreparedStatement接口繼承并擴(kuò)展了Statement接口,用來執(zhí)行動(dòng)態(tài)的SQL語句,即包含參數(shù)的SQL語句。通過PreparedStatement實(shí)例執(zhí)行的動(dòng)態(tài)SQL語句將被預(yù)編譯并保存到PreparedStatement實(shí)例中,從而可以反復(fù)并且高效地執(zhí)行該SQL語句。需要注意的是,在通過setXxx()方法為SQL語句中的參數(shù)賦值時(shí),建議利用與參數(shù)類型匹配的方法,也可以利用setObject()方法為各種類型的參數(shù)賦值。PreparedStatement接口的使用方法如下:PreparedStatement接口提供的常用方法如下表所示。PreparedStatementps=connection.prepareStatement("select*fromtable_namewhereid>?and(name=?orname=?)");ps.setInt(1,6);ps.setString(2,"馬先生");ps.setObject(3,"李先生");ResultSetrs=ps.executeQuery();課件制作人:XXX方法名稱功能描述executeQuery()執(zhí)行前面定義的動(dòng)態(tài)SELECT語句,并返回一個(gè)永遠(yuǎn)不能為null的ResultSet實(shí)例executeUpdate()執(zhí)行前面定義的動(dòng)態(tài)INSERT、UPDATE或DELETE語句,并返回一個(gè)int型數(shù)值,為同步更新記錄的條數(shù)SetInt(inti,intx)為指定參數(shù)設(shè)置int型值,對(duì)應(yīng)參數(shù)的SQL類型為INTEGERsetLong(inti,longx)為指定參數(shù)設(shè)置long型值,對(duì)應(yīng)參數(shù)的SQL類型為BIGINTsetFloat(inti,floatx)為指定參數(shù)設(shè)置float型值,對(duì)應(yīng)參數(shù)的SQL類型為FLOATsetDouble(inti,doublex)為指定參數(shù)設(shè)置double型值,對(duì)應(yīng)參數(shù)的SQL類型為DOUBLEsetString(inti,Stringx)為指定參數(shù)設(shè)置String型值,對(duì)應(yīng)參數(shù)的SQL類型為VARCHAR或LONGVARCHARsetBoolean(inti,booleanx)為指定參數(shù)設(shè)置boolean型值,對(duì)應(yīng)參數(shù)的SQL類型為BITsetDate(inti,Datex)為指定參數(shù)設(shè)置java.sql.Date型值,對(duì)應(yīng)參數(shù)的SQL類型為DATEsetObject(inti,Objectx)用來設(shè)置各種類型的參數(shù),JDBC規(guī)范定義了從Object類型到SQL類型的標(biāo)準(zhǔn)映射關(guān)系,在向數(shù)據(jù)庫發(fā)送時(shí)將被轉(zhuǎn)換為相應(yīng)的SQL類型setNull(inti,intsqlType)將指定參數(shù)設(shè)置為SQL中的NULL。該方法的第二個(gè)參數(shù)用來設(shè)置參數(shù)的SQL類型,具體值從java.sql.Types類中定義的靜態(tài)常量中選擇clearParameters()清除當(dāng)前所有參數(shù)的值11.2.6CallableStatement

接口java.sql.CallableStatement接口繼承并擴(kuò)展了PreparedStatement接口,用來執(zhí)行SQL的存儲(chǔ)過程。JDBCAPI定義了一套存儲(chǔ)過程SQL轉(zhuǎn)義語法,該語法允許對(duì)所有RDBMS通過標(biāo)準(zhǔn)方式調(diào)用存儲(chǔ)過程。該語法定義了兩種形式,分別是包含結(jié)果參數(shù)和不包含結(jié)果參數(shù)的形式,如果使用結(jié)果參數(shù),則必須將其注冊為OUT型參數(shù),參數(shù)是根據(jù)定義位置按順序引用的,第一個(gè)參數(shù)的索引為1。為參數(shù)賦值的方法使用從PreparedStatement類中繼承來的setXXX()方法。在執(zhí)行存儲(chǔ)過程之前,必須注冊所有OUT參數(shù)的類型,它們的值是在執(zhí)行后通過getXxx()方法獲得的。CallableStatement接口可以返回一個(gè)或多個(gè)ResultSet對(duì)象。處理多個(gè)ResultSet對(duì)象的方法是從Statement中繼承來的。課件制作人:XXX11.2.7ResultSet接口java.sql.ResultSet接口類似于一個(gè)數(shù)據(jù)表,通過該接口的實(shí)例可以獲得檢索結(jié)果集,以及對(duì)應(yīng)數(shù)據(jù)表的相關(guān)信息,例如列名和類型等,ResultSet實(shí)例通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。ResultSet實(shí)例具有指向當(dāng)前數(shù)據(jù)行的指針,最初,指針指向第一行記錄,通過next()方法可以將指針移動(dòng)到下一行,如果存在下一行該方法則返回true,否則返回false,所以可以通過while循環(huán)來迭代ResultSet結(jié)果集。默認(rèn)情況下ResultSet實(shí)例不可以更新,只能移動(dòng)指針,所以只能迭代一次,并且只能按從前向后的順序。如果需要,可以生成可滾動(dòng)和可更新的ResultSet實(shí)例。課件制作人:XXXResultSet接口ResultSet接口提供了從當(dāng)前行檢索不同類型列值的getXxx()方法,均有兩個(gè)重載方法,分別根據(jù)列的索引編號(hào)和列的名稱檢索列值,其中以列的索引編號(hào)較為高效,編號(hào)從1開始。對(duì)于不同的getXxx()方法,JDBC驅(qū)動(dòng)程序嘗試將基礎(chǔ)數(shù)據(jù)轉(zhuǎn)換為與getXxx()方法相應(yīng)的Java類型并返回。在JDBC2.0API之后,為該接口添加了一組更新方法updateXxx(),均有兩個(gè)重載方法,分別根據(jù)列的索引編號(hào)和列的名稱指定列。可以用來更新當(dāng)前行的指定列,也可以用來初始化要插入行的指定列,但是該方法并未將操作同步到數(shù)據(jù)庫,需要執(zhí)行updateRow()或insertRow()方法完成同步操作。ResultSet接口提供的常用方法如下表所示課件制作人:XXX方法名稱功能描述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ù)庫和JDBC資源,當(dāng)關(guān)閉所屬的Statement實(shí)例時(shí)也將執(zhí)行此操作getInt()以int型獲取指定列對(duì)應(yīng)SQL類型的值。如果列值為NULL,則返回值0getLong()以long型獲取指定列對(duì)應(yīng)SQL類型的值。如果列值為NULL,則返回值0getFloat()以float型獲取指定列對(duì)應(yīng)SQL類型的值。如果列值為NULL,則返回值0方法名稱功能描述getDouble()以double型獲取指定列對(duì)應(yīng)SQL類型的值。如果列值為NULL,則返回值0getString()以String型獲取指定列對(duì)應(yīng)SQL類型的值。如果列值為NULL,則返回值nullgetBoolean()以boolean型獲取指定列對(duì)應(yīng)SQL類型的值。如果列值為NULL,則返回值falsegetDate()以java.sql.Date型獲取指定列對(duì)應(yīng)SQL類型的值。如果列值為NULL,則返回值nullgetObject()以O(shè)bject型獲取指定列對(duì)應(yīng)SQL類型的值。如果列值為NULL,則返回值nullgetMetaData()獲取ResultSet實(shí)例的相關(guān)信息,并返回ResultSetMetaData類型的實(shí)例。updateNull()將指定列更改為NULL。用于插入和更新,但并不會(huì)同步到數(shù)據(jù)庫,需要執(zhí)行updateRow()或insertRow()方法完成同步updateInt()更改SQL類型對(duì)應(yīng)int型的指定列。用于插入和更新,但并不會(huì)同步到數(shù)據(jù)庫,需要執(zhí)行updateRow()或insertRow()方法完成同步updateLong()更改SQL類型對(duì)應(yīng)long型的指定列。用于插入和更新,但并不會(huì)同步到數(shù)據(jù)庫,需要執(zhí)行updateRow()或insertRow()方法完成同步updateFloat()更改SQL類型對(duì)應(yīng)float型的指定列。用于插入和更新,但并不會(huì)同步到數(shù)據(jù)庫,需要執(zhí)行updateRow()或insertRow()方法完成同步updateDouble()更改SQL類型對(duì)應(yīng)double型的指定列。用于插入和更新,但并不會(huì)同步到數(shù)據(jù)庫,需要執(zhí)行updateRow()或insertRow()方法完成同步updateString()更改SQL類型對(duì)應(yīng)String型的指定列。用于插入和更新,但并不會(huì)同步到數(shù)據(jù)庫,需要執(zhí)行updateRow()或insertRow()方法完成同步updateBoolean()更改SQL類型對(duì)應(yīng)boolean型的指定列。用于插入和更新,但并不會(huì)同步到數(shù)據(jù)庫,需要執(zhí)行updateRow()或insertRow()方法完成同步updateDate()更改SQL類型對(duì)應(yīng)Date型的指定列。用于插入和更新,但并不會(huì)同步到數(shù)據(jù)庫,需要執(zhí)行updateRow()或insertRow()方法完成同步updateObject()可更改所有SQL類型的指定列。用于插入和更新,但并不會(huì)同步到數(shù)據(jù)庫,需要執(zhí)行updateRow()或insertRow()方法完成同步moveToInsertRow()移動(dòng)指針到插入行,并記住當(dāng)前行的位置。插入行實(shí)際上是一個(gè)緩沖區(qū),在插入行可以插入記錄,此時(shí),僅能調(diào)用更新方法和insertRow()方法,通過更新方法為指定列賦值,通過insertRow()方法同步到數(shù)據(jù)庫,在調(diào)用insertRow()方法之前,必須為不允許為空的列賦值moveToCurrentRow()移動(dòng)指針到記住的位置,即調(diào)用moveToInsertRow()方法之前所在的行insertRow()將插入行的內(nèi)容同步到數(shù)據(jù)庫。如果指針不在插入行上,或者有不允許為空的列的值為空,將拋出異常updateRow()將當(dāng)前行的更新內(nèi)容同步到數(shù)據(jù)庫。更新當(dāng)前行的列值后,必須調(diào)用該方法,否則不會(huì)將更新內(nèi)容同步到數(shù)據(jù)庫deleteRow()刪除當(dāng)前行。執(zhí)行該方法后,并不會(huì)立即同步到數(shù)據(jù)庫,而是在執(zhí)行close()方法后才同步到數(shù)據(jù)庫11.3連接數(shù)據(jù)庫在訪問數(shù)據(jù)庫時(shí),首先要加載數(shù)據(jù)庫的驅(qū)動(dòng)程序,不過只需在第一次訪問數(shù)據(jù)庫時(shí)加載一次;然后在每次訪問數(shù)據(jù)庫時(shí)創(chuàng)建一個(gè)Connection實(shí)例;緊接著執(zhí)行操作數(shù)據(jù)庫的SQL語句,并處理返回結(jié)果;最后在完成此次操作時(shí)銷毀前面創(chuàng)建的Connection實(shí)例,釋放與數(shù)據(jù)庫的連接。課件制作人:XXX11.3.1加載JDBC驅(qū)動(dòng)程序在與數(shù)據(jù)庫建立連接之前,必須先加載欲連接數(shù)據(jù)庫的驅(qū)動(dòng)程序到JVM(Java虛擬機(jī))中,加載方法為通過java.lang.Class類的靜態(tài)方法forName(StringclassName);成功加載后,會(huì)將加載的驅(qū)動(dòng)類注冊給DriverManager類;如果加載失敗,將拋出ClassNotFoundException異常,即未找到指定的驅(qū)動(dòng)類,所以需要在加載數(shù)據(jù)庫驅(qū)動(dòng)類時(shí)捕捉可能拋出的異常。通常情況下將負(fù)責(zé)加載數(shù)據(jù)庫驅(qū)動(dòng)的代碼放在static塊中,因?yàn)閟tatic塊的特點(diǎn)是只在其所在類第一次被加載時(shí)執(zhí)行,即第一次訪問數(shù)據(jù)庫時(shí)執(zhí)行,這樣就可以避免反復(fù)加載數(shù)據(jù)庫驅(qū)動(dòng),減少對(duì)資源的浪費(fèi),同時(shí)提高了訪問數(shù)據(jù)庫的速度。【例11-1】課件制作人:XXX11.3.2創(chuàng)建數(shù)據(jù)庫連接java.sql.DriverManager(驅(qū)動(dòng)程序管理器)類是JDBC的管理層,負(fù)責(zé)建立和管理數(shù)據(jù)庫連接。通過DriverManager類的靜態(tài)方法getConnection(Stringurl,Stringuser,Stringpassword)可以建立數(shù)據(jù)庫連接,3個(gè)參數(shù)依次為欲連接數(shù)據(jù)庫的路徑、用戶名和密碼,該方法的返回值類型為java.sql.Connection。【例11-2】課件制作人:XXX11.3.3執(zhí)行SQL語句建立數(shù)據(jù)庫連接(Connection)的目的是與數(shù)據(jù)庫進(jìn)行通信,實(shí)現(xiàn)方法為執(zhí)行SQL語句,但是通過Connection實(shí)例并不能執(zhí)行SQL語句,還需要通過Connection實(shí)例創(chuàng)建Statement實(shí)例,Statement實(shí)例又分為3種類型:(1)Statement實(shí)例:該類型的實(shí)例只能用來執(zhí)行靜態(tài)的SQL語句;(2)PreparedStatement實(shí)例:該類型的實(shí)例增加了執(zhí)行動(dòng)態(tài)SQL語句的功能;(3)CallableStatement實(shí)例:該類型的實(shí)例增加了執(zhí)行數(shù)據(jù)庫存儲(chǔ)過程的功能。上面給出三種不同的類型中Statement是最基礎(chǔ)的;PreparedStatement繼承Statement,并做了相應(yīng)的擴(kuò)展;而CallableStatement繼承了PreparedStatement,又做了相應(yīng)的擴(kuò)展。在11.4節(jié)將詳細(xì)介紹各種類型實(shí)例的使用方法。課件制作人:XXX11.3.4獲得查詢結(jié)果通過Statement接口的executeUpdate()或executeQuery()方法,可以執(zhí)行SQL語句,同時(shí)將返回執(zhí)行結(jié)果,如果執(zhí)行的是executeUpdate()方法,將返回一個(gè)int型數(shù)值,代表影響數(shù)據(jù)庫記錄的條數(shù),即插入、修改或刪除記錄的條數(shù);如果執(zhí)行的是executeQuery()方法,將返回一個(gè)ResultSet型的結(jié)果集,其中不僅包含所有滿足查詢條件的記錄,還包含相應(yīng)數(shù)據(jù)表的相關(guān)信息,例如每一列的名稱、類型和列的數(shù)量等。課件制作人:XXX11.3.5關(guān)閉連接在建立Connection、Statement和ResultSet實(shí)例時(shí),均需占用一定的數(shù)據(jù)庫和JDBC資源,所以每次訪問數(shù)據(jù)庫結(jié)束后,應(yīng)該及時(shí)銷毀這些實(shí)例,釋放它們占用的所有資源,方法是通過各個(gè)實(shí)例的close()方法,執(zhí)行close()方法時(shí)建議按照如下的順序:resultSet.close();statement.close();connection.close();建議按上面的順序關(guān)閉的原因在于Connection是一個(gè)接口,close()方法的實(shí)現(xiàn)方式可能多種多樣。課件制作人:XXX關(guān)閉連接如果是通過DriverManager類的getConnection()方法得到的Connection實(shí)例,在調(diào)用close()方法關(guān)閉Connection實(shí)例時(shí)會(huì)同時(shí)關(guān)閉Statement實(shí)例和ResultSet實(shí)例。但是通常情況下需要采用數(shù)據(jù)庫連接池,在調(diào)用通過連接池得到的Connection實(shí)例的close()方法時(shí),Connection實(shí)例可能并沒有被釋放,而是被放回到了連接池中,又被其他連接調(diào)用,在這種情況下如果不手動(dòng)關(guān)閉Statement實(shí)例和ResultSet實(shí)例,它們在Connection中可能會(huì)越來越多,雖然JVM的垃圾回收機(jī)制會(huì)定時(shí)清理緩存,但是如果清理得不及時(shí),當(dāng)數(shù)據(jù)庫連接達(dá)到一定數(shù)量時(shí),將嚴(yán)重影響數(shù)據(jù)庫和計(jì)算機(jī)的運(yùn)行速度,甚至導(dǎo)致軟件或系統(tǒng)癱瘓。課件制作人:XXX11.4操作數(shù)據(jù)庫訪問數(shù)據(jù)庫的目的是操作數(shù)據(jù)庫,包括向數(shù)據(jù)庫插入記錄或修改、刪除數(shù)據(jù)庫中的記錄,或者是從數(shù)據(jù)庫中查詢符合一定條件的記錄,這些操作既可以通過靜態(tài)的SQL語句實(shí)現(xiàn),也可以通過動(dòng)態(tài)的SQL語句實(shí)現(xiàn),還可以通過存儲(chǔ)過程實(shí)現(xiàn),具體采用的實(shí)現(xiàn)方式要根據(jù)實(shí)際情況而定。在增、刪、改數(shù)據(jù)庫中的記錄時(shí),分為單條操作和批量操作,單條操作又分為一次只操作一條記錄和一次只執(zhí)行一條SQL語句,批量操作又分為通過一條SQL語句(只能是UPDATE和DELETE語句)操作多條記錄和一次執(zhí)行多條SQL語句。課件制作人:XXX11.4.1添加數(shù)據(jù)在添加記錄時(shí),一條INSERT語句只能添加一條記錄。如果只需要添加一條記錄,通常情況下通過Statement實(shí)例完成?!纠?1-3】【例11-4】【例11-5】【例11-6】【例11-7】課件制作人:XXX11.4.2查詢數(shù)據(jù)在查詢數(shù)據(jù)時(shí),既可以利用Statement實(shí)例通過執(zhí)行靜態(tài)SELECT語句完成,也可以利用PreparedStatement實(shí)例通過執(zhí)行動(dòng)態(tài)SELECT語句完成,還可以利用CallableStatement實(shí)例通過執(zhí)行存儲(chǔ)過程完成。(1)利用Statement實(shí)例通過執(zhí)行靜態(tài)SELECT語句查詢數(shù)據(jù)的典型代碼如下:(2)利用PreparedStatement實(shí)例通過執(zhí)行動(dòng)態(tài)SELECT語句查詢數(shù)據(jù)的典型代碼如下:ResultSetrs=statement.executeQuery("select*fromtb_recordwheresex='男'");Stringsql="select*fromtb_recordwheresex=?";PreparedStatementprpdStmt=connection.prepareStatement(sql);prpdStmt.setString(1,"男");ResultSetrs=prpdStmt.executeQuery();課件制作人:XXX查詢數(shù)據(jù)(3)利用CallableStatement實(shí)例通過執(zhí)行存儲(chǔ)過程查詢數(shù)據(jù)的典型代碼如下:無論利用哪個(gè)實(shí)例查詢數(shù)據(jù),都需要執(zhí)行executeQuery()方法,這時(shí)才真正執(zhí)行SELECT語句,從數(shù)據(jù)庫中查詢符合條件的記錄,該方法將返回一個(gè)ResultSet型的結(jié)果集,在該結(jié)果集中不僅包含所有滿足查詢條件的記錄,還包含相應(yīng)數(shù)據(jù)表的相關(guān)信息,例如每一列的名稱、類型和列的數(shù)量等。【例11-8】【例11-9】Stringcall="{callpro_record_select_by_sex(?)}";CallableStatementcablStmt=connection.prepareCall(call);cablStmt.setString(1,"男");ResultSetrs=cablStmt.executeQuery();課件制作人:XXX11.4.3修改數(shù)據(jù)在修改數(shù)據(jù)時(shí),即可以利用Statement實(shí)例通過執(zhí)行靜態(tài)UPDATE語句完成,也可以利用PreparedStatement實(shí)例通過執(zhí)行動(dòng)態(tài)UPDATE語句完成,還可以利用CallableStatement實(shí)例通過執(zhí)行存儲(chǔ)過程完成。(1)利用Statement實(shí)例通過執(zhí)行靜態(tài)UPDATE語句修改數(shù)據(jù)的典型代碼如下:(2)利用PreparedStatement實(shí)例通過執(zhí)行動(dòng)態(tài)UPDATE語句修改數(shù)據(jù)的典型代碼如下:Stringsql="updatetb_recordsetsalary=3000whereduty='部門經(jīng)理'";statement.executeUpdate(sql);Stringsql="updatetb_recordsetsalary=?whereduty=?";PreparedStatementprpdStmt=connection.prepareStatement(sql);prpdStmt.setInt(1,3000);prpdStmt.setString(2,"部門經(jīng)理");prpdStmt.executeUpdate();課件制作人:XXX修改數(shù)據(jù)(3)利用CallableStatement實(shí)例通過執(zhí)行存儲(chǔ)過程修改數(shù)據(jù)的典型代碼如下:無論利用哪個(gè)實(shí)例修改數(shù)據(jù),都需要執(zhí)行executeUpdate()方法,這時(shí)才真正執(zhí)行UPDATE語句,修改數(shù)據(jù)庫中符合條件的記錄,該方法將返回一個(gè)int型數(shù),為被修改記錄的條數(shù)。【例11-10】【例11-11】Stringcall="{callpro_record_update_salary_by_duty(?,?)}";CallableStatementcablStmt=connection.prepareCall(call);cablStmt.setInt(1,3000);cablStmt.setString(2,"部門經(jīng)理");cablStmt.executeUpdate();課件制作人:XXX11.4.4刪除數(shù)據(jù)在刪除數(shù)據(jù)時(shí),既可以利用Statement實(shí)例通過執(zhí)行靜態(tài)DELETE語句完成,也可以利用PreparedStatement實(shí)例通過執(zhí)行動(dòng)態(tài)DELETE語句完成,還可以利用CallableStatement實(shí)例通過執(zhí)行存儲(chǔ)過程完成。(1)利用Statement實(shí)例通過執(zhí)行靜態(tài)DELETE語句刪除數(shù)據(jù)的典型代碼如下:Stringsql="deletefromtb_merchandisewheredate<'2008-2-14'";statement.execute

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論