Java程序設(shè)計(jì)教程課件_第1頁
Java程序設(shè)計(jì)教程課件_第2頁
Java程序設(shè)計(jì)教程課件_第3頁
Java程序設(shè)計(jì)教程課件_第4頁
Java程序設(shè)計(jì)教程課件_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

人民郵電出版社15數(shù)據(jù)庫編程Java程序設(shè)計(jì)第章C目錄ONTENTS15.2數(shù)據(jù)庫基本操作15.3事務(wù)處理15.4小結(jié)15.1數(shù)據(jù)庫編程基礎(chǔ)15.1.1JDBC數(shù)據(jù)庫應(yīng)用模型15.1.1JDBC數(shù)據(jù)庫應(yīng)用模型包括應(yīng)用程序、Applet以及Servlet,這些類型的程序都可以利用JDBC實(shí)現(xiàn)對數(shù)據(jù)庫的訪問。JDBC在其中可以請求與數(shù)據(jù)庫建立連接、向數(shù)據(jù)庫發(fā)送SQL請求、處理查詢、錯誤處理等操作。

JDBC驅(qū)動程序管理器動態(tài)地管理和維護(hù)數(shù)據(jù)庫查詢所需要的驅(qū)動程序?qū)ο螅瑢?shí)現(xiàn)Java程序與特定驅(qū)動程序的連接。它可以為特定的數(shù)據(jù)庫選取驅(qū)動程序、處理JDBC初始化調(diào)用、為每個驅(qū)動程序提供JDBC功能的入口、為JDBC調(diào)用傳遞參數(shù)等。2、JDBC驅(qū)動程序管理器1、Java應(yīng)用程序15.1.1JDBC數(shù)據(jù)庫應(yīng)用模型驅(qū)動程序一般由數(shù)據(jù)庫廠商或者第三方提供,由JDBC方法調(diào)用,向特定數(shù)據(jù)庫發(fā)送SQL請求,并為程序獲取結(jié)果。驅(qū)動程序完成建立與數(shù)據(jù)庫的連接、向數(shù)據(jù)庫發(fā)送請求、在用戶程序請求時進(jìn)行翻譯、錯誤處理等操作。3、驅(qū)動程序數(shù)據(jù)庫指數(shù)據(jù)庫管理系統(tǒng)和用戶程序所需要的數(shù)據(jù)庫。4、數(shù)據(jù)庫

JDBC驅(qū)動程序分為以下四種類型:15.1.2JDBC驅(qū)動程序(1)類型一:JDBC-ODBCBridgeDriver類型;(2)類型二:Native-APIpartly-JavaDriver類型;(3)類型三:JDBC-NetAll-JavaDriver類型;(4)類型四:Native-protocolAll-JavaDriver類型。

以上四種驅(qū)動類型中,類型一簡單易用,類型四是純Java代碼實(shí)現(xiàn)且性能好,因此這兩種類型最為常用。我們以SQLite數(shù)據(jù)庫為例說明創(chuàng)建數(shù)據(jù)庫的基本操作。首先創(chuàng)建數(shù)據(jù)庫xsgl.db。進(jìn)入SQLite,選擇“CreateDatabase”,命名之后保存。如右圖1所示。然后創(chuàng)建表studentInfo,選擇“使用設(shè)計(jì)器創(chuàng)建表”,輸入該表字段:studentID、studentName、studentSex。確定studentID為主鍵。如圖2所示。15.1.3

用JDBC驅(qū)動連接數(shù)據(jù)庫1、創(chuàng)建數(shù)據(jù)庫12

15.1.3用JDBC驅(qū)動連接數(shù)據(jù)庫try{Class.forName(“org.sqlite.JDBC”);}catch(ClassNotExceptione){System.out.println(e);}(1)加載驅(qū)動程序2、數(shù)據(jù)庫驅(qū)動與連接

15.1.3用JDBC驅(qū)動連接數(shù)據(jù)庫Stringurl=“jdbc:sqlite:student.db”;//student是在數(shù)據(jù)源管理器創(chuàng)建的數(shù)據(jù)源名字Connectioncon=DriverManager.getConnection(url);如果數(shù)據(jù)庫設(shè)置了登錄名和口令,則在創(chuàng)建連接時需在方法中包含相關(guān)的參數(shù)。

DriverManager.getConnection(Stringurl,StringloginName,Stringpassword)(2)創(chuàng)建數(shù)據(jù)庫連接對象3、數(shù)據(jù)庫驅(qū)動與連接

15.1.3用JDBC驅(qū)動連接數(shù)據(jù)庫 con=DriverManager.getConnection(Stringurl,String loginName,Stringpassword)(2)創(chuàng)建數(shù)據(jù)庫連接對象3、數(shù)據(jù)庫驅(qū)動與連接本書的例程中采用了一種無數(shù)據(jù)源連接數(shù)據(jù)庫的方式,語句如下:注意:在Driver和(*.mdb)之間有一空格。

15.1.3用JDBC驅(qū)動連接數(shù)據(jù)庫Stringquery=“select*fromtable1”;//查詢語句Satementst=con.createStatement();//或用帶參數(shù)的createStatement()方法

