版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第07章JDBC數(shù)據(jù)庫訪問第一頁,共55頁。本章內(nèi)容7.1JDBC技術(shù)概述7.2傳統(tǒng)的數(shù)據(jù)庫連接方法7.3JDBCAPI介紹第二頁,共55頁。7.1JDBC技術(shù)概述JDBCJava程序訪問數(shù)據(jù)庫的標準,由Java編寫的類和接口組成,稱為JDBCAPI,為Java程序提供通用的數(shù)據(jù)訪問接口。JDBC的基本功能:建立與數(shù)據(jù)庫的連接發(fā)送SQL語句處理數(shù)據(jù)庫操作結(jié)果第三頁,共55頁。7.1.1數(shù)據(jù)庫訪問的兩層和三層模型圖7-1表示兩層模型,也稱作為客戶機-數(shù)據(jù)庫服務(wù)器結(jié)構(gòu),即C/S結(jié)構(gòu)。Java應(yīng)用程序通過JDBCAPI直接和數(shù)據(jù)源交互。用戶的SQL命令被傳送給數(shù)據(jù)庫或其他數(shù)據(jù)源,SQL語句的執(zhí)行結(jié)果返回給用戶。第四頁,共55頁。7.1.1數(shù)據(jù)庫訪問的兩層和三層模型圖7-2表示三層模型,也稱作為客戶機-應(yīng)用服務(wù)器-數(shù)據(jù)庫服務(wù)器結(jié)構(gòu),即B/S結(jié)構(gòu)。客戶機通過Java小程序或瀏覽器發(fā)出SQL請求,該請求首先傳送到應(yīng)用服務(wù)器。應(yīng)用服務(wù)器再通過JDBC與數(shù)據(jù)庫服務(wù)器進行連接,由數(shù)據(jù)庫服務(wù)器處理SQL語句,然后將結(jié)果返回給應(yīng)用服務(wù)器。第五頁,共55頁。7.1.2JDBC驅(qū)動程序Java應(yīng)用程序訪問數(shù)據(jù)庫如圖7-3所示。通過JDBC驅(qū)動程序管理器加載相應(yīng)的驅(qū)動程序,通過驅(qū)動程序與具體的數(shù)據(jù)庫連接,訪問數(shù)據(jù)庫。第六頁,共55頁。7.1.2JDBC驅(qū)動程序數(shù)據(jù)庫驅(qū)動程序完成從JDBC請求到數(shù)據(jù)庫系統(tǒng)方法調(diào)用轉(zhuǎn)換工作的程序。在Java程序中,可以使用的數(shù)據(jù)庫驅(qū)動程序主要有4種類型,常用的有下面兩種:JDBC-ODBC橋驅(qū)動程序。專為某種數(shù)據(jù)庫而編寫的驅(qū)動程序。第七頁,共55頁。1.
JDBC-ODBC橋驅(qū)動程序ODBC(OpenDataBaseConnectivity)開放數(shù)據(jù)庫連接,是Windows系統(tǒng)與各種數(shù)據(jù)庫進行通信的軟件。通過該橋驅(qū)動程序與ODBC驅(qū)動程序進行通信,就可與各種數(shù)據(jù)庫系統(tǒng)進行通信。但是,不推薦使用這種方法與數(shù)據(jù)庫連接,只適用于不能獲得數(shù)據(jù)庫專用的JDBC驅(qū)動程序、或在開發(fā)階段使用這種方法。第八頁,共55頁。2.專為某種數(shù)據(jù)庫而編寫的驅(qū)動程序由于ODBC具有一定的缺陷,數(shù)據(jù)庫廠商專門開發(fā)針對JDBC的驅(qū)動程序,這類驅(qū)動程序大多是用純Java語言編寫的,推薦使用數(shù)據(jù)庫廠商專門為JDBC開發(fā)的驅(qū)動程序。使用專用驅(qū)動程序連接數(shù)據(jù)庫,必須安裝驅(qū)動程序。不同的數(shù)據(jù)庫系統(tǒng)提供了不同的JDBC驅(qū)動程序,可以到相關(guān)網(wǎng)站下載。第九頁,共55頁。7.1.3安裝JDBC驅(qū)動程序如果使用PostgreSQL數(shù)據(jù)庫,可以到/下載,下載后是一個打包文件(如postgresql-9.2-1000.jdbc4.jar)。在開發(fā)Web應(yīng)用程序中,需要將驅(qū)動程序打包文件復(fù)制到Tomcat安裝目錄的lib目錄中、或Web應(yīng)用程序的WEB-INF\lib目錄中。第十頁,共55頁。7.2傳統(tǒng)的數(shù)據(jù)庫連接方法JDBCAPI在java.sql包和javax.sql包中定義,其中包括JDBCAPI用到的所有類和接口。主要的類和接口:
Driver接口DriverManager類Connection接口Statement接口PreparedStatement接口ResultSet接口CallableStatement接口SQLException類第十一頁,共55頁。7.2.1加載驅(qū)動程序訪問數(shù)據(jù)庫,首先要加載驅(qū)動程序。驅(qū)動程序是實現(xiàn)Driver接口的類,一般由數(shù)據(jù)庫廠商提供。加載JDBC驅(qū)動程序,使用Class類的forName()靜態(tài)方法:publicstaticClass<?>forName(StringclassName)throwsClassNotFoundException
參數(shù)className:完整的驅(qū)動程序類的名稱。如果找不到驅(qū)動程序?qū)伋鯟lassNotFoundException異常。返回一個Class類的對象。第十二頁,共55頁。對于不同的數(shù)據(jù)庫,驅(qū)動程序的類名是不同的。如果使用JDBC-ODBC橋驅(qū)動程序連接數(shù)據(jù)庫,則使用JDK自帶的驅(qū)動程序,名稱為“sun.jdbc.odbc.JdbcOdbcDriver”。要加載該驅(qū)動程序,可使用下面的語句:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");7.2.1加載驅(qū)動程序第十三頁,共55頁。如果要加載數(shù)據(jù)庫廠商提供的專門的驅(qū)動程序,應(yīng)該給出專門的驅(qū)動程序名。要加載PostgreSQL數(shù)據(jù)庫驅(qū)動程序:Class.forName(“org.postgresql.Driver”);PostgreSQL的驅(qū)動程序類名為org.postgresql.Driver。7.2.1加載驅(qū)動程序第十四頁,共55頁。7.2.2建立連接對象驅(qū)動程序加載成功后,使用DriverManager類的getConnection()建立數(shù)據(jù)庫連接對象。DriverManager類維護一個注冊的Driver類的列表。調(diào)用DriverManager類的靜態(tài)方法getConnection():publicstaticConnectiongetConnection(Stringdburl)publicstaticConnectiongetConnection(Stringdburl,
Stringuser,Stringpassword)
第十五頁,共55頁。JDBCURLJDBCURL與一般的URL不同,用來標識數(shù)據(jù)源,驅(qū)動程序就可以與它建立一個連接。JDBCURL的標準語法,包括三個部分,中間用冒號分隔。jdbc:<subprotocol>:<subname>jdbc表示協(xié)議,JDBCURL的協(xié)議總是jdbc。subprotocol表示子協(xié)議。subname為子名稱,表示數(shù)據(jù)庫標識符,該部分內(nèi)容隨數(shù)據(jù)庫驅(qū)動程序的不同而不同。第十六頁,共55頁。如果通過JDBC-ODBC橋驅(qū)動程序連接數(shù)據(jù)庫,URL的形式為:jdbc:odbc:DataSource三個部分組成一個整體字符串就是JDBCURL。Stringdburl=“jdbc:odbc:sampleDS";如果使用數(shù)據(jù)庫廠商提供的專門的驅(qū)動程序連接數(shù)據(jù)庫。要連接PostgreSQL數(shù)據(jù)庫,JDBCURL為:jdbc:postgresql://localhost:5432/dbname其中:localhost表示主機名或IP地址,5432為數(shù)據(jù)庫服務(wù)器的端口號,dbname為數(shù)據(jù)庫名。JDBCURL第十七頁,共55頁。下面代碼說明了如何以paipaistore用戶連接到PostgreSQL數(shù)據(jù)庫。數(shù)據(jù)庫名為paipaistore、用戶名為paipaistore、口令為paipaistore:JDBCURLStringdburl=“jdbc:postgresql://localhost:5432/paipaistore”;Connectionconn=DriverManager.getConnection(dburl,"paipaistore","paipaistore");第十八頁,共55頁。常用的數(shù)據(jù)庫JDBC連接代碼
第十九頁,共55頁。7.2.3創(chuàng)建語句對象通過Connection對象創(chuàng)建語句對象。對于不同的語句對象,可以使用Connection接口的不同方法創(chuàng)建。創(chuàng)建一個簡單的Statement對象,應(yīng)該使用createStatement(),創(chuàng)建PreparedStatement對象,應(yīng)該使用prepareStatement(),創(chuàng)建CallableStatement對象,應(yīng)該使用prepareCall()。下面的代碼將創(chuàng)建一個簡單的Statement對象。Statementstmt=conn.createStatement();第二十頁,共55頁。7.2.4獲得SQL語句的執(zhí)行結(jié)果執(zhí)行SQL語句使用Statement對象的方法。對于查詢語句,調(diào)用executeQuery(Stringsql)返回ResultSet。ResultSet對象保存查詢的結(jié)果集,再調(diào)用ResultSet的成員方法,可以對查詢結(jié)果的每行進行處理。Stringsql="SELECT*FROMproducts";ResultSetrst=stmt.executeQuery(sql);while(rst.next()){out.print(rst.getString(1)+“\t”);}第二十一頁,共55頁。7.2.4獲得SQL語句的執(zhí)行結(jié)果對于DDL語句,如CREATE、ALTER、DROP對于DML語句,如INSERT、UPDATE、DELETE使用語句對象的成員方法:executeUpdate(Stringsql)該方法返回值為整數(shù),用來指示被影響的行數(shù)。第二十二頁,共55頁。7.2.5關(guān)閉建立的對象在Connection接口、Statement接口和ResultSet接口中都定義close(
)當這些對象使用完畢后,應(yīng)使用close()關(guān)閉。第二十三頁,共55頁。7.3JDBCAPI介紹JDBCAPI是Java語言的標準API,目前的最新版本是JDBC4.0。在JDK7.0中,通過兩個包提供:java.sql包javax.sql包第二十四頁,共55頁。java.sql包提供基本的數(shù)據(jù)庫編程的類和接口,如驅(qū)動程序管理類DriverManager、創(chuàng)建數(shù)據(jù)庫連接Connection接口、執(zhí)行SQL語句以及處理查詢結(jié)果的類和接口等。javax.sql包提供服務(wù)器端訪問和處理數(shù)據(jù)源的類和接口,如DataSource、RowSet、RowSetMetaData、PooledConnection接口等,實現(xiàn)數(shù)據(jù)源管理、行集管理以及連接池管理等。7.3JDBCAPI介紹第二十五頁,共55頁。7.3.1Connection接口獲取connection對象的方法:調(diào)用DriverManager類的靜態(tài)方法getConnection()數(shù)據(jù)源(DataSource)對象的getConnection()得到連接對象后,調(diào)用createStatement()創(chuàng)建SQL語句(Statement)對象,以及在連接對象上完成各種操作。第二十六頁,共55頁。publicStatementcreateStatement()創(chuàng)建一個Statement對象。如果用于查詢,調(diào)用executeQuery()返回的ResultSet是一個不可滾動、不可更新的ResultSet。7.3.1Connection接口第二十七頁,共55頁。publicStatementcreateStatement(intresultType,intconcurrency)創(chuàng)建一個Statement對象。如果用于查詢,兩個參數(shù)決定executeQuery()返回的ResultSet是否是一個可滾動、可更新的ResultSet。7.3.1Connection接口第二十八頁,共55頁。publicStatementcreateStatement(intresultType,intconcurrency,intholdability)創(chuàng)建一個Statement對象。如果用于查詢,那么前兩個參數(shù)決定executeQuery()返回的ResultSet是否是一個可滾動、可更新的ResultSet,第三個參數(shù)決定可保持性(holdability)。7.3.1Connection接口第二十九頁,共55頁。7.3.2Statement接口一旦創(chuàng)建Statement對象,用于向數(shù)據(jù)庫發(fā)送SQL語句,實現(xiàn)對數(shù)據(jù)庫的查詢和更新操作等。執(zhí)行查詢操作語句執(zhí)行非查詢操作語句釋放statement第三十頁,共55頁。1.執(zhí)行查詢語句使用Statement接口的下列方法向數(shù)據(jù)庫發(fā)送SQL查詢語句。publicResultSetexecuteQuery(Stringsql)用來執(zhí)行SQL查詢語句。參數(shù)sql用字符串表示的SQL查詢語句。查詢結(jié)果以ResultSet對象返回,一般稱為結(jié)果集對象。在ResultSet對象上可以逐行逐列地讀取數(shù)據(jù)。第三十一頁,共55頁。2.執(zhí)行非查詢語句使用Statement接口的下列方法向數(shù)據(jù)庫發(fā)送非SQL查詢語句。publicintexecuteUpdate(Stringsql)執(zhí)行由字符串sql指定的SQL語句可是INSERT、DELETE、UPDATE語句可是無返回值的SQL語句,如SQLDDL語句CREATETABLE。返回值是更新的行數(shù),如果語句沒有返回,則返回值為0。第三十二頁,共55頁。2.執(zhí)行非查詢語句publicbooleanexecute(Stringsql)執(zhí)行可能有多個結(jié)果集的SQL語句,sql為任何SQL語句。如果語句執(zhí)行的第一個結(jié)果為ResultSet對象,該方法返回true,否則返回false。publicint[]executeBatch()用于在一個操作中發(fā)送多條SQL語句。第三十三頁,共55頁。
與Connection對象一樣,Statement對象使用完畢應(yīng)該用close()釋放其占用的資源。注意:并不是在執(zhí)行了一條SQL語句后就立即釋放這個Statement對象,可以用同一個Statement對象執(zhí)行多個SQL語句。3.釋放Statement第三十四頁,共55頁。7.3.3ResultSet接口ResultSet對象表示SELECT語句查詢得到的記錄集合,結(jié)果集一般是一個記錄表,包含多個記錄行、列標題。注意:記錄行從1開始,一個Statement對象一個時刻只能打開一個ResultSet對象。如果需要對結(jié)果集的每行進行處理,需要移動結(jié)果集的游標(結(jié)果集的一個標志或指針)。對新產(chǎn)生的ResultSet對象,游標指向第一行的前面,可以調(diào)用ResultSet的next(),使游標定位到下一條記錄。第三十五頁,共55頁。publicbooleannext()throwsSQLException將游標從當前位置向下移動一行。注意:第一次調(diào)用next(),將使第一行成為當前行,以后調(diào)用游標依次向后移動。如果該方法返回true,說明新行是有效的行,若返回false,說明已無記錄。7.3.3ResultSet接口第三十六頁,共55頁。1.檢索字段值ResultSet接口提供檢索行字段值的方法,根據(jù)結(jié)果集列的數(shù)據(jù)類型不同,使用不同的getXxx()獲得列值。例如若列值為字符型數(shù)據(jù),可以使用下列方法檢索列值:StringgetString(intcolumnIndex)
StringgetString(StringcolumnName)
第三十七頁,共55頁。返回結(jié)果集中,當前行指定的列號或列名的列值,結(jié)果作為字符串返回。columnIndex
為列在結(jié)果行中的序號,序號從1開始。columnName為結(jié)果行中的列名。1.檢索字段值第三十八頁,共55頁。publicbooleangetBoolean(intcolumnIndex)返回指定列的boolean值。publicDategetDate(intcolumnIndex)返回指定列的Date對象值。publicObjectgetObject(intcolumnIndex)返回指定列的Object對象值。publicBlobgetBlob(intcolumnIndex)返回指定列的Blob對象值。publicClobgetClob(intcolumnIndex)返回指定列的Clob對象值。1.檢索字段值第三十九頁,共55頁。2.數(shù)據(jù)類型轉(zhuǎn)換在ResultSet對象中,數(shù)據(jù)為從數(shù)據(jù)庫中查詢出的數(shù)據(jù)。調(diào)用ResultSet對象的getXxx()方法返回的是Java語言的數(shù)據(jù)類型。實際上,調(diào)用getXxx()方法,就是把SQL數(shù)據(jù)類型轉(zhuǎn)換為Java語言數(shù)據(jù)類型。數(shù)據(jù)類型轉(zhuǎn)換的問題第四十頁,共55頁。2.數(shù)據(jù)類型轉(zhuǎn)換第四十一頁,共55頁。7.3.4可滾動與可更新的ResultSet可滾動的ResultSet在結(jié)果集對象上,可以前后移動指針訪問結(jié)果集中的記錄??筛碌腞esultSet不但可以訪問結(jié)果集中的記錄,還可通過結(jié)果集對象更新數(shù)據(jù)庫。第四十二頁,共55頁。1.可滾動的ResultSet要使用可滾動的ResultSet對象,必須使用Connection對象的帶參數(shù)的createStatement()創(chuàng)建Statement。publicStatementcreateStatement(intresultType,intconcurrency)如果Statement對象用于查詢,兩個參數(shù)決定executeQuery()返回的ResultSet是否是一個可滾動、可更新的ResultSet。第四十三頁,共55頁。參數(shù)resultType的取值應(yīng)為ResultSet接口中定義的常量。使用TYPE_SCROLL_SENSITIVE常量創(chuàng)建可滾動的ResultSet,當數(shù)據(jù)庫發(fā)生改變時,這些變化對結(jié)果集可見。使用TYPE_SCROLL_INSENSITIVE常量創(chuàng)建可滾動的ResultSet,當數(shù)據(jù)庫發(fā)生改變時,這些變化對結(jié)果集不可見。使用TYPE_FORWARD_ONLY常量創(chuàng)建不可滾動的結(jié)果集。1.可滾動的ResultSet第四十四頁,共55頁。對于可滾動的結(jié)果集,ResultSet接口提供了下面的移動結(jié)果集游標的方法。publicbooleanprevious()throwsSQLException游標向前移動一行,如果存在合法的行返回true,否則返回false。publicbooleanfirst()throwsSQLException移動游標使其指向第一行。publicbooleanlast()throwsSQLException移動游標使其指向最后一行。publicbooleanabsolute(introws)throwsSQLException移動游標使其指向指定的行。1.可滾動的ResultSet第四十五頁,共55頁。publicbooleanrelative(introws)throwsSQLException以當前行為基準相對移動游標的指針,rows為向后或向前移動的行數(shù)。rows若為正值是向前移動,若為負值是向后移動。publicbooleanisFirst()throwsSQLException返回游標是否指向第一行。publicbooleanisLast()throwsSQLException返回游標是否指向最后一行。publicintgetRow()返回游標所在當前行的行號。1.可滾動的ResultSet第四十六頁,共55頁。2.可更新的ResultSet在JDBC2.0之前,ResultSet對象只可用于查詢數(shù)據(jù)、向前移動游標、讀取每列數(shù)據(jù)值。為了更新數(shù)據(jù),需要通過Statement對象執(zhí)行另外的SQL語句。JDBC2.0提供了直接通過ResultSet對象更新數(shù)據(jù)庫表中數(shù)據(jù)的能力。要實現(xiàn)該功能,應(yīng)該創(chuàng)建一個可更新的ResultSet對象。第四十七頁,共55頁。使用Connection的createStatement(intresultType,intconcurrency)創(chuàng)建Statement對象時,指定第二個參數(shù)的值決定是否創(chuàng)建可更新的結(jié)果集。該參數(shù)使用ResultSet接口中定義的常量:ResultSet.CONCUR_READ_ONLY創(chuàng)建一個只。讀的ResultSet對象,不能更新表。ResultSet.CONCUR_UPDATABLE創(chuàng)建一個可更新的ResultSet對象。2.可更新的ResultSet第四十八頁,共55頁。得到可更新的ResultSet對象后,調(diào)用適當?shù)膗pdateXxx()更新指定的列值。對于每種數(shù)據(jù)類型,ResultSet都定義了相應(yīng)的updateXxx():publicvoidupdateInt(intcolumnIndex,intx)用指定的整數(shù)x的值更新當前行指定的列的值,其中columnIndex為列的序號。publicvoidupdateInt(StringcolumnName,intx)用指定的整數(shù)x的值更新當前行指定的列的值,其中columnName為列名2.可更新的ResultSet第四十九頁,共55頁。publicvoidupdateString(intcolumnIndex,Stringx)用指定的字符串x的值更新當前行指定的列的值,其中columnIndex為列的序號。publicvoidupdateString(StringcolumnName,Stringx)用指定的字符串x的值更新當前行指定的列的值,其中columnName為列名。2.可更新的ResultSet第五十頁,共55頁。通過可更新的ResultSet對象,實現(xiàn)對表的插入、刪除、修改。voidmoveToInsertRow()throwsSQLException將游標
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年版影視制作與發(fā)行合同
- 美業(yè)門店培訓(xùn)課程設(shè)計
- 英語加國學(xué)課程設(shè)計理念
- 感覺統(tǒng)合課程設(shè)計大班
- 油畫初學(xué)者 課程設(shè)計
- 2024政法干警考試復(fù)習(xí)資料
- 系統(tǒng)動力學(xué)課程設(shè)計總結(jié)
- 深圳市政府投資交通建設(shè)項目管理模式-第二冊
- 大班社會簽到課程設(shè)計
- 2024年羽絨家紡銷售崗位職責(共8篇)
- 湖南省部分學(xué)校2023-2024學(xué)年高二上學(xué)期期末聯(lián)合考試政治試卷 含解析
- 中學(xué)生心理健康教育主題班會課件
- 電大《人力資源管理》期末復(fù)習(xí)綜合練習(xí)題答案(2024年)
- 西師版數(shù)學(xué)(四上題)2023-2024學(xué)年度小學(xué)學(xué)業(yè)質(zhì)量監(jiān)測(試卷)
- 2022-2023學(xué)年廣東省廣州市白云區(qū)華南師大附屬太和實驗學(xué)校九年級(上)期末數(shù)學(xué)試卷(含答案)
- 東方電影學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 人教版四年級上冊數(shù)學(xué)數(shù)學(xué)復(fù)習(xí)資料
- 安徽省安慶市迎江區(qū)2023-2024學(xué)年四年級上學(xué)期期末數(shù)學(xué)試卷
- SB/T 10439-2007醬腌菜
- 肺炎試題及答案
- 現(xiàn)代CMOS工藝基本流程
評論
0/150
提交評論