java面向?qū)ο蟪绦蛟O(shè)計第2版第14章jdbc數(shù)據(jù)庫操作_第1頁
java面向?qū)ο蟪绦蛟O(shè)計第2版第14章jdbc數(shù)據(jù)庫操作_第2頁
java面向?qū)ο蟪绦蛟O(shè)計第2版第14章jdbc數(shù)據(jù)庫操作_第3頁
java面向?qū)ο蟪绦蛟O(shè)計第2版第14章jdbc數(shù)據(jù)庫操作_第4頁
java面向?qū)ο蟪绦蛟O(shè)計第2版第14章jdbc數(shù)據(jù)庫操作_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2020/10/28,1,Java面向?qū)ο蟪绦蛟O(shè)計第2版第14章,配合第2版 例子源代碼一起使用,Power point 制作:耿祥義 張躍平,JDBC 數(shù)據(jù)庫操作,2020/10/28,2,主要內(nèi)容 JDBC 連接數(shù)據(jù)庫 查詢操作 更新、添加與刪除操作 查詢Excel電子表格 使用預(yù)處理語句 事務(wù) 難點 使用預(yù)處理語句 事務(wù),導(dǎo)讀,本章將學(xué)習(xí)怎樣使用Java提供的JDBC技術(shù)操作數(shù)據(jù)庫 。,2020/10/28,3,14.1 Microsoft Access 數(shù)據(jù)庫管理系統(tǒng) 14.1.1 建立數(shù)據(jù)庫,建立一個名字為factory的數(shù)據(jù)庫。操作步驟如下: 單擊“開始”“所有程序”“Micros

2、oft Access”,在新建數(shù)據(jù)庫界面選擇“空Access數(shù)據(jù)庫”,然后命名、保存新建的數(shù)據(jù)庫,在這里我們命名的數(shù)據(jù)庫是factory,保存在C:chapter14中。,2020/10/28,4,14.1.2 創(chuàng)建表,在factory管理的“表”的界面上選擇“使用設(shè)計器創(chuàng)建表”,然后單擊界面上的“設(shè)計”菜單,將出現(xiàn)相應(yīng)的建表界面,我們建立的表是employee,該表的字段(屬性)為:number(文本) name(文本) birthday(日期) salary(數(shù)字,雙精度)。 其中,“number”字段為主鍵 。 在factory管理的“表”的界面上,用鼠標(biāo)雙擊已創(chuàng)建的表可以為該表添加記錄

3、。,2020/10/28,5,14.2 JDBC,JDBC(Java DataBase Connection)是Java數(shù)據(jù)庫連接API。簡單地說,JDBC能完成3件事: 與一個數(shù)據(jù)庫建立連接。 向數(shù)據(jù)庫發(fā)送SQL語句。 處理數(shù)據(jù)庫返回的結(jié)果。,2020/10/28,6,14.3 連接數(shù)據(jù)庫 14.3.1 連接方式的選擇,和數(shù)據(jù)庫建立連接的常用兩種方式是:建立JDBCODBC橋接器和加載純Java數(shù)據(jù)庫驅(qū)動程序。使用JDBCODBC橋接器方式的機制是,應(yīng)用程序只需建立JDBC和ODBC之間的連接,即所謂的建立JDBCODBC橋接器,而和數(shù)據(jù)庫的連接由ODBC去完成。,使用JDBCODBC橋接器

4、連接數(shù)據(jù)庫的3個步驟 建立JDBC-ODBC橋接器 建ODBC數(shù)據(jù)源 和ODBC數(shù)據(jù)源建立連接,2020/10/28,7,14.3.2 建立JDBC-ODBC橋接器,JDBC使用java.lang包中的Class類建立JDBC-ODBC橋接器。建立橋接器時可能發(fā)生異常,必須捕獲這個異常,建立橋接器的代碼是: try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); catch(ClassNotFoundException e) System.out.println(e); ,2020/10/28,8,14.3.3 ODBC數(shù)據(jù)源,1創(chuàng)建、修改或刪除數(shù)據(jù)源