ResultSetrs=st.executeQuery(query);//發(fā)送SQL語句,獲得結(jié)果與數(shù)據(jù)庫建立連接之后,需要向訪問的數(shù)據(jù)庫發(fā)送SQL語句。在特定的程序環(huán)境和功能需求下,可能需要不同的SQL語句,例如數(shù)據(jù)庫的增、刪、改、查等操作,或者數(shù)據(jù)庫表的創(chuàng)建及維護(hù)操作等等。其語法格式是相同的。4、執(zhí)行SQL語句例如向數(shù)據(jù)庫發(fā)送查詢語句,獲取查詢結(jié)果

15.1.3用JDBC驅(qū)動連接數(shù)據(jù)庫若要顯示前面查詢表table1的結(jié)果,可用下面的代碼:while(rs.next()){//結(jié)果集中有內(nèi)容?

System.out.println(rs.getString(1));//取第1列

……}con.close();6、關(guān)閉連接5、檢索結(jié)果15.1.4JDBC常用API

JDBCAPI提供的類和接口是在java.sql包和javax.sql包中定義的。以下列出常用的類和接口,希望查閱教材或類文檔進(jìn)行研究。DriverManager、Connection、Statement、PreparedStatement、CallableStatement、ResultSet、java.sql.Date、SQLException、DatabaseMetadata、ResultSetMetaData等。C目錄ONTENTS15.2數(shù)據(jù)庫基本操作15.3事務(wù)處理15.4小結(jié)15.1數(shù)據(jù)庫編程基礎(chǔ)

15.2.1

數(shù)據(jù)插入操作INSERTINTO<表名>[(字段名[,字段名]…)]VALUES(常量[,常量]…)例如,要向表member中插入一行數(shù)據(jù)的SQL語句是:INSERTINTOmember(name,age,sex,wage,addr)VALUES('LiMing',40,'男',4500,'北京市')Insert語句格式如下:

15.2.1

數(shù)據(jù)插入操作Statementstmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CUNCUR_UPDATABLE);事實(shí)上,對很多數(shù)據(jù)庫而言,對數(shù)據(jù)的插入、刪除和更新操作都有兩種可選的操作模式,一是直接使用SQL語句插入(或更新、刪除)模式,二是通過可更新的結(jié)果集對象間接插入(或更新、刪除)。用下面的形式創(chuàng)建語句對象:

15.2.1

數(shù)據(jù)插入操作Stringsqlins="INSERTINTOstudentsvalues('"+name+"','"+age+"','"+sex+"','"+wage+"','"+"','"+addr+"')";對很多數(shù)據(jù)庫而言,對數(shù)據(jù)的插入、刪除和更新操作都有兩種可選的操作模式,一是直接使用SQL語句插入(或更新、刪除)模式,二是通過可更新的結(jié)果集對象間接插入(或更新、刪除)。例如插入數(shù)據(jù):第1種方式:

15.2.1

數(shù)據(jù)插入操作rs.moveToInsertRow();rs.updateString("name","'LiMing");rs.updateInt("age",40);rs.updateString("sex","男");rs.updateInt("wage",50000);rs.updateString("addr","北京市");rs.insertRow();第2種方式:

15.2.2數(shù)據(jù)刪除操作DELETEFROM<表名>WHERE<條件表達(dá)式>Delete語句的格式為:例如:

DELETEFROMtable1WHERENo=7658從表table1中刪除一條記錄,其字段No的值為7658。

15.2.3數(shù)據(jù)更新操作UPDATE<table_name>SETcolume_name=‘xxx’WHERE<條件表達(dá)式>數(shù)據(jù)更新語句的命令格式為:例如語句:

UPDATEEMPSETJOB=’MANAGER’WHERENAME=’MATIN’對數(shù)據(jù)表EMP中姓名為MATIN的職工數(shù)據(jù)進(jìn)行了修改,將其工作名稱改為MANAGER

15.2.4數(shù)據(jù)查詢操作SELECT[DISTINCT]{column1,column2,…}FROMtablenameWHERE{conditions}GROUPBY{conditions}HAVING{conditions}ORDERBY{conditions}[ASC/DESC];查詢語句的語句格式如下:15.2.4數(shù)據(jù)查詢操作【例15.1】無數(shù)據(jù)源連接數(shù)據(jù)庫方式。代碼詳見:

Example15_1.java【例15.2】模糊查詢的例子。代碼詳見:

Example15_2.java15.2.5

編譯預(yù)處理PreparedStatement是與編譯預(yù)處理有關(guān)的類,它是Statement的一個子類,與Statement類的一個重要區(qū)別是,用Statement定義的語句是一個功能明確而具體的語句,而用PreparedStatement類定義的SQL語句中則包含有一個或多個問號(“?”)占位符,它們對應(yīng)于多個IN參數(shù)。帶著占位符的SQL語句被編譯,而在后續(xù)執(zhí)行過程中,這些占位符需要用setXXX方法設(shè)置為具體的IN參數(shù)值,這些語句發(fā)送至數(shù)據(jù)庫獲得執(zhí)行。15.2.5編譯預(yù)處理下面給出若干編譯預(yù)處理語句例子說明PreparedStatement的用法:

