




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第11章 JDBCJava基礎(chǔ)入門(第3版)學(xué)習(xí)目標(biāo)/Target了解JDBC的常用API,能夠說出JDBC 常用API的作用及其常用方法掌握J(rèn)DBC入門程序的編寫,能夠獨(dú)立編寫JDBC程序操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)了解什么是JDBC,能夠說出JDBC的概念和特點(diǎn)章節(jié)概述/ Summary在軟件開發(fā)過程中,經(jīng)常要使用數(shù)據(jù)庫(kù)存儲(chǔ)和管理數(shù)據(jù)。為了在Java中提供對(duì)數(shù)據(jù)庫(kù)訪問的支持,SUN公司于1996年提供了一套訪問數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)Java類庫(kù),即JDBC。本章將主要圍繞什么是JDBC、JDBC的常用API、JDBC入門程序等知識(shí)進(jìn)行詳細(xì)地講解。目錄/Contents010203什么是JDBCJDBC的常用A
2、PIJDBC編程什么是JDBC11.111.1.1 JDBC概述 先定一個(gè)小目標(biāo)!了解JDBCJDBC的概念和特點(diǎn),能夠說出JDBC的概念和特點(diǎn)11.1.1 JDBC概述JDBC的全稱是Java數(shù)據(jù)庫(kù)連接(Java Database Connectivity),它是一套用于執(zhí)行SQL語(yǔ)句的Java API。應(yīng)用程序可通過這套Java API連接到關(guān)系數(shù)據(jù)庫(kù),并使用SQL語(yǔ)句完成對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的查詢、新增、更新和刪除等操作。使用JDBC連接數(shù)據(jù)庫(kù)驅(qū)動(dòng),用戶就不必用戶不必編寫Java程序與數(shù)據(jù)庫(kù)交互的底層代碼,使得代碼的通用性更強(qiáng)。JDBC介紹11.1.1 JDBC概述應(yīng)用程序使用JDBC訪問數(shù)據(jù)
3、庫(kù)的方式由左圖可知,不同的數(shù)據(jù)庫(kù)需要使用不同的JDBC驅(qū)動(dòng)進(jìn)行連接,例如,訪問MySQL數(shù)據(jù)庫(kù)需要使用MySQL驅(qū)動(dòng),訪問Oracle數(shù)據(jù)庫(kù)需要使用Oracle驅(qū)動(dòng)。而JDBC在應(yīng)用程序與數(shù)據(jù)庫(kù)之間起到了一個(gè)橋梁作用。應(yīng)用程序與數(shù)據(jù)庫(kù)連接成功后即可對(duì)數(shù)據(jù)庫(kù)進(jìn)行相應(yīng)的操作。11.1.2 JDBC驅(qū)動(dòng)程序 先定一個(gè)小目標(biāo)!了解JDBC驅(qū)動(dòng)程序,能夠說出4種常見的JDBC驅(qū)動(dòng)程序11.1.2 JDBC驅(qū)動(dòng)程序JDBC驅(qū)動(dòng)程序分類JDBC本身提供的是一套數(shù)據(jù)庫(kù)操作標(biāo)準(zhǔn),而JDBC中提供的這些標(biāo)準(zhǔn)又需要各個(gè)數(shù)據(jù)庫(kù)廠商實(shí)現(xiàn),針對(duì)每一個(gè)數(shù)據(jù)庫(kù)而言,每一個(gè)數(shù)據(jù)庫(kù)廠商都會(huì)為其數(shù)據(jù)庫(kù)產(chǎn)品提供一個(gè)JDBC的驅(qū)動(dòng)程序
4、,目前比較常見的JDBC驅(qū)動(dòng)程序可以分為以下4類。11.1.2 JDBC驅(qū)動(dòng)程序1. JDBC-ODBC橋驅(qū)動(dòng)程序JDBC-ODBC橋驅(qū)動(dòng)程序由SUN公司開發(fā),是JDK提供的數(shù)據(jù)庫(kù)操作標(biāo)準(zhǔn)API,這種類型的驅(qū)動(dòng)實(shí)際是把所有 JDBC的調(diào)用傳遞給ODBC(Open Database Connectivity,開發(fā)數(shù)據(jù)庫(kù)連接),再由ODBC調(diào)用本地?cái)?shù)據(jù)庫(kù)驅(qū)動(dòng)代碼,操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)。通過JDBC-ODBC橋驅(qū)動(dòng)操作數(shù)據(jù)庫(kù)的方式如下所示:由于JDBC-ODBC橋驅(qū)動(dòng)程序經(jīng)過幾次中間調(diào)用,所以執(zhí)行效率比較低。11.1.2 JDBC驅(qū)動(dòng)程序2. 本地API驅(qū)動(dòng)程序本地API驅(qū)動(dòng)直接將JDBC API 映
5、射成數(shù)據(jù)庫(kù)特定的客戶端API。這種驅(qū)動(dòng)包含特定數(shù)據(jù)庫(kù)的本地API,通過它可以訪問數(shù)據(jù)庫(kù)的客戶端。通過本地API驅(qū)動(dòng)操作數(shù)據(jù)庫(kù)的方式如下所示:通過本地 API驅(qū)動(dòng)程序訪問數(shù)據(jù)庫(kù)減少了ODBC的調(diào)用環(huán)節(jié),提高了數(shù)據(jù)庫(kù)訪問的效率。11.1.2 JDBC驅(qū)動(dòng)程序3. 網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)程序網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)是用純Java語(yǔ)言編寫的,JDBC把對(duì)數(shù)據(jù)庫(kù)的訪問請(qǐng)求傳遞給網(wǎng)絡(luò)上的中間件服務(wù)器,中間件服務(wù)器先把請(qǐng)求轉(zhuǎn)換為數(shù)據(jù)庫(kù)通信協(xié)議請(qǐng)求,然后再通過中間件服務(wù)器與數(shù)據(jù)庫(kù)進(jìn)行交互。使用這種類型驅(qū)動(dòng)程序的Java應(yīng)用程序可以與服務(wù)器端完全分離,具有很大的靈活性。通過網(wǎng)絡(luò)協(xié)議驅(qū)動(dòng)操作數(shù)據(jù)庫(kù)的方式:11.1.2 JDBC驅(qū)動(dòng)程序
6、4. 本地協(xié)議驅(qū)動(dòng)本地協(xié)議驅(qū)動(dòng)是用使用純Java語(yǔ)言編寫的。本地協(xié)議驅(qū)動(dòng)通常由數(shù)據(jù)庫(kù)廠商直接提供驅(qū)動(dòng)的JAR包,本地協(xié)議驅(qū)動(dòng)程序直接將JDBC調(diào)用轉(zhuǎn)換為數(shù)據(jù)庫(kù)特定的網(wǎng)絡(luò)通信協(xié) 議,然后與數(shù)據(jù)庫(kù)進(jìn)行交互。通過本地協(xié)議驅(qū)動(dòng)操作數(shù)據(jù)庫(kù)的方式:11.1.2 JDBC驅(qū)動(dòng)程序上述4種類型中,JDBC-ODBC橋驅(qū)動(dòng)程序由于執(zhí)行效率不高,更適合開發(fā)應(yīng)用時(shí)的一種過渡方案; 如果是在內(nèi)聯(lián)網(wǎng)(Intranet)的應(yīng)用,可以考慮本地API 驅(qū)動(dòng)程序;如果是基于互聯(lián)網(wǎng)(Internet)并且需要同時(shí)連接多個(gè)不同種類的數(shù)據(jù)庫(kù), 并發(fā)連接要求高的應(yīng)用,可以考慮JDBC-Net Driver。如果是基于互聯(lián)網(wǎng)(Inter
7、net)但連接單一數(shù)據(jù)庫(kù)的應(yīng)用,可以考慮Native Protocol Driver。本章將基于Native Protocol Driver類型對(duì)JDBC進(jìn)行講解JDBC的常用API11.211.2 JDBC的常用API 先定一個(gè)小目標(biāo)!了解JDBC的常用API,能夠說出JDBC 常用API的作用及其常用方法11.2 JDBC的常用APIJDBC的APIJDBC的核心就是為開發(fā)人員提供操作數(shù)據(jù)庫(kù)的Java API類庫(kù),Java程序開發(fā)人員可以利用這些類庫(kù)開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序,如創(chuàng)建數(shù)據(jù)庫(kù)連接、執(zhí)行SQL語(yǔ)句、檢索結(jié)果集、訪問數(shù)據(jù)庫(kù)元數(shù)據(jù)等。JDBC的 API主要位于java.sql包中,該包定義
8、了一系列訪問數(shù)據(jù)庫(kù)的接口和類。本節(jié)將針對(duì)java.sql包內(nèi)常用的接口和類進(jìn)行詳細(xì)講解。11.2 JDBC的常用API1. Driver接口Driver接口是所有JDBC驅(qū)動(dòng)程序必須實(shí)現(xiàn)的接口,該接口專門提供給數(shù)據(jù)庫(kù)廠商使用。需要注意的是,在編寫JDBC程序時(shí),必須要把所使用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序(這里指MySQL驅(qū)動(dòng)JAR包)或類庫(kù)加載到項(xiàng)目的classpath中。11.2 JDBC的常用API2. DriverManager類 使用JDBC連接數(shù)據(jù)庫(kù),需要用到DriverManager類,DriverManager類用于加載JDBC驅(qū)動(dòng)并且創(chuàng)建JDBC程序與數(shù)據(jù)庫(kù)的連接。在DriverManag
9、er類中,定義了兩個(gè)比較重要的靜態(tài)方法,如下所示。方法聲明功能描述registerDriver(Driverdriver)該方法用于向DriverManager中注冊(cè)給定的JDBC驅(qū)動(dòng)程序getConnection(String url,String user,String password)該方法用于建立和數(shù)據(jù)庫(kù)的連接,并返回表示連接的Connection對(duì)象11.2 JDBC的常用API3. Connection接口DriverManager類的getConnection()方法返回了一個(gè)Connection對(duì)象,Connection對(duì)象是表示數(shù)據(jù)庫(kù)連接的對(duì)象,只有獲得該連接對(duì)象,才能訪問
10、并操作數(shù)據(jù)庫(kù)。一個(gè)應(yīng)用程序可與單個(gè)數(shù)據(jù)庫(kù)建立一個(gè)或多個(gè)連接,也可以與多個(gè)數(shù)據(jù)庫(kù)建立連接。Connection接口的常用方法如下所示。11.2 JDBC的常用API方法聲明功能描述createStatement()用于創(chuàng)建一個(gè)Statement對(duì)象,Statement對(duì)象可以將SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)prepareStatement(String sql)用于創(chuàng)建一個(gè)PreparedStatement對(duì)象,該對(duì)象可以將參數(shù)化的動(dòng)態(tài)SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)prepareCall(String sql)用于創(chuàng)建一個(gè)CallableStatement對(duì)象來調(diào)用數(shù)據(jù)庫(kù)的存儲(chǔ)過程isReadOnly()用于查
11、看當(dāng)前Connection對(duì)象的讀取模式是否為只讀模式setReadOnly()用于設(shè)置當(dāng)前Connection對(duì)象的讀寫模式,默認(rèn)是非只讀模式Connection接口的常用方法:11.2 JDBC的常用API方法聲明功能描述commit()使所有上一次提交/回滾后進(jìn)行的更改成為持久更改,并釋放此Connection對(duì)象當(dāng)前持有的所有數(shù)據(jù)庫(kù)鎖setAutoCommit(boolean autoCommit)設(shè)置是否關(guān)閉自動(dòng)提交模式roolback()用于取消在當(dāng)前事務(wù)中進(jìn)行的所有更改,并釋放此Connection對(duì)象當(dāng)前持有的所有數(shù)據(jù)庫(kù)鎖close()用于立即釋放Connection對(duì)象的數(shù)據(jù)
12、庫(kù)和JDBC資源,而不是等它們被自動(dòng)釋放isClose()用于判斷Connection對(duì)象是否已被自動(dòng)關(guān)閉11.2 JDBC的常用API4. Statement接口Statement接口用于執(zhí)行靜態(tài)的SQL語(yǔ)句,并返回一個(gè)結(jié)果對(duì)象。Statement接口對(duì)象可以通過Connection實(shí)例的createStatement()方法獲得,該對(duì)象會(huì)把靜態(tài)的SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)中編譯執(zhí)行,然后返回?cái)?shù)據(jù)庫(kù)的處理結(jié)果。Statement接口提供了3個(gè)常用的執(zhí)行SQL語(yǔ)句的方法,如下所示。11.2 JDBC的常用API方法聲明功能描述execute(String sql)用于執(zhí)行各種SQL語(yǔ)句。該方法返回
13、一個(gè)boolean類型的值,如果返回值為true,表示所執(zhí)行的SQL語(yǔ)句有查詢結(jié)果,可以通過Statement的getResultSet()方法獲得查詢結(jié)果。executeUpdate(String sql)用于執(zhí)行SQL中的insert、update和delete語(yǔ)句。該方法返回一個(gè)int類型的值,表示數(shù)據(jù)庫(kù)中受該SQL語(yǔ)句影響的條數(shù)。executeQuery(String sql)用于執(zhí)行SQL中的select語(yǔ)句。該方法返回一個(gè)表示查詢結(jié)果的ResultSet對(duì)象。Statement接口常用的執(zhí)行SQL語(yǔ)句的方法:11.2 JDBC的常用API5. PreparedStatement 接
14、口PreparedStatement是Statement的子接口,用于執(zhí)行預(yù)編譯的SQL語(yǔ)句。PreparedStatement接口擴(kuò)展了帶有參數(shù)SQL語(yǔ)句的執(zhí)行操作,該接口中的SQL語(yǔ)句可以使用占位符?代替參數(shù),然后通過setter方法為SQL語(yǔ)句的參數(shù)賦值。PreparedStatement接口提供的常用方法,如下所示。11.2 JDBC的常用API方法聲明功能描述executeUpdate()在PreparedStatement對(duì)象中執(zhí)行 SQL 語(yǔ)句,SQL語(yǔ)句必須是一個(gè)DML語(yǔ)句或者是無返回內(nèi)容的SQL語(yǔ)句,如DDL語(yǔ)句。executeQuery()在PreparedStatemen
15、t對(duì)象中執(zhí)行SQL查詢,該方法返回的是ResultSet對(duì)象。setInt(intparameterIndex, intx)將指定參數(shù)設(shè)置成給定的int值。setFloat(int index,float f)將指定位置的參數(shù)設(shè)置為float值。PreparedStatement接口常用的方法:11.2 JDBC的常用API方法聲明功能描述setLong(int index,long l)將指定位置的參數(shù)設(shè)置為long值。setDouble(int index,double d)將指定位置的參數(shù)設(shè)置為double值。setBoolean(int index,boolean b)將指定位置的參數(shù)
16、設(shè)置為boolean值。void setString(int parameterIndex,String x)將指定參數(shù)設(shè)置成給定的String值。在上表中,DML(數(shù)據(jù)操縱語(yǔ)言)語(yǔ)句指的是操作數(shù)據(jù)庫(kù)、表、列等的語(yǔ)句,使用的關(guān)鍵字為CREATE、 ALTER、 DROP。DDL(數(shù)據(jù)定義語(yǔ)言)語(yǔ)句指的是對(duì)表中的數(shù)據(jù)進(jìn)行增、刪、改操作的語(yǔ)句,使用的關(guān)鍵字為INSERT 、UPDATE、 DELETE。11.2 JDBC的常用API6. ResultSet接口ResultSet接口用于保存JDBC執(zhí)行查詢時(shí)返回的結(jié)果集,該結(jié)果集封裝在一個(gè)邏輯表格中。在ResultSet接口內(nèi)部有一個(gè)指向表格數(shù)據(jù)行
17、的游標(biāo)(或指針),ResultSet對(duì)象初始化時(shí),游標(biāo)在表格的第一行之前,調(diào)用next()方法可以將游標(biāo)移動(dòng)到下一行。如果下一行沒有數(shù)據(jù),則next()方法返回false。在應(yīng)用程序中經(jīng)常使用next()方法作為while循環(huán)的條件來迭代ResultSet結(jié)果集。ResultSet接口的常用方法,如下所示。11.2 JDBC的常用API方法聲明功能描述getString(int columnIndex)用于獲取指定字段的String類型的值,參數(shù)columnIndex代表字段的索引getString(String columnName)用于獲取指定字段的String類型的值,參數(shù)columnN
18、ame代表字段的名稱getInt(int columnIndex)用于獲取指定字段的int類型的值,參數(shù)columnIndex代表字段的索引getInt(String columnName)用于獲取指定字段的int類型的值,參數(shù)columnName代表字段的名稱absolute(int row)將游標(biāo)移動(dòng)到結(jié)果集的第row條記錄relative(int row)按相對(duì)行數(shù)(正或負(fù))移動(dòng)游標(biāo)ResultSet接口常用的方法:11.2 JDBC的常用API方法聲明功能描述previous()將游標(biāo)從結(jié)果集的當(dāng)前位置移動(dòng)到上一行next()將游標(biāo)從結(jié)果集的當(dāng)前位置移動(dòng)到下一行beforeFirst(
19、)將游標(biāo)移動(dòng)到結(jié)果集的開頭(第一行之前)isBeforeFirst()判斷游標(biāo)是否位于結(jié)果集的開頭(第一行之前)afterLast()將游標(biāo)指針移動(dòng)到結(jié)果集的末尾(最后一行之后)isAfterLast()判斷游標(biāo)是否位于結(jié)果集的末尾(最后一行之后)first()將游標(biāo)移動(dòng)到結(jié)果集的第一行isFirst()判斷游標(biāo)是否位于結(jié)果集的第一行11.2 JDBC的常用API方法聲明功能描述last()將游標(biāo)移動(dòng)到結(jié)果集的最后一條記錄getRow()返回當(dāng)前記錄的行號(hào)getStatement()返回生成結(jié)果集的Statement對(duì)象close()釋放當(dāng)前結(jié)果集的數(shù)據(jù)庫(kù)和JDBC資源從表中可以看出,Resu
20、ltSet接口中定義了一些getter方法,而采用哪種getter方法獲取數(shù)據(jù)取決于字段的數(shù)據(jù)類型。程序既可以通過字段的名稱來獲取指定數(shù)據(jù),也可以通過字段的索引來獲取指定的數(shù)據(jù),字段的索引是從1開始編號(hào)的。JDBC編程11.311.3.1 JDBC編程步驟 先定一個(gè)小目標(biāo)!熟悉JDBC編程步驟,能夠說出Java程序中使用JDBC編程的步驟11.3.1 JDBC編程步驟JDBC編程步驟簡(jiǎn)述通常情況下,使用JDBC API實(shí)現(xiàn)JDBC 程序時(shí),首先需要加載并注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程 序,其次使用 DriverManager類調(diào)用getConnection()方法獲取表示數(shù)據(jù)連接的 Connection 對(duì)
21、象,最后通過 Connection對(duì)象調(diào)用相應(yīng)方法獲取Statement對(duì)象,通過Statement對(duì)象執(zhí) 行SQL語(yǔ)句。執(zhí)行SQL語(yǔ)句之后,如果數(shù)據(jù)庫(kù)有返回結(jié)果,則將結(jié)果封裝為 ResultSet對(duì)象返回。11.3.1 JDBC編程步驟JDBC編程流程圖使用JDBC的常用API實(shí)現(xiàn)JDBC程序的步驟如下所示。接下來根據(jù)流程圖,分步驟講解JDBC程序的編寫。11.3.1 JDBC編程步驟1. 加載并注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序在連接數(shù)據(jù)庫(kù)之前,要加載數(shù)據(jù)庫(kù)的驅(qū)動(dòng)到JVM(Java虛擬機(jī))。加載數(shù)據(jù)庫(kù)驅(qū)動(dòng)操作可以通過java.lang.Class類的靜態(tài)方法forName(StringclassName)
22、或DriverManager類的靜態(tài)方法registerDriver(Driver driver)實(shí)現(xiàn),具體示例如下所示:DriverManager.registerDriver(Driverdriver);或Class.forName(DriverName);11.3.1 JDBC編程步驟registDriver()和forName()方法分析:調(diào)用registDriver()方法時(shí),其實(shí)會(huì)創(chuàng)建了兩個(gè)Driver對(duì)象,對(duì)于只需加載驅(qū)動(dòng)類來講有些浪費(fèi)資源;使用forName()方法的話,驅(qū)動(dòng)程序類的名稱是以字符串的形式填寫,使用時(shí)可以把該驅(qū)動(dòng)類名稱放到配置文件中,如果需要切換驅(qū)動(dòng)類會(huì)非常方便。
23、所以在實(shí)際開發(fā)中,常調(diào)用forName()方法注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)。11.3.1 JDBC編程步驟forName()方法的參數(shù)DriverName:表示數(shù)據(jù)庫(kù)的驅(qū)動(dòng)類。以MySQL數(shù)據(jù)庫(kù)為例,MySQL驅(qū)動(dòng)類在MySQL 6.0.2版本之前是com.mysql.jdbc.Driver,加載示例代碼如下所示:forName(com.mysql.jdbc.Driver);而在MySQL 6.0.2版本之后,MySQL驅(qū)動(dòng)類是com.mysql.cj.jdbc.Driver,加載示例代碼如下所示:forName(com.mysql.cj.jdbc.Driver);11.3.1 JDBC編程步驟2. 通過D
24、riverManager獲取數(shù)據(jù)庫(kù)連接DriverManager類的getConnection()方法用于獲取JDBC驅(qū)動(dòng)程序到數(shù)據(jù)庫(kù)的連接,通過DriverManager類獲取數(shù)據(jù)庫(kù)連接的具體方式如下:Connection conn = DriverManager.getConnection(String url, String user, String pwd); 從上述代碼可以看出,getConnection()方法有3個(gè)參數(shù),分別表示連接數(shù)據(jù)庫(kù)的URL、登錄數(shù)據(jù)庫(kù)的用戶名和登錄數(shù)據(jù)庫(kù)的密碼。11.3.1 JDBC編程步驟getConnection()方法的參數(shù) 數(shù)據(jù)庫(kù)連接地址URL書寫
25、格式:以MySQL數(shù)據(jù)庫(kù)為例,MySQL數(shù)據(jù)庫(kù)地址的書寫格式如下所示:jdbc:mysql:/hostname:port/databasename在上面代碼中,jdbc:mysql:是固定的寫法,后面的hostname指的是主機(jī)的名稱,port指的是連接數(shù)據(jù)庫(kù)的端口號(hào)(MySQL端口號(hào)默認(rèn)為3306),databasename指的是MySQL中相應(yīng)數(shù)據(jù)庫(kù)的名稱。11.3.1 JDBC編程步驟3. 通過Connection對(duì)象獲取Statement對(duì)象獲取Connetction對(duì)象之后,還必須要?jiǎng)?chuàng)建一個(gè)Statement對(duì)象,將各種SQL語(yǔ)句發(fā)送到所連接的數(shù)據(jù)庫(kù)中執(zhí)行。如果把Connection
26、對(duì)象看作一條連接程序和數(shù)據(jù)庫(kù)的索道,那么Statement對(duì)象就可以看作是索道上的一輛纜車,它為數(shù)據(jù)庫(kù)傳輸SQL語(yǔ)句,并返回執(zhí)行結(jié)果。11.3.1 JDBC編程步驟(1)createStatement():創(chuàng)建基本的Statement對(duì)象。(2)prepareStatement():根據(jù)傳遞的SQL語(yǔ)句創(chuàng)建PreparedStatement對(duì)象。(3)prepareCall():根據(jù)傳入的SQL語(yǔ)句創(chuàng)建CallableStatement對(duì)象。以創(chuàng)建基本的Statement對(duì)象為例,創(chuàng)建方式如下:Statement stmt = conn.createStatement();Connection
27、創(chuàng)建Statement對(duì)象的方法:11.3.1 JDBC編程步驟4. 使用Statement執(zhí)行SQL語(yǔ)句創(chuàng)建了Statement對(duì)象后,就可以通過該對(duì)象執(zhí)行SQL語(yǔ)句。如果SQL語(yǔ)句運(yùn)行后產(chǎn)生了結(jié)果集,Statement對(duì)象會(huì)將結(jié)果集封裝成ResultSet對(duì)象并返回。Statement有以下3個(gè)執(zhí)行SQL語(yǔ)句的方法。execute():可以執(zhí)行任何SQL語(yǔ)句。executeQuery():通常執(zhí)行查詢語(yǔ)句,執(zhí)行后返回代表結(jié)果集的ResultSet對(duì)象。executeUpdate():主要用于執(zhí)行DML語(yǔ)句和DDL語(yǔ)句。執(zhí)行DML語(yǔ)句,如INSERT、UPDATE或DELETE時(shí),返回受SQ
28、L語(yǔ)句影響的行數(shù);執(zhí)行DDL語(yǔ)句返回0。11.3.1 JDBC編程步驟5. 操作結(jié)果集如果執(zhí)行的SQL語(yǔ)句是查詢語(yǔ)句,執(zhí)行結(jié)果將返回一個(gè)ResultSet對(duì)象,該對(duì)象保存了SQL語(yǔ)句查詢的結(jié)果。程序可以通過操作該ResultSet對(duì)象取出查詢結(jié)果。11.3.1 JDBC編程步驟6. 關(guān)閉連接,釋放資源每次操作數(shù)據(jù)庫(kù)結(jié)束后都要關(guān)閉數(shù)據(jù)庫(kù)連接并釋放資源,以防止系統(tǒng)資源浪費(fèi)。資源的關(guān)閉順序和聲明順序相反,關(guān)閉順序依次為關(guān)閉結(jié)果集對(duì)象ResultSet、關(guān)閉Statement對(duì)象、關(guān)閉Connection對(duì)象。為了保證在異常情況下也能關(guān)閉資源,通常在try.catch語(yǔ)句的finally代碼塊中統(tǒng)一關(guān)
29、閉資源。11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序 先定一個(gè)小目標(biāo)!掌握實(shí)現(xiàn)第一個(gè)JDBC程序,能夠獨(dú)立編寫JDBC程序操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序講解了JDBC程序的大致實(shí)現(xiàn)步驟后,下面編寫一個(gè)JDBC程序,該程序要求從users表中讀取數(shù)據(jù),并將結(jié)果輸出到控制臺(tái)。因?yàn)镴ava中的JDBC是用來連接數(shù)據(jù)庫(kù)從而執(zhí)行相關(guān)數(shù)據(jù)相關(guān)操作的,因此在使用JDBC時(shí),一定要確保安裝有數(shù)據(jù)庫(kù)。常用的關(guān)系型數(shù)據(jù)庫(kù)有MySQL和Oracle,下面以連接MySQL數(shù)據(jù)庫(kù)為例,使用JDBC執(zhí)行相關(guān)操作。程序的具體實(shí)現(xiàn)步驟如下所示。11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序(1)搭建數(shù)據(jù)庫(kù)環(huán)境在MySQ
30、L中創(chuàng)建一個(gè)名稱為jdbc的數(shù)據(jù)庫(kù),然后在jdbc數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)users表,創(chuàng)建數(shù)據(jù)庫(kù)和表的SQL語(yǔ)句如下所示:CREATE DATABASE jdbc;USE jdbc;CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(40),password VARCHAR(40),email VARCHAR(60),birthday DATE );11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序jdbc數(shù)據(jù)庫(kù)和users表創(chuàng)建成功后,再向users表中插入3條數(shù)據(jù),插入的SQL語(yǔ)句如下所示:INSERT INTO users(NA
31、ME,PASSWORD,email,birthday) VALUES(zhangs,123456,zs,1980-12-04),(lisi,123456,lisi,1981-12-04),(wangwu,123456,wangwu,1979-12-04);11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序(2)創(chuàng)建項(xiàng)目環(huán)境,導(dǎo)入數(shù)據(jù)庫(kù)驅(qū)動(dòng)在IDEA中新建一個(gè)名稱為chapter11的Java項(xiàng)目,右擊項(xiàng)目名稱,在彈出的快捷菜單中選 擇 NewDirectory命令,在彈出的對(duì)話框中將該目錄命名為lib,項(xiàng)目根目錄中就會(huì)出現(xiàn)一 個(gè)名稱為lib的目錄。11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序添加MySQL 的JAR
32、包:將下載好的Jar包復(fù)制到項(xiàng)目的lib目錄中,并把Jar包添加到項(xiàng)目里。在IDEA菜單欄單擊File,選擇“Project Structure”“Modules”“Dependencies”,單擊最右側(cè)加號(hào)后選擇第一項(xiàng):JARs or directories,在彈出框中選擇下載好的Jar包確認(rèn)。最后可以看到mysql-connector-java-8.0.15.jar包添加到IDEA的依賴項(xiàng)中。11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序加入數(shù)據(jù)庫(kù)驅(qū)動(dòng)后的項(xiàng)目結(jié)構(gòu):在上圖中,mysql-connector-java-8.0.15.jar包添加到依賴項(xiàng)之后,單擊“Apply”按鈕后再單擊“OK”按鈕,
33、可以看到在External libraries下已經(jīng)存在剛剛添加的jar包。至此,Jar包添加成功??梢詮挠疫叺膱D中查看加入數(shù)據(jù)庫(kù)驅(qū)動(dòng)后的項(xiàng)目結(jié)構(gòu)。11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序案例演示:(3)編寫JDBC程序在項(xiàng)目chapter11的src目錄下,新建一個(gè)名稱為com.itheima.jdbc.example的包,在該包中創(chuàng)建類Example01,Example01類用于讀取數(shù)據(jù)庫(kù)中的users表,并將結(jié)果輸出到控制臺(tái)。具體實(shí)現(xiàn)步驟如下所示。11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序步驟一:注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng),通過DriverManager獲取數(shù)據(jù)庫(kù)連接,通過Connection對(duì)象獲取Stat
34、ement對(duì)象。代碼如下所示:Statement stmt = null;ResultSet rs = null;Connection conn = null; / 1. 注冊(cè)數(shù)據(jù)庫(kù)的驅(qū)動(dòng) Class.forName(com.mysql.cj.jdbc.Driver); / 2.通過DriverManager獲取數(shù)據(jù)庫(kù)連接 String url = jdbc:mysql:/localhost:3306/jdbc+ ?serverTimezone=GMT%2B8&useSSL=false; String username = root; /數(shù)據(jù)庫(kù)用戶名 String password = roo
35、t; /數(shù)據(jù)庫(kù)密碼 conn = DriverManager.getConnection(url, username, password); / 3.通過Connection對(duì)象獲取Statement對(duì)象 stmt = conn.createStatement();11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序步驟二:使用Statement執(zhí)行SQL語(yǔ)句,操作ResultSet結(jié)果集。代碼如下所示: / 4.使用Statement執(zhí)行SQL語(yǔ)句 String sql = select * from users; rs = stmt.executeQuery(sql); / 5. 操作ResultSet結(jié)
36、果集 System.out.println(id| name | password | email | birthday); while (rs.next() int id = rs.getInt(id); / 通過列名獲取指定字段的值 String name = rs.getString(name); String psw = rs.getString(password); String email = rs.getString(email); Date birthday = rs.getDate(birthday); System.out.println(id + | + name + |
37、 + psw + | + email + | + birthday); 11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序步驟三:回收數(shù)據(jù)庫(kù)資源。代碼如下所示: / 6.回收數(shù)據(jù)庫(kù)資源 if (rs != null) try rs.close(); catch (SQLException e) e.printStackTrace(); rs = null; if (stmt != null) try stmt.close(); catch (SQLException e) e.printStackTrace(); stmt = null; if (conn != null) try conn.close()
38、; catch (SQLException e) e.printStackTrace(); conn = null; 11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序步驟四:定義main()方法,定義try.catch.finally代碼塊,把步驟一和步驟二的代碼寫在try塊中,把步驟三的代碼寫在finally塊中。11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序運(yùn)行代碼,控制臺(tái)顯示的運(yùn)行結(jié)果如下圖所示。從圖中可以看到,users表中的數(shù)據(jù)已被輸出到了控制臺(tái)。至此,第一個(gè)JDBC程序?qū)崿F(xiàn)成功。11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序?qū)崿F(xiàn)JDBC入門程序時(shí)的注意事項(xiàng):1. 注冊(cè)驅(qū)動(dòng)程序雖然使用DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()方法也可以完成注冊(cè),但這種方式會(huì)使數(shù)據(jù)庫(kù)驅(qū)動(dòng)被注冊(cè)兩次。因?yàn)樵贒river類的源碼中,已經(jīng)在靜態(tài)代碼塊中完成了數(shù)據(jù)庫(kù)驅(qū)動(dòng)的注冊(cè)。為了避免數(shù)據(jù)庫(kù)驅(qū)動(dòng)被重復(fù)注冊(cè),在程序中使用Class.forName()方法加載驅(qū)動(dòng)類即可。11.3.2 實(shí)現(xiàn)第一個(gè)JDBC程序2. 釋放資源由于數(shù)據(jù)庫(kù)資源非常寶貴,數(shù)據(jù)庫(kù)允許的并發(fā)訪問連接數(shù)量有限,因此,當(dāng)數(shù)據(jù)庫(kù)資源使用完畢后,一定要釋放資源。為了保證資源的釋放,在Java程序中應(yīng)該將釋放資源的操作放在finally代碼塊中。11.3.2 實(shí)現(xiàn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河蟹收購(gòu)合同范本
- 幼兒園六一串詞范文
- 醫(yī)藥研發(fā)合同范本
- 現(xiàn)代辦公空間綠色裝修設(shè)計(jì)環(huán)保與美觀并重
- 醫(yī)院代管合同范本
- 無錫師承合同范本
- 同城包車合同范本
- 2025-2030年中國(guó)理蓋放蓋機(jī)市場(chǎng)運(yùn)行態(tài)勢(shì)及發(fā)展前景調(diào)研報(bào)告
- 2025-2030年中國(guó)豬肉制品市場(chǎng)發(fā)展?fàn)顩r與投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)燙衣板市場(chǎng)現(xiàn)狀調(diào)研及投資發(fā)展?jié)摿Ψ治鰣?bào)告
- 【道法】開學(xué)第一課 課件-2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)下冊(cè)
- 中華民族共同體概論專家講座第一講中華民族共同體基礎(chǔ)理論
- 2023年浙江省統(tǒng)招專升本考試英語(yǔ)真題及答案解析
- GB 9706.202-2021醫(yī)用電氣設(shè)備第2-2部分:高頻手術(shù)設(shè)備及高頻附件的基本安全和基本性能專用要求
- AUMA澳瑪執(zhí)行器內(nèi)部培訓(xùn)課件
- 加強(qiáng)營(yíng)房管理的對(duì)策
- M系列警報(bào)明細(xì)表復(fù)習(xí)課程
- 施工隊(duì)結(jié)算單
- 關(guān)于對(duì)項(xiàng)目管理的獎(jiǎng)懲制度
- A320主起落架收放原理分析及運(yùn)動(dòng)仿真
- 植筋施工方案(二標(biāo))
評(píng)論
0/150
提交評(píng)論