![第11章 JDBCJava基礎(chǔ)入門(第3版)_第1頁](http://file4.renrendoc.com/view/ec9f276e3b9f61539deef0bd63101bd5/ec9f276e3b9f61539deef0bd63101bd51.gif)
![第11章 JDBCJava基礎(chǔ)入門(第3版)_第2頁](http://file4.renrendoc.com/view/ec9f276e3b9f61539deef0bd63101bd5/ec9f276e3b9f61539deef0bd63101bd52.gif)
![第11章 JDBCJava基礎(chǔ)入門(第3版)_第3頁](http://file4.renrendoc.com/view/ec9f276e3b9f61539deef0bd63101bd5/ec9f276e3b9f61539deef0bd63101bd53.gif)
![第11章 JDBCJava基礎(chǔ)入門(第3版)_第4頁](http://file4.renrendoc.com/view/ec9f276e3b9f61539deef0bd63101bd5/ec9f276e3b9f61539deef0bd63101bd54.gif)
![第11章 JDBCJava基礎(chǔ)入門(第3版)_第5頁](http://file4.renrendoc.com/view/ec9f276e3b9f61539deef0bd63101bd5/ec9f276e3b9f61539deef0bd63101bd55.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第11章 JDBCJava基礎(chǔ)入門(第3版)學習目標/Target了解JDBC的常用API,能夠說出JDBC 常用API的作用及其常用方法掌握JDBC入門程序的編寫,能夠獨立編寫JDBC程序操作數(shù)據(jù)庫中的數(shù)據(jù)了解什么是JDBC,能夠說出JDBC的概念和特點章節(jié)概述/ Summary在軟件開發(fā)過程中,經(jīng)常要使用數(shù)據(jù)庫存儲和管理數(shù)據(jù)。為了在Java中提供對數(shù)據(jù)庫訪問的支持,SUN公司于1996年提供了一套訪問數(shù)據(jù)庫的標準Java類庫,即JDBC。本章將主要圍繞什么是JDBC、JDBC的常用API、JDBC入門程序等知識進行詳細地講解。目錄/Contents010203什么是JDBCJDBC的常用A
2、PIJDBC編程什么是JDBC11.111.1.1 JDBC概述 先定一個小目標!了解JDBCJDBC的概念和特點,能夠說出JDBC的概念和特點11.1.1 JDBC概述JDBC的全稱是Java數(shù)據(jù)庫連接(Java Database Connectivity),它是一套用于執(zhí)行SQL語句的Java API。應(yīng)用程序可通過這套Java API連接到關(guān)系數(shù)據(jù)庫,并使用SQL語句完成對數(shù)據(jù)庫中數(shù)據(jù)的查詢、新增、更新和刪除等操作。使用JDBC連接數(shù)據(jù)庫驅(qū)動,用戶就不必用戶不必編寫Java程序與數(shù)據(jù)庫交互的底層代碼,使得代碼的通用性更強。JDBC介紹11.1.1 JDBC概述應(yīng)用程序使用JDBC訪問數(shù)據(jù)
3、庫的方式由左圖可知,不同的數(shù)據(jù)庫需要使用不同的JDBC驅(qū)動進行連接,例如,訪問MySQL數(shù)據(jù)庫需要使用MySQL驅(qū)動,訪問Oracle數(shù)據(jù)庫需要使用Oracle驅(qū)動。而JDBC在應(yīng)用程序與數(shù)據(jù)庫之間起到了一個橋梁作用。應(yīng)用程序與數(shù)據(jù)庫連接成功后即可對數(shù)據(jù)庫進行相應(yīng)的操作。11.1.2 JDBC驅(qū)動程序 先定一個小目標!了解JDBC驅(qū)動程序,能夠說出4種常見的JDBC驅(qū)動程序11.1.2 JDBC驅(qū)動程序JDBC驅(qū)動程序分類JDBC本身提供的是一套數(shù)據(jù)庫操作標準,而JDBC中提供的這些標準又需要各個數(shù)據(jù)庫廠商實現(xiàn),針對每一個數(shù)據(jù)庫而言,每一個數(shù)據(jù)庫廠商都會為其數(shù)據(jù)庫產(chǎn)品提供一個JDBC的驅(qū)動程序
4、,目前比較常見的JDBC驅(qū)動程序可以分為以下4類。11.1.2 JDBC驅(qū)動程序1. JDBC-ODBC橋驅(qū)動程序JDBC-ODBC橋驅(qū)動程序由SUN公司開發(fā),是JDK提供的數(shù)據(jù)庫操作標準API,這種類型的驅(qū)動實際是把所有 JDBC的調(diào)用傳遞給ODBC(Open Database Connectivity,開發(fā)數(shù)據(jù)庫連接),再由ODBC調(diào)用本地數(shù)據(jù)庫驅(qū)動代碼,操作數(shù)據(jù)庫中的數(shù)據(jù)。通過JDBC-ODBC橋驅(qū)動操作數(shù)據(jù)庫的方式如下所示:由于JDBC-ODBC橋驅(qū)動程序經(jīng)過幾次中間調(diào)用,所以執(zhí)行效率比較低。11.1.2 JDBC驅(qū)動程序2. 本地API驅(qū)動程序本地API驅(qū)動直接將JDBC API 映
5、射成數(shù)據(jù)庫特定的客戶端API。這種驅(qū)動包含特定數(shù)據(jù)庫的本地API,通過它可以訪問數(shù)據(jù)庫的客戶端。通過本地API驅(qū)動操作數(shù)據(jù)庫的方式如下所示:通過本地 API驅(qū)動程序訪問數(shù)據(jù)庫減少了ODBC的調(diào)用環(huán)節(jié),提高了數(shù)據(jù)庫訪問的效率。11.1.2 JDBC驅(qū)動程序3. 網(wǎng)絡(luò)協(xié)議驅(qū)動程序網(wǎng)絡(luò)協(xié)議驅(qū)動是用純Java語言編寫的,JDBC把對數(shù)據(jù)庫的訪問請求傳遞給網(wǎng)絡(luò)上的中間件服務(wù)器,中間件服務(wù)器先把請求轉(zhuǎn)換為數(shù)據(jù)庫通信協(xié)議請求,然后再通過中間件服務(wù)器與數(shù)據(jù)庫進行交互。使用這種類型驅(qū)動程序的Java應(yīng)用程序可以與服務(wù)器端完全分離,具有很大的靈活性。通過網(wǎng)絡(luò)協(xié)議驅(qū)動操作數(shù)據(jù)庫的方式:11.1.2 JDBC驅(qū)動程序
6、4. 本地協(xié)議驅(qū)動本地協(xié)議驅(qū)動是用使用純Java語言編寫的。本地協(xié)議驅(qū)動通常由數(shù)據(jù)庫廠商直接提供驅(qū)動的JAR包,本地協(xié)議驅(qū)動程序直接將JDBC調(diào)用轉(zhuǎn)換為數(shù)據(jù)庫特定的網(wǎng)絡(luò)通信協(xié) 議,然后與數(shù)據(jù)庫進行交互。通過本地協(xié)議驅(qū)動操作數(shù)據(jù)庫的方式:11.1.2 JDBC驅(qū)動程序上述4種類型中,JDBC-ODBC橋驅(qū)動程序由于執(zhí)行效率不高,更適合開發(fā)應(yīng)用時的一種過渡方案; 如果是在內(nèi)聯(lián)網(wǎng)(Intranet)的應(yīng)用,可以考慮本地API 驅(qū)動程序;如果是基于互聯(lián)網(wǎng)(Internet)并且需要同時連接多個不同種類的數(shù)據(jù)庫, 并發(fā)連接要求高的應(yīng)用,可以考慮JDBC-Net Driver。如果是基于互聯(lián)網(wǎng)(Inter
7、net)但連接單一數(shù)據(jù)庫的應(yīng)用,可以考慮Native Protocol Driver。本章將基于Native Protocol Driver類型對JDBC進行講解JDBC的常用API11.211.2 JDBC的常用API 先定一個小目標!了解JDBC的常用API,能夠說出JDBC 常用API的作用及其常用方法11.2 JDBC的常用APIJDBC的APIJDBC的核心就是為開發(fā)人員提供操作數(shù)據(jù)庫的Java API類庫,Java程序開發(fā)人員可以利用這些類庫開發(fā)數(shù)據(jù)庫應(yīng)用程序,如創(chuàng)建數(shù)據(jù)庫連接、執(zhí)行SQL語句、檢索結(jié)果集、訪問數(shù)據(jù)庫元數(shù)據(jù)等。JDBC的 API主要位于java.sql包中,該包定義
8、了一系列訪問數(shù)據(jù)庫的接口和類。本節(jié)將針對java.sql包內(nèi)常用的接口和類進行詳細講解。11.2 JDBC的常用API1. Driver接口Driver接口是所有JDBC驅(qū)動程序必須實現(xiàn)的接口,該接口專門提供給數(shù)據(jù)庫廠商使用。需要注意的是,在編寫JDBC程序時,必須要把所使用的數(shù)據(jù)庫驅(qū)動程序(這里指MySQL驅(qū)動JAR包)或類庫加載到項目的classpath中。11.2 JDBC的常用API2. DriverManager類 使用JDBC連接數(shù)據(jù)庫,需要用到DriverManager類,DriverManager類用于加載JDBC驅(qū)動并且創(chuàng)建JDBC程序與數(shù)據(jù)庫的連接。在DriverManag
9、er類中,定義了兩個比較重要的靜態(tài)方法,如下所示。方法聲明功能描述registerDriver(Driverdriver)該方法用于向DriverManager中注冊給定的JDBC驅(qū)動程序getConnection(String url,String user,String password)該方法用于建立和數(shù)據(jù)庫的連接,并返回表示連接的Connection對象11.2 JDBC的常用API3. Connection接口DriverManager類的getConnection()方法返回了一個Connection對象,Connection對象是表示數(shù)據(jù)庫連接的對象,只有獲得該連接對象,才能訪問
10、并操作數(shù)據(jù)庫。一個應(yīng)用程序可與單個數(shù)據(jù)庫建立一個或多個連接,也可以與多個數(shù)據(jù)庫建立連接。Connection接口的常用方法如下所示。11.2 JDBC的常用API方法聲明功能描述createStatement()用于創(chuàng)建一個Statement對象,Statement對象可以將SQL語句發(fā)送到數(shù)據(jù)庫prepareStatement(String sql)用于創(chuàng)建一個PreparedStatement對象,該對象可以將參數(shù)化的動態(tài)SQL語句發(fā)送到數(shù)據(jù)庫prepareCall(String sql)用于創(chuàng)建一個CallableStatement對象來調(diào)用數(shù)據(jù)庫的存儲過程isReadOnly()用于查
11、看當前Connection對象的讀取模式是否為只讀模式setReadOnly()用于設(shè)置當前Connection對象的讀寫模式,默認是非只讀模式Connection接口的常用方法:11.2 JDBC的常用API方法聲明功能描述commit()使所有上一次提交/回滾后進行的更改成為持久更改,并釋放此Connection對象當前持有的所有數(shù)據(jù)庫鎖setAutoCommit(boolean autoCommit)設(shè)置是否關(guān)閉自動提交模式roolback()用于取消在當前事務(wù)中進行的所有更改,并釋放此Connection對象當前持有的所有數(shù)據(jù)庫鎖close()用于立即釋放Connection對象的數(shù)據(jù)
12、庫和JDBC資源,而不是等它們被自動釋放isClose()用于判斷Connection對象是否已被自動關(guān)閉11.2 JDBC的常用API4. Statement接口Statement接口用于執(zhí)行靜態(tài)的SQL語句,并返回一個結(jié)果對象。Statement接口對象可以通過Connection實例的createStatement()方法獲得,該對象會把靜態(tài)的SQL語句發(fā)送到數(shù)據(jù)庫中編譯執(zhí)行,然后返回數(shù)據(jù)庫的處理結(jié)果。Statement接口提供了3個常用的執(zhí)行SQL語句的方法,如下所示。11.2 JDBC的常用API方法聲明功能描述execute(String sql)用于執(zhí)行各種SQL語句。該方法返回
13、一個boolean類型的值,如果返回值為true,表示所執(zhí)行的SQL語句有查詢結(jié)果,可以通過Statement的getResultSet()方法獲得查詢結(jié)果。executeUpdate(String sql)用于執(zhí)行SQL中的insert、update和delete語句。該方法返回一個int類型的值,表示數(shù)據(jù)庫中受該SQL語句影響的條數(shù)。executeQuery(String sql)用于執(zhí)行SQL中的select語句。該方法返回一個表示查詢結(jié)果的ResultSet對象。Statement接口常用的執(zhí)行SQL語句的方法:11.2 JDBC的常用API5. PreparedStatement 接
14、口PreparedStatement是Statement的子接口,用于執(zhí)行預(yù)編譯的SQL語句。PreparedStatement接口擴展了帶有參數(shù)SQL語句的執(zhí)行操作,該接口中的SQL語句可以使用占位符?代替參數(shù),然后通過setter方法為SQL語句的參數(shù)賦值。PreparedStatement接口提供的常用方法,如下所示。11.2 JDBC的常用API方法聲明功能描述executeUpdate()在PreparedStatement對象中執(zhí)行 SQL 語句,SQL語句必須是一個DML語句或者是無返回內(nèi)容的SQL語句,如DDL語句。executeQuery()在PreparedStatemen
15、t對象中執(zhí)行SQL查詢,該方法返回的是ResultSet對象。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ù)操縱語言)語句指的是操作數(shù)據(jù)庫、表、列等的語句,使用的關(guān)鍵字為CREATE、 ALTER、 DROP。DDL(數(shù)據(jù)定義語言)語句指的是對表中的數(shù)據(jù)進行增、刪、改操作的語句,使用的關(guān)鍵字為INSERT 、UPDATE、 DELETE。11.2 JDBC的常用API6. ResultSet接口ResultSet接口用于保存JDBC執(zhí)行查詢時返回的結(jié)果集,該結(jié)果集封裝在一個邏輯表格中。在ResultSet接口內(nèi)部有一個指向表格數(shù)據(jù)行
17、的游標(或指針),ResultSet對象初始化時,游標在表格的第一行之前,調(diào)用next()方法可以將游標移動到下一行。如果下一行沒有數(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)將游標移動到結(jié)果集的第row條記錄relative(int row)按相對行數(shù)(正或負)移動游標ResultSet接口常用的方法:11.2 JDBC的常用API方法聲明功能描述previous()將游標從結(jié)果集的當前位置移動到上一行next()將游標從結(jié)果集的當前位置移動到下一行beforeFirst(
19、)將游標移動到結(jié)果集的開頭(第一行之前)isBeforeFirst()判斷游標是否位于結(jié)果集的開頭(第一行之前)afterLast()將游標指針移動到結(jié)果集的末尾(最后一行之后)isAfterLast()判斷游標是否位于結(jié)果集的末尾(最后一行之后)first()將游標移動到結(jié)果集的第一行isFirst()判斷游標是否位于結(jié)果集的第一行11.2 JDBC的常用API方法聲明功能描述last()將游標移動到結(jié)果集的最后一條記錄getRow()返回當前記錄的行號getStatement()返回生成結(jié)果集的Statement對象close()釋放當前結(jié)果集的數(shù)據(jù)庫和JDBC資源從表中可以看出,Resu
20、ltSet接口中定義了一些getter方法,而采用哪種getter方法獲取數(shù)據(jù)取決于字段的數(shù)據(jù)類型。程序既可以通過字段的名稱來獲取指定數(shù)據(jù),也可以通過字段的索引來獲取指定的數(shù)據(jù),字段的索引是從1開始編號的。JDBC編程11.311.3.1 JDBC編程步驟 先定一個小目標!熟悉JDBC編程步驟,能夠說出Java程序中使用JDBC編程的步驟11.3.1 JDBC編程步驟JDBC編程步驟簡述通常情況下,使用JDBC API實現(xiàn)JDBC 程序時,首先需要加載并注冊數(shù)據(jù)庫驅(qū)動程 序,其次使用 DriverManager類調(diào)用getConnection()方法獲取表示數(shù)據(jù)連接的 Connection 對
21、象,最后通過 Connection對象調(diào)用相應(yīng)方法獲取Statement對象,通過Statement對象執(zhí) 行SQL語句。執(zhí)行SQL語句之后,如果數(shù)據(jù)庫有返回結(jié)果,則將結(jié)果封裝為 ResultSet對象返回。11.3.1 JDBC編程步驟JDBC編程流程圖使用JDBC的常用API實現(xiàn)JDBC程序的步驟如下所示。接下來根據(jù)流程圖,分步驟講解JDBC程序的編寫。11.3.1 JDBC編程步驟1. 加載并注冊數(shù)據(jù)庫驅(qū)動程序在連接數(shù)據(jù)庫之前,要加載數(shù)據(jù)庫的驅(qū)動到JVM(Java虛擬機)。加載數(shù)據(jù)庫驅(qū)動操作可以通過java.lang.Class類的靜態(tài)方法forName(StringclassName)
22、或DriverManager類的靜態(tài)方法registerDriver(Driver driver)實現(xiàn),具體示例如下所示:DriverManager.registerDriver(Driverdriver);或Class.forName(DriverName);11.3.1 JDBC編程步驟registDriver()和forName()方法分析:調(diào)用registDriver()方法時,其實會創(chuàng)建了兩個Driver對象,對于只需加載驅(qū)動類來講有些浪費資源;使用forName()方法的話,驅(qū)動程序類的名稱是以字符串的形式填寫,使用時可以把該驅(qū)動類名稱放到配置文件中,如果需要切換驅(qū)動類會非常方便。
23、所以在實際開發(fā)中,常調(diào)用forName()方法注冊數(shù)據(jù)庫驅(qū)動。11.3.1 JDBC編程步驟forName()方法的參數(shù)DriverName:表示數(shù)據(jù)庫的驅(qū)動類。以MySQL數(shù)據(jù)庫為例,MySQL驅(qū)動類在MySQL 6.0.2版本之前是com.mysql.jdbc.Driver,加載示例代碼如下所示:forName(com.mysql.jdbc.Driver);而在MySQL 6.0.2版本之后,MySQL驅(qū)動類是com.mysql.cj.jdbc.Driver,加載示例代碼如下所示:forName(com.mysql.cj.jdbc.Driver);11.3.1 JDBC編程步驟2. 通過D
24、riverManager獲取數(shù)據(jù)庫連接DriverManager類的getConnection()方法用于獲取JDBC驅(qū)動程序到數(shù)據(jù)庫的連接,通過DriverManager類獲取數(shù)據(jù)庫連接的具體方式如下:Connection conn = DriverManager.getConnection(String url, String user, String pwd); 從上述代碼可以看出,getConnection()方法有3個參數(shù),分別表示連接數(shù)據(jù)庫的URL、登錄數(shù)據(jù)庫的用戶名和登錄數(shù)據(jù)庫的密碼。11.3.1 JDBC編程步驟getConnection()方法的參數(shù) 數(shù)據(jù)庫連接地址URL書寫
25、格式:以MySQL數(shù)據(jù)庫為例,MySQL數(shù)據(jù)庫地址的書寫格式如下所示:jdbc:mysql:/hostname:port/databasename在上面代碼中,jdbc:mysql:是固定的寫法,后面的hostname指的是主機的名稱,port指的是連接數(shù)據(jù)庫的端口號(MySQL端口號默認為3306),databasename指的是MySQL中相應(yīng)數(shù)據(jù)庫的名稱。11.3.1 JDBC編程步驟3. 通過Connection對象獲取Statement對象獲取Connetction對象之后,還必須要創(chuàng)建一個Statement對象,將各種SQL語句發(fā)送到所連接的數(shù)據(jù)庫中執(zhí)行。如果把Connection
26、對象看作一條連接程序和數(shù)據(jù)庫的索道,那么Statement對象就可以看作是索道上的一輛纜車,它為數(shù)據(jù)庫傳輸SQL語句,并返回執(zhí)行結(jié)果。11.3.1 JDBC編程步驟(1)createStatement():創(chuàng)建基本的Statement對象。(2)prepareStatement():根據(jù)傳遞的SQL語句創(chuàng)建PreparedStatement對象。(3)prepareCall():根據(jù)傳入的SQL語句創(chuàng)建CallableStatement對象。以創(chuàng)建基本的Statement對象為例,創(chuàng)建方式如下:Statement stmt = conn.createStatement();Connection
27、創(chuàng)建Statement對象的方法:11.3.1 JDBC編程步驟4. 使用Statement執(zhí)行SQL語句創(chuàng)建了Statement對象后,就可以通過該對象執(zhí)行SQL語句。如果SQL語句運行后產(chǎn)生了結(jié)果集,Statement對象會將結(jié)果集封裝成ResultSet對象并返回。Statement有以下3個執(zhí)行SQL語句的方法。execute():可以執(zhí)行任何SQL語句。executeQuery():通常執(zhí)行查詢語句,執(zhí)行后返回代表結(jié)果集的ResultSet對象。executeUpdate():主要用于執(zhí)行DML語句和DDL語句。執(zhí)行DML語句,如INSERT、UPDATE或DELETE時,返回受SQ
28、L語句影響的行數(shù);執(zhí)行DDL語句返回0。11.3.1 JDBC編程步驟5. 操作結(jié)果集如果執(zhí)行的SQL語句是查詢語句,執(zhí)行結(jié)果將返回一個ResultSet對象,該對象保存了SQL語句查詢的結(jié)果。程序可以通過操作該ResultSet對象取出查詢結(jié)果。11.3.1 JDBC編程步驟6. 關(guān)閉連接,釋放資源每次操作數(shù)據(jù)庫結(jié)束后都要關(guān)閉數(shù)據(jù)庫連接并釋放資源,以防止系統(tǒng)資源浪費。資源的關(guān)閉順序和聲明順序相反,關(guān)閉順序依次為關(guān)閉結(jié)果集對象ResultSet、關(guān)閉Statement對象、關(guān)閉Connection對象。為了保證在異常情況下也能關(guān)閉資源,通常在try.catch語句的finally代碼塊中統(tǒng)一關(guān)
29、閉資源。11.3.2 實現(xiàn)第一個JDBC程序 先定一個小目標!掌握實現(xiàn)第一個JDBC程序,能夠獨立編寫JDBC程序操作數(shù)據(jù)庫中的數(shù)據(jù)11.3.2 實現(xiàn)第一個JDBC程序講解了JDBC程序的大致實現(xiàn)步驟后,下面編寫一個JDBC程序,該程序要求從users表中讀取數(shù)據(jù),并將結(jié)果輸出到控制臺。因為Java中的JDBC是用來連接數(shù)據(jù)庫從而執(zhí)行相關(guān)數(shù)據(jù)相關(guān)操作的,因此在使用JDBC時,一定要確保安裝有數(shù)據(jù)庫。常用的關(guān)系型數(shù)據(jù)庫有MySQL和Oracle,下面以連接MySQL數(shù)據(jù)庫為例,使用JDBC執(zhí)行相關(guān)操作。程序的具體實現(xiàn)步驟如下所示。11.3.2 實現(xiàn)第一個JDBC程序(1)搭建數(shù)據(jù)庫環(huán)境在MySQ
30、L中創(chuàng)建一個名稱為jdbc的數(shù)據(jù)庫,然后在jdbc數(shù)據(jù)庫中創(chuàng)建一個users表,創(chuàng)建數(shù)據(jù)庫和表的SQL語句如下所示: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 實現(xiàn)第一個JDBC程序jdbc數(shù)據(jù)庫和users表創(chuàng)建成功后,再向users表中插入3條數(shù)據(jù),插入的SQL語句如下所示: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 實現(xiàn)第一個JDBC程序(2)創(chuàng)建項目環(huán)境,導入數(shù)據(jù)庫驅(qū)動在IDEA中新建一個名稱為chapter11的Java項目,右擊項目名稱,在彈出的快捷菜單中選 擇 NewDirectory命令,在彈出的對話框中將該目錄命名為lib,項目根目錄中就會出現(xiàn)一 個名稱為lib的目錄。11.3.2 實現(xiàn)第一個JDBC程序添加MySQL 的JAR
32、包:將下載好的Jar包復(fù)制到項目的lib目錄中,并把Jar包添加到項目里。在IDEA菜單欄單擊File,選擇“Project Structure”“Modules”“Dependencies”,單擊最右側(cè)加號后選擇第一項:JARs or directories,在彈出框中選擇下載好的Jar包確認。最后可以看到mysql-connector-java-8.0.15.jar包添加到IDEA的依賴項中。11.3.2 實現(xiàn)第一個JDBC程序加入數(shù)據(jù)庫驅(qū)動后的項目結(jié)構(gòu):在上圖中,mysql-connector-java-8.0.15.jar包添加到依賴項之后,單擊“Apply”按鈕后再單擊“OK”按鈕,
33、可以看到在External libraries下已經(jīng)存在剛剛添加的jar包。至此,Jar包添加成功??梢詮挠疫叺膱D中查看加入數(shù)據(jù)庫驅(qū)動后的項目結(jié)構(gòu)。11.3.2 實現(xiàn)第一個JDBC程序案例演示:(3)編寫JDBC程序在項目chapter11的src目錄下,新建一個名稱為com.itheima.jdbc.example的包,在該包中創(chuàng)建類Example01,Example01類用于讀取數(shù)據(jù)庫中的users表,并將結(jié)果輸出到控制臺。具體實現(xiàn)步驟如下所示。11.3.2 實現(xiàn)第一個JDBC程序步驟一:注冊數(shù)據(jù)庫驅(qū)動,通過DriverManager獲取數(shù)據(jù)庫連接,通過Connection對象獲取Stat
34、ement對象。代碼如下所示:Statement stmt = null;ResultSet rs = null;Connection conn = null; / 1. 注冊數(shù)據(jù)庫的驅(qū)動 Class.forName(com.mysql.cj.jdbc.Driver); / 2.通過DriverManager獲取數(shù)據(jù)庫連接 String url = jdbc:mysql:/localhost:3306/jdbc+ ?serverTimezone=GMT%2B8&useSSL=false; String username = root; /數(shù)據(jù)庫用戶名 String password = roo
35、t; /數(shù)據(jù)庫密碼 conn = DriverManager.getConnection(url, username, password); / 3.通過Connection對象獲取Statement對象 stmt = conn.createStatement();11.3.2 實現(xiàn)第一個JDBC程序步驟二:使用Statement執(zhí)行SQL語句,操作ResultSet結(jié)果集。代碼如下所示: / 4.使用Statement執(zhí)行SQL語句 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 實現(xiàn)第一個JDBC程序步驟三:回收數(shù)據(jù)庫資源。代碼如下所示: / 6.回收數(shù)據(jù)庫資源 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 實現(xiàn)第一個JDBC程序步驟四:定義main()方法,定義try.catch.finally代碼塊,把步驟一和步驟二的代碼寫在try塊中,把步驟三的代碼寫在finally塊中。11.3.2 實現(xiàn)第一個JDBC程序運行代碼,控制臺顯示的運行結(jié)果如下圖所示。從圖中可以看到,users表中的數(shù)據(jù)已被輸出到了控制臺。至此,第一個JDBC程序?qū)崿F(xiàn)成功。11.3.2 實現(xiàn)第一個JDBC程序?qū)崿F(xiàn)JDBC入門程序時的注意事項:1. 注冊驅(qū)動程序雖然使用DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()方法也可以完成注冊,但這種方式會使數(shù)據(jù)庫驅(qū)動被注冊兩次。因為在Driver類的源碼中,已經(jīng)在靜態(tài)代碼塊中完成了數(shù)據(jù)庫驅(qū)動的注冊。為了避免數(shù)據(jù)庫驅(qū)動被重復(fù)注冊,在程序中使用Class.forName()方法加載驅(qū)動類即可。11.3.2 實現(xiàn)第一個JDBC程序2. 釋放資源由于數(shù)據(jù)庫資源非常寶貴,數(shù)據(jù)庫允許的并發(fā)訪問連接數(shù)量有限,因此,當數(shù)據(jù)庫資源使用完畢后,一定要釋放資源。為了保證資源的釋放,在Java程序中應(yīng)該將釋放資源的操作放在finally代碼塊中。11.3.2 實現(xiàn)
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村別墅住宅安保合同范本
- 單位安裝電子門合同范本
- 農(nóng)民土地入股合同范例
- 代理辦證協(xié)議合同范本
- 保姆勞務(wù)關(guān)系合同范本
- 醫(yī)療器械預(yù)售合同范本
- dj入職合同范本
- 醫(yī)院項目ppp合同范例
- 交通標示工程合同范例
- 住宅送車位合同范本
- 酒店長包房租賃協(xié)議書范本
- 2 找春天 公開課一等獎創(chuàng)新教學設(shè)計
- 2025年江蘇護理職業(yè)學院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 2025年江蘇南京水務(wù)集團有限公司招聘筆試參考題庫含答案解析
- 【道法】開學第一課 課件-2024-2025學年統(tǒng)編版道德與法治七年級下冊
- 建筑工程施工安全管理課件
- 2025年春新外研版(三起)英語三年級下冊課件 Unit2第1課時Startup
- 人教版(2024)英語七年級上冊單詞表
- 2024年江西電力職業(yè)技術(shù)學院單招職業(yè)技能測試題庫及答案解析
- 【真題】2023年常州市中考道德與法治試卷(含答案解析)
- 超星爾雅學習通《大學生心理健康教育(蘭州大學版)》章節(jié)測試含答案
評論
0/150
提交評論