PreparedStatementpstmt=con.prepareStatement(“updatetable1setx=?wherey=?”);在對象pstmt中包含了語句“updatetable1setx=?wherey=?”,該語句被發(fā)送到DBMS進(jìn)行編譯預(yù)處理,為執(zhí)行做準(zhǔn)備。(1)創(chuàng)建對象15.2.5編譯預(yù)處理

設(shè)定參數(shù)值是通過調(diào)用setXXX方法實(shí)現(xiàn)的,其中XXX是與參數(shù)相對應(yīng)的類型,加入上面例子中參數(shù)類型為long,則用下面的代碼為參數(shù)設(shè)定值:pstmt.setLong(1,123456789);pstmt.setLong(2,987654321);這里的1和2是與占位符從左到右的次序相對應(yīng)的序號,它們不是從0開始計(jì)數(shù)的。(2)為每個IN參數(shù)設(shè)定參數(shù)值,即每個占位符?對應(yīng)一個參數(shù)值15.2.5編譯預(yù)處理

Pstmt.executeUpdate();(3)執(zhí)行語句【例15.3】說明編譯預(yù)處理語句使用方法的程序例子。Example15_3.javaC目錄ONTENTS15.2數(shù)據(jù)庫基本操作15.3事務(wù)處理15.4小結(jié)15.1數(shù)據(jù)庫編程基礎(chǔ)15.3事務(wù)處理所謂事務(wù),概指一系列的數(shù)據(jù)庫操作,這些操作要么全做,要么全不做,是一個不可分割的工作單元,也可以說是數(shù)據(jù)庫應(yīng)用程序中的一個基本邏輯單元。它可能是一條SQL語句、一組SQL語句或者一個完整的程序。這體現(xiàn)的是事務(wù)的原子性需求,對事務(wù)還有其他的需求如一致性、隔離性、持久性等。數(shù)據(jù)庫是共享資源,可供多用戶使用。多個用戶并發(fā)地存取數(shù)據(jù)庫時就可能產(chǎn)生多個事務(wù)同時存取同一數(shù)據(jù)的情況??赡艹霈F(xiàn)不正確存取數(shù)據(jù),破壞數(shù)據(jù)的一致性的情況。2、三種類型數(shù)據(jù)錯誤1、什么是事務(wù)15.3事務(wù)處理2、三種類型數(shù)據(jù)錯誤

一個事務(wù)修改了某一行數(shù)據(jù)而未提交時,另一事務(wù)讀取了該行數(shù)據(jù)。假如前一事務(wù)發(fā)生了回退,則后一事務(wù)將得到一無效的值。(1)臟讀(DirtyRead)

一個事務(wù)讀取某一數(shù)據(jù)行時,另一事務(wù)同時在修改此數(shù)據(jù)行。則前一事務(wù)在重復(fù)讀取此行時將得到一個不一致的數(shù)據(jù)。(2)不可重復(fù)讀(Non-RepeatableRead)15.3事務(wù)處理2、三種類型數(shù)據(jù)錯誤

也稱為幻影讀,一事務(wù)在某一表中查詢時,另一事務(wù)恰好插入了滿足查詢條件的數(shù)據(jù)行,則前一事務(wù)在重復(fù)讀取滿足條件的值時,將得到一個或多個額外的“影子”值。(3)錯誤讀(PhantomRead)15.3事務(wù)處理3、事務(wù)隔離級JDBC事務(wù)處理可采用隔離級別控制數(shù)據(jù)讀取操作。JDBC支持5個隔離級別設(shè)置,其名稱和含義如下表所示。用con.setTransactionIsolation(Connection.Isolation_level);進(jìn)行事務(wù)隔離級設(shè)置。Isolation_level取值即以上表中的5個常量之一。15.3事務(wù)處理Connection中下面三個方法完成基本的事務(wù)管理:(1)setAutoCommit(booleantrue/false):設(shè)置自動提交屬性AutoCommit,默認(rèn)為true;(2)rollback():回滾事務(wù);(3)commit():事務(wù)提交。4、事務(wù)基本操作15.3事務(wù)處理事務(wù)中若包含多個任務(wù),當(dāng)事務(wù)失敗時,也許其中部分任務(wù)不需要被回滾,例如處理一個訂單要完成3個任務(wù),分別是更新消費(fèi)者帳戶表、訂單插入到待處理的訂單表和給消費(fèi)者發(fā)一確認(rèn)電子郵件。如果上述3個任務(wù)中完成了前2個,只是最后一個因?yàn)猷]件服務(wù)器掉線而未完成,那么不需要對整個事務(wù)回滾??梢允褂帽4纥c(diǎn)(Savepoint)來控制回滾的數(shù)量。所謂保存點(diǎn),就是對事務(wù)的某些子任務(wù)設(shè)置符號標(biāo)識,用以為回滾操作提供位置指示。5、保存點(diǎn)的概念與操作15.3事務(wù)處理

溫馨提示

  • 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

提交評論