5、 選擇“控制面板”“管理工具”“ODBC數(shù)據(jù)源”(某些window/xp系統(tǒng),需選擇“控制面板”“性能和維護(hù)”“管理工具”“ODBC數(shù)據(jù)源”)。 雙擊ODBC數(shù)據(jù)源圖標(biāo),出現(xiàn)的界面顯示了用戶已有的數(shù)據(jù)源的名稱。選擇“系統(tǒng)DSN”或“用戶DSN”,單擊“添加”按鈕,可以創(chuàng)建新的數(shù)據(jù)源;單擊“配置”按鈕,可以重新配置已有的數(shù)據(jù)源;單擊“刪除”按鈕,可以刪除已有的數(shù)據(jù)源。 2為數(shù)據(jù)源選擇驅(qū)動程序 因為要訪問Access數(shù)據(jù)庫,選擇Microsoft Acess Driver(*.mdb)。 3數(shù)據(jù)源名稱及對應(yīng)數(shù)據(jù)庫的所在位置 在名稱欄里為數(shù)據(jù)源起一個自己喜歡的名字,這里我們起的名字是star。這個數(shù)

6、據(jù)源就是指某個數(shù)據(jù)庫。在“數(shù)據(jù)庫選擇”欄中選擇一個數(shù)據(jù)庫,這里我們選擇的是C:chapter14下的factory.mdb數(shù)據(jù)庫。,2020/10/28,9,14.3.4 建立連接,編寫連接數(shù)據(jù)庫代碼不會出現(xiàn)數(shù)據(jù)庫的名稱,只能出現(xiàn)數(shù)據(jù)源的名字。 首先使用java.sql包中的Connection類聲明一個對象,然后再使用類DriverManager調(diào)用它的靜態(tài)方法getConnection創(chuàng)建這個連接對象,建立連接時應(yīng)捕獲SQLException異常 : try Connection con=DriverManager.getConnection(“jdbc:odbc:數(shù)據(jù)源名字”, logi

7、n name, password ); catch(SQLException e) 例題14-1,2020/10/28,10,14.4 查詢操作,對一個數(shù)據(jù)庫中表進(jìn)行查詢操作的具體步驟如下。 1向數(shù)據(jù)庫發(fā)送SQL查詢語句 try Statement sql=con.createStatement(); catch(SQLException e ) 2處理查詢結(jié)果 ResultSet rs=sql.executeQuery(SELECT * FROM employee); 表14.1給了出了ResultSet對象的若干方法。,2020/10/28,11,14.4.1 順序查詢,通過使用JDBC提

8、供的API,可以在查詢之前知道表中的字段的個數(shù)和名字,步驟如下: 1.連接對象con調(diào)用getMetaData()方法可以返回一個DatabaseMetaData對象,例如: DatabaseMetaData metadata=con.getMetaData(); 2. Metadata對象再調(diào)用getColumns可以將表的字段信息以行列的形式存儲在一個ResultSet對象中,例如: ResultSet tableMessage=metadata.getColumns(null,null,employee,null); 3. tableMessage對象調(diào)用next方法使游標(biāo)向下移動一行(

9、游標(biāo)的初始位置在第1行之前),然后tableMessage調(diào)用getXXX方法可以查看該行中列的信息,其中最重要的信息是第4列,該列上的信息為字段的名字。 例題14-2,2020/10/28,12,14.4.2 隨機查詢,需要在結(jié)果集中前后移動、顯示結(jié)果集指定的一條記錄或隨機顯示若干條記錄等。這時,必須要返回一個可滾動的結(jié)果集。為了得到一個可滾動的結(jié)果集,需使用下述方法先獲得一個Statement對象: Statement stmt=con.createStatement(int type ,int concurrency); 然后,根據(jù)參數(shù)的type、concurrency的取值情況,stm

10、t返回相應(yīng)類型的結(jié)果集: ResultSet re=stmt.executeQuery(SQL語句); 滾動查詢經(jīng)常用到ResultSet的下述方法: public boolean previous():將游標(biāo)向上移動 public void beforeFirst():將游標(biāo)移動到結(jié)果集的初始位置。 public void afterLast():將游標(biāo)移到結(jié)果集最后一行之后。 public void first():將游標(biāo)移到結(jié)果集的第一行。 public void last():將游標(biāo)移到結(jié)果集的最后一行。 public boolean isAfterLast():判斷游標(biāo)是否在最后一行

