版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
會(huì)計(jì)學(xué)1Java語言程序設(shè)計(jì)JDBC與數(shù)據(jù)庫訪問目錄10.1數(shù)據(jù)庫基礎(chǔ)知識(shí)10.2通過JDBC訪問數(shù)據(jù)庫10.3本章小結(jié)第1頁/共64頁10.1數(shù)據(jù)庫基礎(chǔ)知識(shí)數(shù)據(jù)管理的兩個(gè)階段文件管理各種數(shù)據(jù)都是以文件為單位存儲(chǔ)在外存,且由操作系統(tǒng)統(tǒng)一管理文件相對(duì)獨(dú)立,文件結(jié)構(gòu)不能很好地反映現(xiàn)實(shí)世界中事物之間的聯(lián)系,文件中存在大量的數(shù)據(jù)冗余數(shù)據(jù)庫管理以數(shù)據(jù)為中心組織數(shù)據(jù),減少冗余,并提供更高的數(shù)據(jù)共享能力,由數(shù)據(jù)庫系統(tǒng)進(jìn)行管理程序和數(shù)據(jù)具有較高的獨(dú)立性,當(dāng)數(shù)據(jù)的邏輯結(jié)構(gòu)改變時(shí),不涉及數(shù)據(jù)的物理結(jié)構(gòu),也不影響應(yīng)用程序,從而降低應(yīng)用程序研制與維護(hù)的費(fèi)用第2頁/共64頁10.1.1數(shù)據(jù)庫技術(shù)的特點(diǎn)數(shù)據(jù)庫技術(shù)有如下一些特點(diǎn)面向企業(yè)或部門,以數(shù)據(jù)為中心組織數(shù)據(jù),形成綜合性的數(shù)據(jù)庫為各應(yīng)用共享采用一定的數(shù)據(jù)模型。數(shù)據(jù)模型不僅要描述數(shù)據(jù)本身的特點(diǎn),而且要描述數(shù)據(jù)之間的聯(lián)系數(shù)據(jù)冗余小,易修改、易擴(kuò)充。不同的應(yīng)用程序根據(jù)處理要求,從數(shù)據(jù)庫中獲取需要的數(shù)據(jù),這樣就減少了數(shù)據(jù)的重復(fù)存貯,也便于維護(hù)數(shù)據(jù)的一致性程序和數(shù)據(jù)有較高的獨(dú)立性。當(dāng)數(shù)據(jù)的物理結(jié)構(gòu)和邏輯結(jié)構(gòu)改變時(shí),有可能不影響或較少影響應(yīng)用程序具有良好的用戶接口,用戶可方便地開發(fā)和使用數(shù)據(jù)庫對(duì)數(shù)據(jù)進(jìn)行統(tǒng)一管理和控制,提供了數(shù)據(jù)的安全性、完整性、以及并發(fā)控制數(shù)據(jù)庫基礎(chǔ)知識(shí)第3頁/共64頁10.1.1數(shù)據(jù)庫技術(shù)的特點(diǎn)(續(xù))應(yīng)用程序訪問數(shù)據(jù)庫的基本模式DBMS(數(shù)據(jù)庫管理系統(tǒng))是數(shù)據(jù)庫的核心軟件。數(shù)據(jù)庫系統(tǒng)的各種操作,包括創(chuàng)建數(shù)據(jù)庫對(duì)象、檢索和修改數(shù)據(jù)庫中的數(shù)據(jù),都是通過DBMS實(shí)現(xiàn)的數(shù)據(jù)庫基礎(chǔ)知識(shí)第4頁/共64頁10.1.2數(shù)據(jù)模型數(shù)據(jù)模型數(shù)據(jù)庫的邏輯結(jié)構(gòu)所有的數(shù)據(jù)庫系統(tǒng)都是基于某種數(shù)據(jù)模型的不同種類的數(shù)據(jù)庫可能支持不同的數(shù)據(jù)模型關(guān)系數(shù)據(jù)庫就是因?yàn)橹С株P(guān)系模型而得名數(shù)據(jù)庫基礎(chǔ)知識(shí)第5頁/共64頁關(guān)系模型形象地說就是二維表結(jié)構(gòu),也稱之為關(guān)系表一個(gè)關(guān)系數(shù)據(jù)庫可以包含多個(gè)關(guān)系表,關(guān)系表是數(shù)據(jù)庫中組織和存儲(chǔ)數(shù)據(jù)的基本單位每個(gè)表都用于存儲(chǔ)面向某個(gè)主題的信息。例如:學(xué)生表存儲(chǔ)學(xué)生信息系表存儲(chǔ)各系的信息課程表存儲(chǔ)課程信息等關(guān)系表每一行存儲(chǔ)一個(gè)記錄,每一列表示記錄的一個(gè)屬性。設(shè)計(jì)一個(gè)關(guān)系表時(shí)需要為表命名設(shè)計(jì)表的列結(jié)構(gòu),其中包括列名及列的數(shù)據(jù)類型10.1.2數(shù)據(jù)模型數(shù)據(jù)庫基礎(chǔ)知識(shí)第6頁/共64頁10.1.2數(shù)據(jù)模型學(xué)生表由5列組成,每一列表示學(xué)生的一個(gè)屬性每個(gè)學(xué)生都是用學(xué)號(hào)、姓名、性別、出生年月及所屬系的系號(hào)等屬性來描述,在這些屬性上的一組合法取值就對(duì)應(yīng)一個(gè)學(xué)生記錄(表中的一行)數(shù)據(jù)庫基礎(chǔ)知識(shí)第7頁/共64頁10.1.3關(guān)系表中的主碼與外來碼主碼為了保證關(guān)系表中沒有重復(fù)的記錄,需要為關(guān)系表定義一個(gè)主碼,作用是唯一標(biāo)識(shí)表中的一個(gè)記錄可以是表中的一列,也可以由幾列組合而成在建表時(shí)如果定義了主碼,系統(tǒng)可以對(duì)輸入該表的數(shù)據(jù)進(jìn)行檢查,要求主碼不能重、也不能空(NULL)例如在學(xué)生表中學(xué)號(hào)可以作為主碼,因?yàn)橐粋€(gè)學(xué)號(hào)可以唯一地確定表中的一個(gè)學(xué)生記錄由于學(xué)生中有重名現(xiàn)象,姓名就不能用來做為主碼數(shù)據(jù)庫基礎(chǔ)知識(shí)第8頁/共64頁10.1.3關(guān)系表中的主碼與外來碼(續(xù))外來碼現(xiàn)實(shí)世界中事物之間的聯(lián)系反映到數(shù)據(jù)庫中就體現(xiàn)為表之間的聯(lián)系,在關(guān)系數(shù)據(jù)庫中,借助“外來碼”實(shí)現(xiàn)存貯這種聯(lián)系的信息如果一個(gè)表中的某一列是另外一個(gè)表中的主碼,那么該列稱之為外來碼。例如在學(xué)生表中,“系號(hào)”就是外來碼,因?yàn)橄堤?hào)是系表的主碼,在學(xué)生表中設(shè)計(jì)了“系號(hào)”一列,就是為了存儲(chǔ)學(xué)生和系之間的聯(lián)系信息通過外來碼和主碼的等值連接將不同表里的相關(guān)記錄連接在一起,從而實(shí)現(xiàn)數(shù)據(jù)庫中相關(guān)數(shù)據(jù)的查找可以查詢每個(gè)學(xué)生所在系的信息,也可以查詢指定系所包含的學(xué)生信息數(shù)據(jù)庫基礎(chǔ)知識(shí)第9頁/共64頁NumberNameDepartmentSalaryLocation23603Jones4131100New
Jersey24568Kerwin4132000NewJersey34589Larson6421800LosAngeles35761Myers6111400Orlando47132Neumann4139000NewJersey78321Stephens6118500OrlandoRowColumnPrimarykey10.1.3關(guān)系表中的主碼與外來碼(續(xù))數(shù)據(jù)庫基礎(chǔ)知識(shí)第10頁/共64頁該數(shù)據(jù)庫中建有員工基本信息表(person)包括工作證號(hào)、姓名、部門編號(hào)、職務(wù)、工資、學(xué)歷編號(hào)等字段工作證號(hào)(ID)是該表的主碼Department列是一個(gè)外來碼,匹配部門編碼表中的DepID主碼Education列也是一個(gè)外來碼,匹配學(xué)歷編碼表中的EduID主碼部門編碼表(department)保存了部門編號(hào)和部門名稱部門編號(hào)(DepID)是主碼學(xué)歷編碼表(education)保存了學(xué)歷編號(hào)和學(xué)歷名稱學(xué)歷編號(hào)(EduID)是主碼10.1.3關(guān)系表中的主碼與外來碼(續(xù))
——員工信息管理系統(tǒng)(PIMS)的例子數(shù)據(jù)庫基礎(chǔ)知識(shí)第11頁/共64頁10.1.3關(guān)系表中的主碼與外來碼(續(xù))
——員工信息管理系統(tǒng)(PIMS)的例子數(shù)據(jù)庫基礎(chǔ)知識(shí)第12頁/共64頁10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫建立數(shù)據(jù)庫需要借助于數(shù)據(jù)庫管理系統(tǒng),不同的數(shù)據(jù)庫管理系統(tǒng)其具體操作方法是不同的,以Windows平臺(tái)上的一個(gè)簡(jiǎn)單的關(guān)系型數(shù)據(jù)庫Access為例,建立一個(gè)數(shù)據(jù)庫,為編寫Java的數(shù)據(jù)庫訪問程序提供一個(gè)實(shí)例環(huán)境1.啟動(dòng)Office的MicrosoftAccess,選擇“新建一個(gè)Access數(shù)據(jù)庫選項(xiàng)”,在文件名輸入欄中輸入“PMS.mdb”。該文件代表一個(gè)Access數(shù)據(jù)庫數(shù)據(jù)庫基礎(chǔ)知識(shí)第13頁/共64頁10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫PMS數(shù)據(jù)庫窗口出現(xiàn)在Access主窗口中。在數(shù)據(jù)庫窗口的左側(cè),列出了常用的7類數(shù)據(jù)庫對(duì)象。當(dāng)選中某對(duì)象類后,就可以在右窗口中進(jìn)行有關(guān)該對(duì)象的操作,如建立、修改,運(yùn)行等。7類對(duì)象的主要含義分別是:表-關(guān)系表,可以實(shí)現(xiàn)的操作包括表的建立、數(shù)據(jù)的維護(hù)、查詢等查詢-可以建立一個(gè)查詢(視圖的概念),還可以運(yùn)行SQL語句窗體-數(shù)據(jù)庫應(yīng)用界面,可進(jìn)行簡(jiǎn)單數(shù)據(jù)庫應(yīng)用開發(fā)報(bào)表-報(bào)表的制作與打印輸出頁-可生成基于web頁面的數(shù)據(jù)庫應(yīng)用界面宏-可定義完成特定任務(wù)的操作或操作集模塊-可定義數(shù)據(jù)庫中使用的公共過程與函數(shù)數(shù)據(jù)庫基礎(chǔ)知識(shí)第14頁/共64頁10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫2.在對(duì)象欄中選擇“表”,再選擇“使用設(shè)計(jì)器創(chuàng)建表”方式,單擊工具欄中的“設(shè)計(jì)”按鈕,就會(huì)出現(xiàn)表設(shè)計(jì)窗口。在該窗口中可以定義字段的名稱、數(shù)據(jù)類型、字段說明信息等。分別設(shè)計(jì)Person表、Department表、Education表數(shù)據(jù)庫基礎(chǔ)知識(shí)第15頁/共64頁10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫數(shù)據(jù)庫基礎(chǔ)知識(shí)第16頁/共64頁10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫3.建立表之間的聯(lián)系點(diǎn)擊主窗口“工具”菜單中的“關(guān)系”選項(xiàng),打開“關(guān)系”視圖用鼠標(biāo)拖動(dòng)Education表的EduID屬性,拉到Person表的Education屬性上,在自動(dòng)彈出的“編輯關(guān)系”對(duì)話框中,選擇實(shí)施參照完整性,點(diǎn)擊“創(chuàng)建”按鈕用同樣方法建立Department表中DepID列和Person表中Department列數(shù)據(jù)庫基礎(chǔ)知識(shí)第17頁/共64頁10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫4.為每個(gè)表創(chuàng)建數(shù)據(jù)
數(shù)據(jù)庫基礎(chǔ)知識(shí)第18頁/共64頁10.1.5SQL語言簡(jiǎn)介SQL語言關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言,從大型數(shù)據(jù)庫(如Oracle)到微機(jī)數(shù)據(jù)庫(如Access)都支持可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的各種操作。例如表及其他數(shù)據(jù)庫對(duì)象的定義數(shù)據(jù)的查詢與數(shù)據(jù)維護(hù)對(duì)數(shù)據(jù)庫進(jìn)行控制是非過程化的語言,只需要告訴數(shù)據(jù)庫做什么,而不需要描述怎么做語句都是獨(dú)立執(zhí)行的,無上下文聯(lián)系本身不區(qū)分大小寫數(shù)據(jù)庫基礎(chǔ)知識(shí)第19頁/共64頁10.1.5
SQL語言簡(jiǎn)介(續(xù))
——SQL關(guān)鍵字?jǐn)?shù)據(jù)庫基礎(chǔ)知識(shí)第20頁/共64頁在SQL語言中,對(duì)數(shù)據(jù)庫中數(shù)據(jù)的操作可分為讀寫兩種讀操作(查詢)通過SELECT語句實(shí)現(xiàn),該語句的執(zhí)行不會(huì)改變數(shù)據(jù)庫中的數(shù)據(jù)可以返回一行或多行數(shù)據(jù)也可能沒有返回結(jié)果(沒有查到滿足條件的記錄)寫操作,涉及到寫操作的語句共有3個(gè)INSERTUPDATEDELETE10.1.5
SQL語言簡(jiǎn)介(續(xù))
——SQL語言的讀/寫操作數(shù)據(jù)庫基礎(chǔ)知識(shí)第21頁/共64頁建表語句定義表中各列的名稱及數(shù)據(jù)類型有關(guān)列的數(shù)據(jù)類型可參考具體數(shù)據(jù)庫的語法手冊(cè)CREATETABLEperson(idINTEGER
PRIMARYKEY,//定義該列為主碼
nameVARCHAR(10),//列定義,字符型
departmentINTEGER,//列定義,整型
occupationVARCHAR(10),salaryNUMBER,educationINTEGER);10.1.5
SQL語言簡(jiǎn)介(續(xù))
——建表語句數(shù)據(jù)庫基礎(chǔ)知識(shí)第22頁/共64頁插入語句向指定表插入一條記錄,插入的值要與表的定義匹配插入一行數(shù)據(jù)INSERTINTOtable_nameVALUES(value1,value2,....)插入一行數(shù)據(jù)在指定的字段上INSERTINTOtable_name(column1,column2,...)VALUES(value1,value2,....)例如在person表中插入一行INSERTINTOpersonVALUES(1,'張三',1,'manager',3500,5);10.1.5
SQL語言簡(jiǎn)介(續(xù))
——插入語句數(shù)據(jù)庫基礎(chǔ)知識(shí)第23頁/共64頁修改語句修改指定記錄中某列的值,更新表中原有數(shù)據(jù)其格式為UPDATEtable_nameSETcolumn_name=new_value
WHEREcolumn_name=some_value例如:將person表中id號(hào)為1的人員的工資修改為3700元UPDATEpersonSETsalary=3700//指定對(duì)哪列進(jìn)行修改、如何修改WHEREid=1;//選擇要修改的行10.1.5
SQL語言簡(jiǎn)介(續(xù))
——修改語句數(shù)據(jù)庫基礎(chǔ)知識(shí)第24頁/共64頁刪除語句刪除表中的指定的數(shù)據(jù)其格式為DELETEFROMtable_nameWHEREcolumn_name=some_value例如刪除部門號(hào)為4的員工記錄DELETEFROMpersonWHEREdepartment=4;
10.1.5
SQL語言簡(jiǎn)介(續(xù))
——?jiǎng)h除語句數(shù)據(jù)庫基礎(chǔ)知識(shí)第25頁/共64頁查詢語句從指定表中取出指定的數(shù)據(jù)SELECTselect_list[INTOnew_table]FROMtable_source[WHEREsearch_condition][GROUPBYgroup_by_expression][HAVINGsearch_condition][ORDERBYorder_expression[ASC|DESC]]10.1.5
SQL語言簡(jiǎn)介(續(xù))
——查詢語句數(shù)據(jù)庫基礎(chǔ)知識(shí)第26頁/共64頁例:查詢工資大于2000的員工的姓名及職務(wù)SELECT*//“*”號(hào)表示輸出全部列的值FROMperson//指定查詢的表,本查詢只用到person表WHEREsalary>2000;//查詢條件例:查詢員工“張三”的學(xué)歷,輸出學(xué)歷名SELECTFROMperson,education//該查詢用到兩個(gè)表WHERE='張三'ANDcation=id;10.1.5
SQL語言簡(jiǎn)介(續(xù))
——查詢語句數(shù)據(jù)庫基礎(chǔ)知識(shí)第27頁/共64頁10.2通過JDBC訪問數(shù)據(jù)庫JDBC(JavaDataBaseConnectivity)是用于執(zhí)行SQL語句的Java應(yīng)用程序接口,由一組用Java語言編寫的類與接口組成,是一種底層API
使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序用JDBC寫的程序能夠自動(dòng)地將SQL語句傳送給幾乎任何一種數(shù)據(jù)庫管理系統(tǒng)(DBMS)第28頁/共64頁JDBC(JavaDataBaseConnectivity)是一種規(guī)范,它讓各數(shù)據(jù)庫廠商為Java程序員提供標(biāo)準(zhǔn)的數(shù)據(jù)庫訪問類和接口,這樣就使得獨(dú)立于DBMS的Java應(yīng)用開發(fā)工具和產(chǎn)品成為可能隔離了Java與不同數(shù)據(jù)庫之間的對(duì)話,使得程序員只須寫一遍程序就可讓它在任何數(shù)據(jù)庫管理系統(tǒng)平臺(tái)上運(yùn)行使用已有的SQL標(biāo)準(zhǔn),并支持其它數(shù)據(jù)庫連接標(biāo)準(zhǔn),如與ODBC之間的橋接10.2通過JDBC訪問數(shù)據(jù)庫(續(xù))
——JDBC通過JDBC訪問數(shù)據(jù)庫第29頁/共64頁Java程序通過JDBC訪問數(shù)據(jù)庫的關(guān)系通過JDBC訪問數(shù)據(jù)庫10.2通過JDBC訪問數(shù)據(jù)庫(續(xù))第30頁/共64頁ODBC(OpenDatabaseConnectivity)由微軟公司提出,用于在數(shù)據(jù)庫管理系統(tǒng)(DBMS)中存取數(shù)據(jù)是一套用C語言實(shí)現(xiàn)的訪問數(shù)據(jù)庫的API通過ODBCAPI,應(yīng)用程序可以存取保存在多種不同數(shù)據(jù)庫管理系統(tǒng)(DBMS)中的數(shù)據(jù),而不論每個(gè)DBMS使用了何種數(shù)據(jù)存儲(chǔ)格式和編程接口對(duì)于沒有提供JDBC驅(qū)動(dòng)的數(shù)據(jù)庫,從Java程序調(diào)用本地的C程序訪問數(shù)據(jù)庫會(huì)帶來一系列安全性、完整性、健壯性等方面的問題,因而通過JDBC-ODBC橋來訪問沒有提供JDBC接口的數(shù)據(jù)庫是一個(gè)常用的方案10.1.2通過JDBC訪問數(shù)據(jù)庫(續(xù))
——ODBC通過JDBC訪問數(shù)據(jù)庫第31頁/共64頁ODBC的結(jié)構(gòu)應(yīng)用程序(Application):本身不直接與數(shù)據(jù)庫打交道,主要負(fù)責(zé)處理并調(diào)用ODBC函數(shù),發(fā)送對(duì)數(shù)據(jù)庫的SQL請(qǐng)求及取得結(jié)果驅(qū)動(dòng)器管理器(ODBCmanager):為應(yīng)用程序裝載數(shù)據(jù)庫驅(qū)動(dòng)器數(shù)據(jù)庫驅(qū)動(dòng)器(ODBCDrivers):實(shí)現(xiàn)ODBC的函數(shù)調(diào)用,提供對(duì)特定數(shù)據(jù)源的SQL請(qǐng)求。數(shù)據(jù)源(DataSources,數(shù)據(jù)庫):由用戶想要存取的數(shù)據(jù)以及與它相關(guān)的操作系統(tǒng)、DBMS和用于訪問DBMS的網(wǎng)絡(luò)平臺(tái)組成。訪問數(shù)據(jù)庫的模式你的程序<-->ODBC管理器<-->ODBC驅(qū)動(dòng)程序<-->數(shù)據(jù)庫10.1.2通過JDBC訪問數(shù)據(jù)庫(續(xù))
——ODBC的結(jié)構(gòu)通過JDBC訪問數(shù)據(jù)庫第32頁/共64頁ODBC的不足是一個(gè)C語言實(shí)現(xiàn)的API,并不適合在Java中直接使用。從Java程序調(diào)用本地的C程序會(huì)帶來一系列類似安全性、完整性、健壯性的缺點(diǎn)完全精確地實(shí)現(xiàn)從C代碼ODBC到JavaAPI寫的ODBC的翻譯也并不令人滿意。比如,Java沒有指針,而ODBC中大量地使用了指針,包括極易出錯(cuò)的無類型指針“void*”。ODBC并不容易學(xué)習(xí),它將簡(jiǎn)單特性和復(fù)雜特性混雜在一起,甚至對(duì)非常簡(jiǎn)單的查詢都有復(fù)雜的選項(xiàng)。而JDBC剛好相反,它保持了簡(jiǎn)單事物的簡(jiǎn)單性,但又允許復(fù)雜的特性10.2通過JDBC訪問數(shù)據(jù)庫(續(xù))
——ODBC的不足通過JDBC訪問數(shù)據(jù)庫第33頁/共64頁JDBCAPI是一組由Java語言編寫的類和接口,包含在java.sql和javax.sql兩個(gè)包中java.sql為核心包,這個(gè)包包含于J2SE中javax.sql包擴(kuò)展了JDBCAPI的功能,成為了J2EE的一個(gè)基本組成部分可分為兩個(gè)層次面向底層的JDBCDriverAPI主要是針對(duì)數(shù)據(jù)庫廠商開發(fā)數(shù)據(jù)庫底層驅(qū)動(dòng)程序使用面向程序員的JDBCAPI10.2通過JDBC訪問數(shù)據(jù)庫(續(xù))
——JDBCAPI通過JDBC訪問數(shù)據(jù)庫第34頁/共64頁應(yīng)用程序通過JDBCAPI和底層的JDBCDriverAPI打交道10.2通過JDBC訪問數(shù)據(jù)庫(續(xù))
——JDBCAPI的體系結(jié)構(gòu)通過JDBC訪問數(shù)據(jù)庫第35頁/共64頁面向程序員的JDBCAPI可以完成以下主要任務(wù)首先建立和數(shù)據(jù)源的連接然后向其傳送查詢和修改等SQL命令最后處理數(shù)據(jù)源返回的SQL執(zhí)行的結(jié)果10.2通過JDBC訪問數(shù)據(jù)庫(續(xù))
——JDBC
API的任務(wù)通過JDBC訪問數(shù)據(jù)庫第36頁/共64頁名稱解釋DriverManager處理驅(qū)動(dòng)的調(diào)入并且對(duì)產(chǎn)生新的數(shù)據(jù)庫連接提供支持DataSource在JDBC2.0API中被推薦使用代替DriverManager實(shí)現(xiàn)和數(shù)據(jù)庫的連接Connection代表對(duì)特定數(shù)據(jù)庫的連接Statement代表一個(gè)特定的容器,容納并執(zhí)行一條SQL語句ResultSet控制執(zhí)行查詢語句得到的結(jié)果集10.2通過JDBC訪問數(shù)據(jù)庫(續(xù))
——JDBC
API中重要的接口和類通過JDBC訪問數(shù)據(jù)庫第37頁/共64頁一個(gè)基本的JDBC程序開發(fā)包含如下步驟設(shè)置環(huán)境,引入相應(yīng)的JDBC類選擇合適的JDBC驅(qū)動(dòng)程序并加載分配一個(gè)Connection對(duì)象分配一個(gè)Statement對(duì)象用該Statement對(duì)象進(jìn)行查詢等操作從返回的ResultSet對(duì)象中獲取相應(yīng)的數(shù)據(jù)關(guān)閉Connection10.2通過JDBC訪問數(shù)據(jù)庫(續(xù))
——JDBC程序開發(fā)步驟通過JDBC訪問數(shù)據(jù)庫第38頁/共64頁10.2.1設(shè)置環(huán)境在本機(jī)上安裝有關(guān)數(shù)據(jù)庫軟件下載相應(yīng)數(shù)據(jù)庫驅(qū)動(dòng)程序并安裝在Java程序中引入相應(yīng)的類和包。任何使用JDBC的源程序都需要引入java.sql包,如必要的時(shí)候還需要裝載相應(yīng)的JDBC-ODBC驅(qū)動(dòng)程序的包importjava.sql.*;importsun.jdbc.odbc.JdbcOdbcDriver;通過JDBC訪問數(shù)據(jù)庫第39頁/共64頁通過JDBC-ODBC橋訪問數(shù)據(jù)庫安裝Java和JDBCAPI安裝JDK的同時(shí)就自動(dòng)安裝了安裝數(shù)據(jù)庫驅(qū)動(dòng)程序安裝JDK的同時(shí)就自動(dòng)安裝了安裝JDBC-ODBC橋驅(qū)動(dòng)程序安裝DBMS建立一個(gè)數(shù)據(jù)庫,并注冊(cè)數(shù)據(jù)源10.2.1設(shè)置環(huán)境(續(xù))
——通過JDBC-ODBC橋訪問數(shù)據(jù)庫通過JDBC訪問數(shù)據(jù)庫第40頁/共64頁1.確定數(shù)據(jù)源名稱和說明。依次進(jìn)入本機(jī)的控制面板——>管理工具——>數(shù)據(jù)源(ODBC),彈出“ODBC數(shù)據(jù)源管理器”對(duì)話框,單擊“系統(tǒng)DSN”選項(xiàng)卡,選擇”Add”按鈕10.2.1設(shè)置環(huán)境(續(xù))
——注冊(cè)數(shù)據(jù)源通過JDBC訪問數(shù)據(jù)庫第41頁/共64頁2.單擊“添加”按鈕后彈出“創(chuàng)建數(shù)據(jù)源”對(duì)話框,選擇“MicrosoftAccessDriver”選項(xiàng)。單擊“完成”按鈕后,彈出“ODBCMicrosoftAccess安裝”對(duì)話框,在“數(shù)據(jù)源名”輸入框中填寫“PIMS”;在“說明”輸入中填寫“員工信息管理系統(tǒng)”;單擊選擇按鈕,彈出“選擇數(shù)據(jù)庫”對(duì)話框,在目錄中選定剛剛建好的數(shù)據(jù)庫文件“PMS.mdb”10.2.1設(shè)置環(huán)境(續(xù))
——注冊(cè)數(shù)據(jù)源通過JDBC訪問數(shù)據(jù)庫第42頁/共64頁3.單擊“高級(jí)”按鈕,彈出“設(shè)置高級(jí)選項(xiàng)”對(duì)話框,在“登錄名稱”文本編輯框中設(shè)定登陸名稱為“Test”,在“密碼”文本編輯框中設(shè)定密碼為“1234”。依次確定返回到“ODBC數(shù)據(jù)源管理器”對(duì)話框,這時(shí)可以發(fā)現(xiàn)“系統(tǒng)數(shù)據(jù)源”選項(xiàng)中增添了一個(gè)新確定的數(shù)據(jù)源“PIMS”,單擊“ODBCMicrosoftAccess”對(duì)話框的“確定”按鈕,就完成了數(shù)據(jù)源的注冊(cè)10.2.1設(shè)置環(huán)境(續(xù))
——注冊(cè)數(shù)據(jù)源通過JDBC訪問數(shù)據(jù)庫第43頁/共64頁10.2.2建立連接
——裝載驅(qū)動(dòng)器接下來要建立和DBMS的連接。包括兩個(gè)步驟裝載驅(qū)動(dòng)器,用Class.forName方法顯式裝載驅(qū)動(dòng)程序,如:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");以完整的Java類名字符串為參數(shù),裝載此類,并返回一個(gè)Class對(duì)象描述此類執(zhí)行上述代碼時(shí)將自動(dòng)創(chuàng)建一個(gè)驅(qū)動(dòng)器類的實(shí)例,并自動(dòng)調(diào)用驅(qū)動(dòng)器管理器DriverManager類中的RegisterDriver方法來注冊(cè)它這里“sun.jdbc.odbc.JdbcOdbcDriver”是驅(qū)動(dòng)器類的名字,可以從驅(qū)動(dòng)程序的說明文檔中得到需要注意的是,如果驅(qū)動(dòng)器類有可能不存在,使用此方法就可能會(huì)拋出ClassNotFoundException異常,因此需要捕獲這個(gè)異常:try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){System.out.println(e.getMessage);}通過JDBC訪問數(shù)據(jù)庫第44頁/共64頁10.2.2建立連接(續(xù))
——建立連接建立與數(shù)據(jù)庫的連接,調(diào)用DriverManager.getConnection()方法。例如,我們要連接上一節(jié)創(chuàng)建的Access數(shù)據(jù)庫PIMS,語句如下:Connectioncon=DriverManager.getConnection("jdbc:odbc:PIMS","test","1234");將返回與指定數(shù)據(jù)庫建立的連接該方法有三個(gè)字符串參數(shù)第一個(gè)是JDBCURL,格式為jdbc:子協(xié)議:子名稱Jdbc表示協(xié)議,JDBCURL中的協(xié)議總是jdbc;子協(xié)議是驅(qū)動(dòng)器名稱;子名稱是數(shù)據(jù)庫的名稱,如果是位于遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫,則還應(yīng)該包括網(wǎng)絡(luò)地址,//主機(jī)名:端口/數(shù)據(jù)庫名第二個(gè)是訪問數(shù)據(jù)庫所需的用戶名第三個(gè)是用戶密碼Connection是一個(gè)接口,表示與指定數(shù)據(jù)庫的連接DriverManager類位于JDBC的管理層,作用于用戶和驅(qū)動(dòng)程序之間。它負(fù)責(zé)跟蹤在一個(gè)系統(tǒng)中所有可用的JDBC驅(qū)動(dòng)程序,并在數(shù)據(jù)庫和相應(yīng)驅(qū)動(dòng)程序之間建立連接通過JDBC訪問數(shù)據(jù)庫第45頁/共64頁10.2.3對(duì)數(shù)據(jù)庫進(jìn)行操作建立好到數(shù)據(jù)庫的連接后,就可以進(jìn)行對(duì)數(shù)據(jù)庫的操作了,一般包括如下三個(gè)步驟使用Connection對(duì)象創(chuàng)建Statement對(duì)象使用Statement對(duì)象執(zhí)行SQL命令從上一步驟返回的ResultSet對(duì)象中提取執(zhí)行結(jié)果通過JDBC訪問數(shù)據(jù)庫第46頁/共64頁Connection接口有3個(gè)方法可用來創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的對(duì)象createStatement創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的Statement對(duì)象,用于簡(jiǎn)單的SQL語句Statementstmt=con.createStatement();prepareStatement創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的PreparedStatement對(duì)象,用于帶有一個(gè)或多個(gè)參數(shù)的SQL語句。在SQL語句執(zhí)行前,這些參數(shù)將被賦值prepareCall創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的CallableStatement對(duì)象,用于調(diào)用數(shù)據(jù)庫中的存儲(chǔ)過程通過JDBC訪問數(shù)據(jù)庫10.2.3對(duì)數(shù)據(jù)庫進(jìn)行操作(續(xù))
——?jiǎng)?chuàng)建Statement對(duì)象第47頁/共64頁Statement接口提供了三種執(zhí)行SQL語句的方法,使用哪一個(gè)方法由SQL語句所產(chǎn)生的內(nèi)容決定executeQuery用于產(chǎn)生單個(gè)結(jié)果集的語句,例如SELECT語句
ResultSetrs=stmt.executeQuery("Select*FromPerson");executeUpdate用于執(zhí)行INSERT、UPDATE或DELETE語句,以及CREATETABLE
stmt.executeUpdate("DELETEFROMPersonWHEREName='李四'");返回值是一個(gè)整數(shù),表示受影響的行數(shù)(即更新計(jì)數(shù)),比如修改了多少行、刪除了多少行等。對(duì)于CREATETABLE等語句,因不涉及到行的操作,所以executeUpdate的返回值總為零Execute用于執(zhí)行返回多個(gè)結(jié)果集(ResultSet對(duì)象)、多個(gè)更新計(jì)數(shù)或二者組合的語句。例如執(zhí)行某個(gè)已存儲(chǔ)過程或動(dòng)態(tài)執(zhí)行SQL,這時(shí)有可能出現(xiàn)多個(gè)結(jié)果的情況10.2.3對(duì)數(shù)據(jù)庫進(jìn)行操作(續(xù))
——使用Statement對(duì)象執(zhí)行語句通過JDBC訪問數(shù)據(jù)庫第48頁/共64頁查詢結(jié)果作為結(jié)果集(ResultSet)對(duì)象返回后,我們可以從ResultSet對(duì)象中提取結(jié)果使用next方法ResultSet對(duì)象中含有檢索出來的行,其中有一個(gè)指示器,指向當(dāng)前可操作的行,初始狀態(tài)下指示器是指向第一行之前方法next的功能是將指示器下移一行,所以第一次調(diào)用next方法時(shí)便將指示器指向第一行,以后每一次對(duì)next的成功調(diào)用都會(huì)將指示器移向下一行10.2.3對(duì)數(shù)據(jù)庫進(jìn)行操作(續(xù))
——提取執(zhí)行結(jié)果通過JDBC訪問數(shù)據(jù)庫第49頁/共64頁使用getXXX方法使用相應(yīng)類型的getXXX方法可以從當(dāng)前行指定列中提取不同類型的數(shù)據(jù)。例如,提取VARCHAR類型數(shù)據(jù)時(shí)就要用getString方法,而提取FLOAT類型數(shù)據(jù)的方法是getFloat允許使用列名或列序號(hào)作為getXXX方法的參數(shù)Strings=rs.getString("Name");提取當(dāng)前行Name列中的數(shù)據(jù),并把其從SQL的VARCHAR類型轉(zhuǎn)換成Java的String類型,然后賦值給對(duì)象sStrings=rs.getString(2);//提取當(dāng)前行的第2列數(shù)據(jù)這里的列序號(hào)指的是結(jié)果集中的列序號(hào),而不是原表中的列序號(hào)10.2.3對(duì)數(shù)據(jù)庫進(jìn)行操作(續(xù))
——提取執(zhí)行結(jié)果通過JDBC訪問數(shù)據(jù)庫第50頁/共64頁通過JDBC訪問PIMS數(shù)據(jù)庫,進(jìn)行查詢、添加操作importjava.sql.*;publicclassex10_1{ publicstaticvoidmain(String[]args)throwsException{ StringDBDriver="sun.jdbc.odbc.JdbcOdbcDriver"; StringconnectionStr="jdbc:odbc:PIMS"; Connectioncon=null; Statementstmt=null; ResultSetrs=null;
Class.forName(DBDriver); //加載驅(qū)動(dòng)器
con=DriverManager.getConnection(connectionStr,"Test","1234");//連接數(shù)據(jù)庫
stmt=con.createStatement();//創(chuàng)建Statement對(duì)象
rs=stmt.executeQuery("Select*FromPerson");//查詢表
while(rs.next()){//顯示所有記錄的ID和姓名
System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); };10.2.3對(duì)數(shù)據(jù)庫進(jìn)行操作(續(xù))
——例10_1通過JDBC訪問數(shù)據(jù)庫第51頁/共64頁
stmt.executeUpdate("INSERTINTOPersonVALUES(9,'林時(shí)',3,'accountant',2000,4)");//添加一條記錄
System.out.println("添加數(shù)據(jù)后的信息為");
rs=stmt.executeQuery("Select*FromPerson");//查詢表格
while(rs.next()){//顯示 System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); };
stmt.executeUpdate("DELETEFROMPersonWHEREName='林時(shí)'");
System.out.println("刪除數(shù)據(jù)后的信息為:");
rs=stmt.executeQuery("Select*FromPerson");//查詢表格
while(rs.next()){//顯示
System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); }; stmt.close();//關(guān)閉語句
con.close();//關(guān)閉連接}}10.2.3對(duì)數(shù)據(jù)庫進(jìn)行操作(續(xù))
——例10_1通過JDBC訪問數(shù)據(jù)庫第52頁/共64頁執(zhí)行結(jié)果為1張三2李四3王五4韓六添加數(shù)據(jù)后的信息為:1張三2李四3王五4韓六9林時(shí)刪除數(shù)據(jù)后的信息為:1張三2李四3王五4韓六可見數(shù)據(jù)庫中的確是先增加了一條記錄,后又刪除了一條記錄10.2.3對(duì)數(shù)據(jù)庫進(jìn)行操作(續(xù))
——例10_1運(yùn)行結(jié)果通過JDBC訪問數(shù)據(jù)庫第53頁/共64頁建立員工信息輸入與統(tǒng)計(jì)界面,實(shí)現(xiàn)一個(gè)圖形用戶界面的數(shù)據(jù)庫應(yīng)用程序按“員工登記”按鈕后彈出的員工記錄錄入界面菜單“選項(xiàng)”包括“員工登記”和“員工統(tǒng)計(jì)”兩個(gè)菜單項(xiàng)。點(diǎn)擊“員工統(tǒng)計(jì)”將顯示出當(dāng)前員工數(shù)10.2.3對(duì)數(shù)據(jù)庫進(jìn)行操作(續(xù))
——例10_2通過JDBC訪問數(shù)據(jù)庫第54頁/共64頁importjavax.swing.*;importjavax.swing.border.*;importjava.awt.*;importjava.awt.event.*;importjava.sql.*;publicclassEx10_2implementsActionListener{JFramef=null;//類屬性
publicEx10_2()//構(gòu)造方法
{f=newJFrame("員工信息");//創(chuàng)建一個(gè)頂層容器
ContainercontentPane=f.getContentPane();//獲得其內(nèi)容面板
JPanelbuttonPanel=newJPanel();//創(chuàng)建一中間容器JPanelJButtonb=newJButton("員工登記");//創(chuàng)建一原子組件——按鈕
b.addActionListener(this);//為按鈕添加事件監(jiān)聽器對(duì)象
buttonPanel.add(b);//將此按鈕添加到中間容器
b=newJButton("退出系統(tǒng)");//再創(chuàng)建一按鈕
b.addActionListener(this);//為按鈕增加事件監(jiān)聽器
buttonPanel.add(b);//將按鈕添加到中間容器
buttonPanel.setBorder(BorderFactory.createTitledBorder(//設(shè)置中間容器邊框
BorderFactory.createLineBorder(Color.blue,2),"員工登記系統(tǒng)",TitledBorder.CENTER,TitledBorder.TOP));contentPane.add(buttonPanel,BorderLayout.CENTER);//將中間容器添加到內(nèi)容面板第55頁/共64頁
JMenuBarmBar=newJMenuBar();//創(chuàng)建菜單條
JMenuselection=newJMenu("選項(xiàng)");JMenuItemregist=newJMenuItem("員工登記");JMenuItemsum=newJMenuItem("統(tǒng)計(jì)");selection.add(regist);selection.add(sum);JMenusys=newJMenu("系統(tǒng)");JMenuItemexit=newJMenuItem("退出系統(tǒng)");sys.add(exit);mBar.add(selection);mBar.add(sys);f.setJMenuBar(mBar);//為窗體增加菜單
regist.addActionListener(this);//為菜單添加事件監(jiān)聽器
sum.addActionListener(this);exit.addActionListener(this);
f.pack();f.setVisible(true);
f.addWindowListener(newWindowAdapter(){//為窗口操作添加監(jiān)聽器
publicvoidwindowClosing(WindowEvente){System.exit(0);}});}第56頁/共64頁
publicvoidactionPerformed(ActionEvente){//實(shí)現(xiàn)ActionListener接口唯一的方法
Stringcmd=e.getActionCommand();//從事件對(duì)象獲得相關(guān)命令名稱
if(cmd.equals("員工登記")){//根據(jù)名稱選擇相應(yīng)事件
newRegistSystem(f);//顯示員工登記對(duì)話框
}elseif(cmd.equals("退出系統(tǒng)")){System.exit(0);}elseif(cmd.equals("統(tǒng)計(jì)")){try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加載驅(qū)動(dòng)器
Connectioncon=DriverManager.getConnection("jdbc:odbc:PIMS","Test","1234");
//和數(shù)據(jù)庫建立連接
Statementstmt=con.createStatement();//創(chuàng)建語句
ResultSetrs=stmt.executeQuery("Select*FromPerson");inti=0;while(rs.next())i=i+1;JOptionPane.showMessageDialog(f,"共有"+i+"名員工");//顯示信息對(duì)話框
stmt.close();con.close();//關(guān)閉到數(shù)據(jù)庫的連接
}catch(Exceptionex){}}}publicstaticvoidmain(String[]args)//主方法,用于創(chuàng)建Ex9_7類的一個(gè)對(duì)象
{newEx10_2();}}第57頁/共64頁
classRegistSystemimplementsActionListener//用于產(chǎn)生JDialog,實(shí)現(xiàn)事件監(jiān)聽器接口{JDialogdialog;JTextFieldtF1=newJTextField();JTextFieldtF2=newJTextField();JTextFieldtF3=newJTextField();JTextFieldtF4=newJTextField();JTextFieldtF5=newJTextField();JTextFieldtF6=newJTextField();第58頁/共64頁
RegistSystem(JFramef){//構(gòu)造方法,從其調(diào)用方法中獲得對(duì)話框的父窗口
dialog=newJDialog(f,"員工登記",true);//產(chǎn)生一modal對(duì)話框
ContainerdialogPane=dialog.getContentPane();//接下來注意添加各個(gè)組件
dialogPane.setLayout(newGridLayout(7,2));dialogPane.add(newJLabel("員工編號(hào):",SwingConstants.CENTER));dialogPane.add(tF1);dialogPane.add(newJLabel("員工姓名:",SwingConstants.CENTER));dialogPane.add(tF2);dialogPane.add(newJLabel("部門編號(hào)",SwingConstants.CENTER));dialogPane.add(tF3);dialogPane.add(newJLabel("職務(wù)",SwingConstants.CENTER));dialogPane.add(tF4);dialogPane.add(newJLabel("工資",SwingConstants.CENTER));dialogPane.add(tF5);dialogPane.add(newJLabel("學(xué)歷編號(hào)",SwingConstants.CENTER));dialogPane.add(tF6);JButtonb1=newJButton("確定");dialogPane.add(b1);JButtonb2=newJButton("取消");dialogPane.add(b2);b1.addActionListener(this);//為兩按鈕增加事件監(jiān)聽器
b2.addActionListener(this);dialog.setBounds(200,150,400,130);dialog.show();}第59頁/共64頁
publicvoidactionPerformed(ActionEvente){Stringcmd=e.getActionCommand();if(cmd.equals("確定")){try{Class.forName("sun.jdbc.odbc.Jdb
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年甲乙雙方關(guān)于虛擬現(xiàn)實(shí)旅游項(xiàng)目投資與合作協(xié)議
- 2024年版:解除婚約財(cái)產(chǎn)補(bǔ)償協(xié)議
- 銷售合同范文匯編9篇
- 超細(xì)磨剝機(jī)行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 銷售工作計(jì)劃范文合集7篇
- 中國襯套閥項(xiàng)目投資可行性研究報(bào)告
- 小學(xué)生演講稿范文【6篇】
- 漫畫漢服課程設(shè)計(jì)教案
- 六年級(jí)安全教育第一課教案
- 幼兒教育隨筆小班15篇
- 卡通風(fēng)寒假生活PPT模板課件
- 卡通兒童生日快樂成長(zhǎng)紀(jì)念相冊(cè)PPT模板
- 爾雅學(xué)習(xí)通答案法律基礎(chǔ)
- 2022年低血容量休克復(fù)蘇指南
- 細(xì)胞生物學(xué)知識(shí)點(diǎn)
- 三年級(jí)脫式計(jì)算題一至十
- H型鋼力學(xué)性能計(jì)算表
- 二年級(jí)上冊(cè)語文期末試卷
- 中小微企業(yè)融資情況調(diào)查問卷
- 西門子s7200格式s7200硬件手冊(cè)
- 時(shí)間序列分析論文
評(píng)論
0/150
提交評(píng)論