11、之后。 public boolean isBeforeFirst():判斷游標(biāo)是否在第一行之前 public boolean ifFirst():判斷游標(biāo)是否指向結(jié)果集的第一行。 public boolean isLast():判斷游標(biāo)是否指向結(jié)果集的最后一行。 public int getRow():得到當(dāng)前游標(biāo)所指行的行號.0 public boolean absolute(int row):將游標(biāo)移到參數(shù)row指定的行號。例題14-3,2020/10/28,13,14.4.3 條件查詢,在下面的例子4中QueryByNumber和QueryBySalary是例子2中Query類的子類,二

12、者分別能按雇員號和薪水查詢記錄。主類將查詢條件傳遞QueryByNumber和QueryBySalary類的實例。 例題14-3,2020/10/28,14,14.4.4 排序查詢,可以在SQL語句中使用ORDER BY子語句,對記錄排序 。 按薪水排序查詢的SQL語句: SELECT * FROM employee ORDER BY salary 例題14-5,2020/10/28,15,14.4.5 模糊查詢,可以用SQL語句操作符LIKE進(jìn)行模式般配,使用“%”代替0個或多個字符,用一個下劃線“_”代替1個字符。下述語句查詢姓氏是“張”或“李”的記錄: rs=sql.executeQue

13、ry(“SELECT * FROM students WHERE 姓名 LIKE 張李% ”); 例題14-6,2020/10/28,16,14.5 更新、添加與刪除操作,Statement對象調(diào)用方法: public int executeUpdate(String sqlStatement); 通過參數(shù)sqlStatement指定的方式實現(xiàn)對數(shù)據(jù)庫表中記錄的更新、添加和刪除操作。 更新、添加和刪除記錄的SQL語法分別是: UPDATE SET = 新值 WHERE INSERT INTO 表(字段列表) VALUES (對應(yīng)的具體的記錄)或INSERT INTO 表(VALUES (對應(yīng)的

14、具體的記錄) DELETE FROM WHERE 例題14-7,2020/10/28,17,14.6 查詢Excel電子表格,訪問Exel電子表格和訪問其它的數(shù)據(jù)庫有所不同,假設(shè)有電子表格Goods.xls,見圖14.17。 連接Excel電子表格的步驟如下。 1設(shè)置表 必須在電子表格中選出一工作區(qū)作為連接時使用的表。 2設(shè)置數(shù)據(jù)源 為數(shù)據(jù)源選擇的驅(qū)動程序必須是:Microsoft Excel Driver。 例題14-8,2020/10/28,18,14.7 使用預(yù)處理語句,Java提供了更高效率的數(shù)據(jù)庫操作機制,就是PreparedStatement對象,該對象被習(xí)慣地稱作預(yù)處理語句對象。

15、,2020/10/28,19,14.7.1 預(yù)處理語句優(yōu)點,預(yù)處理不僅減輕了數(shù)據(jù)庫的負(fù)擔(dān),而且也提高了訪問數(shù)據(jù)庫的速度。 對于JDBC,如果使用Connection和某個數(shù)據(jù)庫建立了連接對象con,那么con就可以調(diào)用prepareStatement(String sql)方法對參數(shù)sql指定的SQL語句進(jìn)行預(yù)編譯處理,生成該數(shù)據(jù)庫地層的內(nèi)部命令,并將該命令封裝在PreparedStatement對象中,那么該對象調(diào)用下列方法都可以使得該地層內(nèi)部命令被數(shù)據(jù)庫執(zhí)行 ResultSet executeQuery() ; boolean execute(); int executeUpdate();

16、 只要編譯好了PreparedStatement對象,那么該對象可以隨時地執(zhí)行上述方法,顯然提高了訪問數(shù)據(jù)庫的速度。 例題14-9,2020/10/28,20,14.7.2 使用統(tǒng)配符,在對SQL進(jìn)行預(yù)處理時可以使用統(tǒng)配符“?”來代替字段的值,只要在預(yù)處理語句執(zhí)行之前再設(shè)置統(tǒng)配符所表示的具體值即可。 例如: sql=con.prepareStatement(SELECT * FROM employee WHERE salary ? ); 那么在sql對象執(zhí)行之前,必須調(diào)用相應(yīng)的方法設(shè)置統(tǒng)配符“?”代表的具體值,比如: sql.setFloat(1,2389); 指定上述預(yù)處理SQL語句中統(tǒng)配符

17、“?”代表的值是2389 預(yù)處理語句設(shè)置統(tǒng)配符“?”的值的常用方法有: void setDate(int parameterIndex,Date x) void setDouble(int parameterIndex,double x) void setFloat(int parameterIndex,float x) void setInt(int parameterIndex,int x) void setLong(int parameterIndex,long x) void setString(int parameterIndex,String x) 例題14-10,2020/10/

18、28,21,14.8 事務(wù) 14.8.1 事務(wù)及處理,事務(wù)由一組SQL語句組成,所謂事務(wù)處理是指:應(yīng)用程序保證事務(wù)中的SQL語句要么全部都執(zhí)行,要么一個都不執(zhí)行。 事務(wù)處理是保證數(shù)據(jù)庫中數(shù)據(jù)完整性與一致性的重要機制。,2020/10/28,22,14.8.2 JDBC事務(wù)處理步驟,1使用setAutoCommit(boolean autoCommit)方法 和數(shù)據(jù)庫建立一個連接對象后,比如con。那么con的提交模式是自動提交模式,為了能進(jìn)行事務(wù)處理,必須關(guān)閉con的這個默認(rèn)設(shè)置。con.setAutoCommit(false); 2使用commit()方法 連接對象con調(diào)用commit()

19、方法就是讓事務(wù)中的SQL語句全部生效。 3使用rollback()方法 con調(diào)用rollback()方法的作用是撤消事務(wù)中成功執(zhí)行過的SQL語句對數(shù)據(jù)庫數(shù)據(jù)所做的更新、插入或刪除操作,即撤消引起數(shù)據(jù)發(fā)生變化的SQL語句操作,將數(shù)據(jù)庫中的數(shù)據(jù)恢復(fù)到commi()方法執(zhí)行之前的狀態(tài)。 例題14-11,2020/10/28,23,14.9 CachedRowSetImpl類,com.sun.rowset包提供了CachedRowSetImpl類,該類實現(xiàn)了CachedRowSet接口。CachedRowSetImpl對象可以保存ResultSet對象中的數(shù)據(jù),而且CachedRowSetImpl對

20、象不依賴Connnection對象,這意味著一旦把ResultSet對象中的數(shù)據(jù)保存到CachedRowSetImpl對象中后,就可以關(guān)閉和數(shù)據(jù)庫的連接。 將ResultSet對象rs中的數(shù)據(jù)保存到CachedRowSetImpl對象rowSet中的代碼如下: rowSet.populate(rs); 例題14-12,2020/10/28,24,14. 10 Java的Derby內(nèi)置數(shù)據(jù)庫,JDK 1.6版本及之后的版本為Java平臺提供了一個內(nèi)置的數(shù)據(jù)庫管理系統(tǒng) ,簡稱Derby數(shù)據(jù)庫。 應(yīng)用程序內(nèi)嵌數(shù)據(jù)庫的特點是應(yīng)用程序在其自身的代碼中創(chuàng)建所需要的數(shù)據(jù)庫,并使用該數(shù)據(jù)庫。 應(yīng)用程序連接De

21、rby數(shù)據(jù)庫的步驟如下: 1將Java安裝目錄dblib下的derby.jar復(fù)制到Java運行環(huán)境的擴展中,即將該jar文件存放在JDK安裝目錄的jrelibext文件夾中。 2加載Derby數(shù)據(jù)庫驅(qū)動程序: 加載Derby數(shù)據(jù)庫驅(qū)動程序的代碼是: Class.forName(org.apache.derby.jdbc.EmbeddedDriver).newInstance(); 其中的org.apache.derby包是derby.jar提供的,該包中的EmbeddedDriver類負(fù)責(zé)創(chuàng)建驅(qū)動數(shù)據(jù)的實例.加載Derby數(shù)據(jù)庫驅(qū)動程序需要捕獲ClassNotFoundException、InstantiationException、IllegalAccessException和SQLException異常。 3創(chuàng)建并連接數(shù)據(jù)庫或連接已有的數(shù)據(jù)庫 :創(chuàng)建名字是student的數(shù)據(jù)庫,并與其建立連接(create取值是true)的代碼是:Co

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論