Java語(yǔ)言程序設(shè)計(jì)JDBC與數(shù)據(jù)庫(kù)訪問(wèn)_第1頁(yè)
Java語(yǔ)言程序設(shè)計(jì)JDBC與數(shù)據(jù)庫(kù)訪問(wèn)_第2頁(yè)
Java語(yǔ)言程序設(shè)計(jì)JDBC與數(shù)據(jù)庫(kù)訪問(wèn)_第3頁(yè)
Java語(yǔ)言程序設(shè)計(jì)JDBC與數(shù)據(jù)庫(kù)訪問(wèn)_第4頁(yè)
Java語(yǔ)言程序設(shè)計(jì)JDBC與數(shù)據(jù)庫(kù)訪問(wèn)_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

會(huì)計(jì)學(xué)1Java語(yǔ)言程序設(shè)計(jì)JDBC與數(shù)據(jù)庫(kù)訪問(wèn)目錄10.1數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)10.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)10.3本章小結(jié)第1頁(yè)/共64頁(yè)10.1數(shù)據(jù)庫(kù)基礎(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ù)庫(kù)管理以數(shù)據(jù)為中心組織數(shù)據(jù),減少冗余,并提供更高的數(shù)據(jù)共享能力,由數(shù)據(jù)庫(kù)系統(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頁(yè)/共64頁(yè)10.1.1數(shù)據(jù)庫(kù)技術(shù)的特點(diǎn)數(shù)據(jù)庫(kù)技術(shù)有如下一些特點(diǎn)面向企業(yè)或部門(mén),以數(shù)據(jù)為中心組織數(shù)據(jù),形成綜合性的數(shù)據(jù)庫(kù)為各應(yīng)用共享采用一定的數(shù)據(jù)模型。數(shù)據(jù)模型不僅要描述數(shù)據(jù)本身的特點(diǎn),而且要描述數(shù)據(jù)之間的聯(lián)系數(shù)據(jù)冗余小,易修改、易擴(kuò)充。不同的應(yīng)用程序根據(jù)處理要求,從數(shù)據(jù)庫(kù)中獲取需要的數(shù)據(jù),這樣就減少了數(shù)據(jù)的重復(fù)存貯,也便于維護(hù)數(shù)據(jù)的一致性程序和數(shù)據(jù)有較高的獨(dú)立性。當(dāng)數(shù)據(jù)的物理結(jié)構(gòu)和邏輯結(jié)構(gòu)改變時(shí),有可能不影響或較少影響應(yīng)用程序具有良好的用戶(hù)接口,用戶(hù)可方便地開(kāi)發(fā)和使用數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)進(jìn)行統(tǒng)一管理和控制,提供了數(shù)據(jù)的安全性、完整性、以及并發(fā)控制數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第3頁(yè)/共64頁(yè)10.1.1數(shù)據(jù)庫(kù)技術(shù)的特點(diǎn)(續(xù))應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)的基本模式DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))是數(shù)據(jù)庫(kù)的核心軟件。數(shù)據(jù)庫(kù)系統(tǒng)的各種操作,包括創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象、檢索和修改數(shù)據(jù)庫(kù)中的數(shù)據(jù),都是通過(guò)DBMS實(shí)現(xiàn)的數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第4頁(yè)/共64頁(yè)10.1.2數(shù)據(jù)模型數(shù)據(jù)模型數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)所有的數(shù)據(jù)庫(kù)系統(tǒng)都是基于某種數(shù)據(jù)模型的不同種類(lèi)的數(shù)據(jù)庫(kù)可能支持不同的數(shù)據(jù)模型關(guān)系數(shù)據(jù)庫(kù)就是因?yàn)橹С株P(guān)系模型而得名數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第5頁(yè)/共64頁(yè)關(guān)系模型形象地說(shuō)就是二維表結(jié)構(gòu),也稱(chēng)之為關(guān)系表一個(gè)關(guān)系數(shù)據(jù)庫(kù)可以包含多個(gè)關(guān)系表,關(guān)系表是數(shù)據(jù)庫(kù)中組織和存儲(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ù)類(lèi)型10.1.2數(shù)據(jù)模型數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第6頁(yè)/共64頁(yè)10.1.2數(shù)據(jù)模型學(xué)生表由5列組成,每一列表示學(xué)生的一個(gè)屬性每個(gè)學(xué)生都是用學(xué)號(hào)、姓名、性別、出生年月及所屬系的系號(hào)等屬性來(lái)描述,在這些屬性上的一組合法取值就對(duì)應(yīng)一個(gè)學(xué)生記錄(表中的一行)數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第7頁(yè)/共64頁(yè)10.1.3關(guān)系表中的主碼與外來(lái)碼主碼為了保證關(guān)系表中沒(méi)有重復(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)象,姓名就不能用來(lái)做為主碼數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第8頁(yè)/共64頁(yè)10.1.3關(guān)系表中的主碼與外來(lái)碼(續(xù))外來(lái)碼現(xiàn)實(shí)世界中事物之間的聯(lián)系反映到數(shù)據(jù)庫(kù)中就體現(xiàn)為表之間的聯(lián)系,在關(guān)系數(shù)據(jù)庫(kù)中,借助“外來(lái)碼”實(shí)現(xiàn)存貯這種聯(lián)系的信息如果一個(gè)表中的某一列是另外一個(gè)表中的主碼,那么該列稱(chēng)之為外來(lái)碼。例如在學(xué)生表中,“系號(hào)”就是外來(lái)碼,因?yàn)橄堤?hào)是系表的主碼,在學(xué)生表中設(shè)計(jì)了“系號(hào)”一列,就是為了存儲(chǔ)學(xué)生和系之間的聯(lián)系信息通過(guò)外來(lái)碼和主碼的等值連接將不同表里的相關(guān)記錄連接在一起,從而實(shí)現(xiàn)數(shù)據(jù)庫(kù)中相關(guān)數(shù)據(jù)的查找可以查詢(xún)每個(gè)學(xué)生所在系的信息,也可以查詢(xún)指定系所包含的學(xué)生信息數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第9頁(yè)/共64頁(yè)NumberNameDepartmentSalaryLocation23603Jones4131100New

Jersey24568Kerwin4132000NewJersey34589Larson6421800LosAngeles35761Myers6111400Orlando47132Neumann4139000NewJersey78321Stephens6118500OrlandoRowColumnPrimarykey10.1.3關(guān)系表中的主碼與外來(lái)碼(續(xù))數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第10頁(yè)/共64頁(yè)該數(shù)據(jù)庫(kù)中建有員工基本信息表(person)包括工作證號(hào)、姓名、部門(mén)編號(hào)、職務(wù)、工資、學(xué)歷編號(hào)等字段工作證號(hào)(ID)是該表的主碼Department列是一個(gè)外來(lái)碼,匹配部門(mén)編碼表中的DepID主碼Education列也是一個(gè)外來(lái)碼,匹配學(xué)歷編碼表中的EduID主碼部門(mén)編碼表(department)保存了部門(mén)編號(hào)和部門(mén)名稱(chēng)部門(mén)編號(hào)(DepID)是主碼學(xué)歷編碼表(education)保存了學(xué)歷編號(hào)和學(xué)歷名稱(chēng)學(xué)歷編號(hào)(EduID)是主碼10.1.3關(guān)系表中的主碼與外來(lái)碼(續(xù))

——員工信息管理系統(tǒng)(PIMS)的例子數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第11頁(yè)/共64頁(yè)10.1.3關(guān)系表中的主碼與外來(lái)碼(續(xù))

——員工信息管理系統(tǒng)(PIMS)的例子數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第12頁(yè)/共64頁(yè)10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫(kù)建立數(shù)據(jù)庫(kù)需要借助于數(shù)據(jù)庫(kù)管理系統(tǒng),不同的數(shù)據(jù)庫(kù)管理系統(tǒng)其具體操作方法是不同的,以Windows平臺(tái)上的一個(gè)簡(jiǎn)單的關(guān)系型數(shù)據(jù)庫(kù)Access為例,建立一個(gè)數(shù)據(jù)庫(kù),為編寫(xiě)Java的數(shù)據(jù)庫(kù)訪問(wèn)程序提供一個(gè)實(shí)例環(huán)境1.啟動(dòng)Office的MicrosoftAccess,選擇“新建一個(gè)Access數(shù)據(jù)庫(kù)選項(xiàng)”,在文件名輸入欄中輸入“PMS.mdb”。該文件代表一個(gè)Access數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第13頁(yè)/共64頁(yè)10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫(kù)PMS數(shù)據(jù)庫(kù)窗口出現(xiàn)在Access主窗口中。在數(shù)據(jù)庫(kù)窗口的左側(cè),列出了常用的7類(lèi)數(shù)據(jù)庫(kù)對(duì)象。當(dāng)選中某對(duì)象類(lèi)后,就可以在右窗口中進(jìn)行有關(guān)該對(duì)象的操作,如建立、修改,運(yùn)行等。7類(lèi)對(duì)象的主要含義分別是:表-關(guān)系表,可以實(shí)現(xiàn)的操作包括表的建立、數(shù)據(jù)的維護(hù)、查詢(xún)等查詢(xún)-可以建立一個(gè)查詢(xún)(視圖的概念),還可以運(yùn)行SQL語(yǔ)句窗體-數(shù)據(jù)庫(kù)應(yīng)用界面,可進(jìn)行簡(jiǎn)單數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)報(bào)表-報(bào)表的制作與打印輸出頁(yè)-可生成基于web頁(yè)面的數(shù)據(jù)庫(kù)應(yīng)用界面宏-可定義完成特定任務(wù)的操作或操作集模塊-可定義數(shù)據(jù)庫(kù)中使用的公共過(guò)程與函數(shù)數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第14頁(yè)/共64頁(yè)10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫(kù)2.在對(duì)象欄中選擇“表”,再選擇“使用設(shè)計(jì)器創(chuàng)建表”方式,單擊工具欄中的“設(shè)計(jì)”按鈕,就會(huì)出現(xiàn)表設(shè)計(jì)窗口。在該窗口中可以定義字段的名稱(chēng)、數(shù)據(jù)類(lèi)型、字段說(shuō)明信息等。分別設(shè)計(jì)Person表、Department表、Education表數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第15頁(yè)/共64頁(yè)10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第16頁(yè)/共64頁(yè)10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫(kù)3.建立表之間的聯(lián)系點(diǎn)擊主窗口“工具”菜單中的“關(guān)系”選項(xiàng),打開(kāi)“關(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ù)庫(kù)基礎(chǔ)知識(shí)第17頁(yè)/共64頁(yè)10.1.4建立一個(gè)實(shí)例數(shù)據(jù)庫(kù)4.為每個(gè)表創(chuàng)建數(shù)據(jù)

數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第18頁(yè)/共64頁(yè)10.1.5SQL語(yǔ)言簡(jiǎn)介SQL語(yǔ)言關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言,從大型數(shù)據(jù)庫(kù)(如Oracle)到微機(jī)數(shù)據(jù)庫(kù)(如Access)都支持可以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的各種操作。例如表及其他數(shù)據(jù)庫(kù)對(duì)象的定義數(shù)據(jù)的查詢(xún)與數(shù)據(jù)維護(hù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行控制是非過(guò)程化的語(yǔ)言,只需要告訴數(shù)據(jù)庫(kù)做什么,而不需要描述怎么做語(yǔ)句都是獨(dú)立執(zhí)行的,無(wú)上下文聯(lián)系本身不區(qū)分大小寫(xiě)數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第19頁(yè)/共64頁(yè)10.1.5

SQL語(yǔ)言簡(jiǎn)介(續(xù))

——SQL關(guān)鍵字?jǐn)?shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第20頁(yè)/共64頁(yè)在SQL語(yǔ)言中,對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的操作可分為讀寫(xiě)兩種讀操作(查詢(xún))通過(guò)SELECT語(yǔ)句實(shí)現(xiàn),該語(yǔ)句的執(zhí)行不會(huì)改變數(shù)據(jù)庫(kù)中的數(shù)據(jù)可以返回一行或多行數(shù)據(jù)也可能沒(méi)有返回結(jié)果(沒(méi)有查到滿(mǎn)足條件的記錄)寫(xiě)操作,涉及到寫(xiě)操作的語(yǔ)句共有3個(gè)INSERTUPDATEDELETE10.1.5

SQL語(yǔ)言簡(jiǎn)介(續(xù))

——SQL語(yǔ)言的讀/寫(xiě)操作數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第21頁(yè)/共64頁(yè)建表語(yǔ)句定義表中各列的名稱(chēng)及數(shù)據(jù)類(lèi)型有關(guān)列的數(shù)據(jù)類(lèi)型可參考具體數(shù)據(jù)庫(kù)的語(yǔ)法手冊(cè)CREATETABLEperson(idINTEGER

PRIMARYKEY,//定義該列為主碼

nameVARCHAR(10),//列定義,字符型

departmentINTEGER,//列定義,整型

occupationVARCHAR(10),salaryNUMBER,educationINTEGER);10.1.5

SQL語(yǔ)言簡(jiǎn)介(續(xù))

——建表語(yǔ)句數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第22頁(yè)/共64頁(yè)插入語(yǔ)句向指定表插入一條記錄,插入的值要與表的定義匹配插入一行數(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語(yǔ)言簡(jiǎn)介(續(xù))

——插入語(yǔ)句數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第23頁(yè)/共64頁(yè)修改語(yǔ)句修改指定記錄中某列的值,更新表中原有數(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語(yǔ)言簡(jiǎn)介(續(xù))

——修改語(yǔ)句數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第24頁(yè)/共64頁(yè)刪除語(yǔ)句刪除表中的指定的數(shù)據(jù)其格式為DELETEFROMtable_nameWHEREcolumn_name=some_value例如刪除部門(mén)號(hào)為4的員工記錄DELETEFROMpersonWHEREdepartment=4;

10.1.5

SQL語(yǔ)言簡(jiǎn)介(續(xù))

——?jiǎng)h除語(yǔ)句數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第25頁(yè)/共64頁(yè)查詢(xún)語(yǔ)句從指定表中取出指定的數(shù)據(jù)SELECTselect_list[INTOnew_table]FROMtable_source[WHEREsearch_condition][GROUPBYgroup_by_expression][HAVINGsearch_condition][ORDERBYorder_expression[ASC|DESC]]10.1.5

SQL語(yǔ)言簡(jiǎn)介(續(xù))

——查詢(xún)語(yǔ)句數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第26頁(yè)/共64頁(yè)例:查詢(xún)工資大于2000的員工的姓名及職務(wù)SELECT*//“*”號(hào)表示輸出全部列的值FROMperson//指定查詢(xún)的表,本查詢(xún)只用到person表WHEREsalary>2000;//查詢(xún)條件例:查詢(xún)員工“張三”的學(xué)歷,輸出學(xué)歷名SELECTFROMperson,education//該查詢(xún)用到兩個(gè)表WHERE='張三'ANDcation=id;10.1.5

SQL語(yǔ)言簡(jiǎn)介(續(xù))

——查詢(xún)語(yǔ)句數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)第27頁(yè)/共64頁(yè)10.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)JDBC(JavaDataBaseConnectivity)是用于執(zhí)行SQL語(yǔ)句的Java應(yīng)用程序接口,由一組用Java語(yǔ)言編寫(xiě)的類(lèi)與接口組成,是一種底層API

使開(kāi)發(fā)人員可以用純Java語(yǔ)言編寫(xiě)完整的數(shù)據(jù)庫(kù)應(yīng)用程序用JDBC寫(xiě)的程序能夠自動(dòng)地將SQL語(yǔ)句傳送給幾乎任何一種數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)第28頁(yè)/共64頁(yè)JDBC(JavaDataBaseConnectivity)是一種規(guī)范,它讓各數(shù)據(jù)庫(kù)廠商為Java程序員提供標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)訪問(wèn)類(lèi)和接口,這樣就使得獨(dú)立于DBMS的Java應(yīng)用開(kāi)發(fā)工具和產(chǎn)品成為可能隔離了Java與不同數(shù)據(jù)庫(kù)之間的對(duì)話,使得程序員只須寫(xiě)一遍程序就可讓它在任何數(shù)據(jù)庫(kù)管理系統(tǒng)平臺(tái)上運(yùn)行使用已有的SQL標(biāo)準(zhǔn),并支持其它數(shù)據(jù)庫(kù)連接標(biāo)準(zhǔn),如與ODBC之間的橋接10.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)(續(xù))

——JDBC通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第29頁(yè)/共64頁(yè)Java程序通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)的關(guān)系通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)10.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)(續(xù))第30頁(yè)/共64頁(yè)ODBC(OpenDatabaseConnectivity)由微軟公司提出,用于在數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中存取數(shù)據(jù)是一套用C語(yǔ)言實(shí)現(xiàn)的訪問(wèn)數(shù)據(jù)庫(kù)的API通過(guò)ODBCAPI,應(yīng)用程序可以存取保存在多種不同數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中的數(shù)據(jù),而不論每個(gè)DBMS使用了何種數(shù)據(jù)存儲(chǔ)格式和編程接口對(duì)于沒(méi)有提供JDBC驅(qū)動(dòng)的數(shù)據(jù)庫(kù),從Java程序調(diào)用本地的C程序訪問(wèn)數(shù)據(jù)庫(kù)會(huì)帶來(lái)一系列安全性、完整性、健壯性等方面的問(wèn)題,因而通過(guò)JDBC-ODBC橋來(lái)訪問(wèn)沒(méi)有提供JDBC接口的數(shù)據(jù)庫(kù)是一個(gè)常用的方案10.1.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)(續(xù))

——ODBC通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第31頁(yè)/共64頁(yè)ODBC的結(jié)構(gòu)應(yīng)用程序(Application):本身不直接與數(shù)據(jù)庫(kù)打交道,主要負(fù)責(zé)處理并調(diào)用ODBC函數(shù),發(fā)送對(duì)數(shù)據(jù)庫(kù)的SQL請(qǐng)求及取得結(jié)果驅(qū)動(dòng)器管理器(ODBCmanager):為應(yīng)用程序裝載數(shù)據(jù)庫(kù)驅(qū)動(dòng)器數(shù)據(jù)庫(kù)驅(qū)動(dòng)器(ODBCDrivers):實(shí)現(xiàn)ODBC的函數(shù)調(diào)用,提供對(duì)特定數(shù)據(jù)源的SQL請(qǐng)求。數(shù)據(jù)源(DataSources,數(shù)據(jù)庫(kù)):由用戶(hù)想要存取的數(shù)據(jù)以及與它相關(guān)的操作系統(tǒng)、DBMS和用于訪問(wèn)DBMS的網(wǎng)絡(luò)平臺(tái)組成。訪問(wèn)數(shù)據(jù)庫(kù)的模式你的程序<-->ODBC管理器<-->ODBC驅(qū)動(dòng)程序<-->數(shù)據(jù)庫(kù)10.1.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)(續(xù))

——ODBC的結(jié)構(gòu)通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第32頁(yè)/共64頁(yè)ODBC的不足是一個(gè)C語(yǔ)言實(shí)現(xiàn)的API,并不適合在Java中直接使用。從Java程序調(diào)用本地的C程序會(huì)帶來(lái)一系列類(lèi)似安全性、完整性、健壯性的缺點(diǎn)完全精確地實(shí)現(xiàn)從C代碼ODBC到JavaAPI寫(xiě)的ODBC的翻譯也并不令人滿(mǎn)意。比如,Java沒(méi)有指針,而ODBC中大量地使用了指針,包括極易出錯(cuò)的無(wú)類(lèi)型指針“void*”。ODBC并不容易學(xué)習(xí),它將簡(jiǎn)單特性和復(fù)雜特性混雜在一起,甚至對(duì)非常簡(jiǎn)單的查詢(xún)都有復(fù)雜的選項(xiàng)。而JDBC剛好相反,它保持了簡(jiǎn)單事物的簡(jiǎn)單性,但又允許復(fù)雜的特性10.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)(續(xù))

——ODBC的不足通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第33頁(yè)/共64頁(yè)JDBCAPI是一組由Java語(yǔ)言編寫(xiě)的類(lèi)和接口,包含在java.sql和javax.sql兩個(gè)包中java.sql為核心包,這個(gè)包包含于J2SE中javax.sql包擴(kuò)展了JDBCAPI的功能,成為了J2EE的一個(gè)基本組成部分可分為兩個(gè)層次面向底層的JDBCDriverAPI主要是針對(duì)數(shù)據(jù)庫(kù)廠商開(kāi)發(fā)數(shù)據(jù)庫(kù)底層驅(qū)動(dòng)程序使用面向程序員的JDBCAPI10.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)(續(xù))

——JDBCAPI通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第34頁(yè)/共64頁(yè)應(yīng)用程序通過(guò)JDBCAPI和底層的JDBCDriverAPI打交道10.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)(續(xù))

——JDBCAPI的體系結(jié)構(gòu)通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第35頁(yè)/共64頁(yè)面向程序員的JDBCAPI可以完成以下主要任務(wù)首先建立和數(shù)據(jù)源的連接然后向其傳送查詢(xún)和修改等SQL命令最后處理數(shù)據(jù)源返回的SQL執(zhí)行的結(jié)果10.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)(續(xù))

——JDBC

API的任務(wù)通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第36頁(yè)/共64頁(yè)名稱(chēng)解釋DriverManager處理驅(qū)動(dòng)的調(diào)入并且對(duì)產(chǎn)生新的數(shù)據(jù)庫(kù)連接提供支持DataSource在JDBC2.0API中被推薦使用代替DriverManager實(shí)現(xiàn)和數(shù)據(jù)庫(kù)的連接Connection代表對(duì)特定數(shù)據(jù)庫(kù)的連接Statement代表一個(gè)特定的容器,容納并執(zhí)行一條SQL語(yǔ)句ResultSet控制執(zhí)行查詢(xún)語(yǔ)句得到的結(jié)果集10.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)(續(xù))

——JDBC

API中重要的接口和類(lèi)通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第37頁(yè)/共64頁(yè)一個(gè)基本的JDBC程序開(kāi)發(fā)包含如下步驟設(shè)置環(huán)境,引入相應(yīng)的JDBC類(lèi)選擇合適的JDBC驅(qū)動(dòng)程序并加載分配一個(gè)Connection對(duì)象分配一個(gè)Statement對(duì)象用該Statement對(duì)象進(jìn)行查詢(xún)等操作從返回的ResultSet對(duì)象中獲取相應(yīng)的數(shù)據(jù)關(guān)閉Connection10.2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)(續(xù))

——JDBC程序開(kāi)發(fā)步驟通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第38頁(yè)/共64頁(yè)10.2.1設(shè)置環(huán)境在本機(jī)上安裝有關(guān)數(shù)據(jù)庫(kù)軟件下載相應(yīng)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序并安裝在Java程序中引入相應(yīng)的類(lèi)和包。任何使用JDBC的源程序都需要引入java.sql包,如必要的時(shí)候還需要裝載相應(yīng)的JDBC-ODBC驅(qū)動(dòng)程序的包importjava.sql.*;importsun.jdbc.odbc.JdbcOdbcDriver;通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第39頁(yè)/共64頁(yè)通過(guò)JDBC-ODBC橋訪問(wèn)數(shù)據(jù)庫(kù)安裝Java和JDBCAPI安裝JDK的同時(shí)就自動(dòng)安裝了安裝數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序安裝JDK的同時(shí)就自動(dòng)安裝了安裝JDBC-ODBC橋驅(qū)動(dòng)程序安裝DBMS建立一個(gè)數(shù)據(jù)庫(kù),并注冊(cè)數(shù)據(jù)源10.2.1設(shè)置環(huán)境(續(xù))

——通過(guò)JDBC-ODBC橋訪問(wèn)數(shù)據(jù)庫(kù)通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第40頁(yè)/共64頁(yè)1.確定數(shù)據(jù)源名稱(chēng)和說(shuō)明。依次進(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ù)源通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第41頁(yè)/共64頁(yè)2.單擊“添加”按鈕后彈出“創(chuàng)建數(shù)據(jù)源”對(duì)話框,選擇“MicrosoftAccessDriver”選項(xiàng)。單擊“完成”按鈕后,彈出“ODBCMicrosoftAccess安裝”對(duì)話框,在“數(shù)據(jù)源名”輸入框中填寫(xiě)“PIMS”;在“說(shuō)明”輸入中填寫(xiě)“員工信息管理系統(tǒng)”;單擊選擇按鈕,彈出“選擇數(shù)據(jù)庫(kù)”對(duì)話框,在目錄中選定剛剛建好的數(shù)據(jù)庫(kù)文件“PMS.mdb”10.2.1設(shè)置環(huán)境(續(xù))

——注冊(cè)數(shù)據(jù)源通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第42頁(yè)/共64頁(yè)3.單擊“高級(jí)”按鈕,彈出“設(shè)置高級(jí)選項(xiàng)”對(duì)話框,在“登錄名稱(chēng)”文本編輯框中設(shè)定登陸名稱(chēng)為“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ù)源通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第43頁(yè)/共64頁(yè)10.2.2建立連接

——裝載驅(qū)動(dòng)器接下來(lái)要建立和DBMS的連接。包括兩個(gè)步驟裝載驅(qū)動(dòng)器,用Class.forName方法顯式裝載驅(qū)動(dòng)程序,如:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");以完整的Java類(lèi)名字符串為參數(shù),裝載此類(lèi),并返回一個(gè)Class對(duì)象描述此類(lèi)執(zhí)行上述代碼時(shí)將自動(dòng)創(chuàng)建一個(gè)驅(qū)動(dòng)器類(lèi)的實(shí)例,并自動(dòng)調(diào)用驅(qū)動(dòng)器管理器DriverManager類(lèi)中的RegisterDriver方法來(lái)注冊(cè)它這里“sun.jdbc.odbc.JdbcOdbcDriver”是驅(qū)動(dòng)器類(lèi)的名字,可以從驅(qū)動(dòng)程序的說(shuō)明文檔中得到需要注意的是,如果驅(qū)動(dòng)器類(lèi)有可能不存在,使用此方法就可能會(huì)拋出ClassNotFoundException異常,因此需要捕獲這個(gè)異常:try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){System.out.println(e.getMessage);}通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第44頁(yè)/共64頁(yè)10.2.2建立連接(續(xù))

——建立連接建立與數(shù)據(jù)庫(kù)的連接,調(diào)用DriverManager.getConnection()方法。例如,我們要連接上一節(jié)創(chuàng)建的Access數(shù)據(jù)庫(kù)PIMS,語(yǔ)句如下:Connectioncon=DriverManager.getConnection("jdbc:odbc:PIMS","test","1234");將返回與指定數(shù)據(jù)庫(kù)建立的連接該方法有三個(gè)字符串參數(shù)第一個(gè)是JDBCURL,格式為jdbc:子協(xié)議:子名稱(chēng)Jdbc表示協(xié)議,JDBCURL中的協(xié)議總是jdbc;子協(xié)議是驅(qū)動(dòng)器名稱(chēng);子名稱(chēng)是數(shù)據(jù)庫(kù)的名稱(chēng),如果是位于遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫(kù),則還應(yīng)該包括網(wǎng)絡(luò)地址,//主機(jī)名:端口/數(shù)據(jù)庫(kù)名第二個(gè)是訪問(wèn)數(shù)據(jù)庫(kù)所需的用戶(hù)名第三個(gè)是用戶(hù)密碼Connection是一個(gè)接口,表示與指定數(shù)據(jù)庫(kù)的連接DriverManager類(lèi)位于JDBC的管理層,作用于用戶(hù)和驅(qū)動(dòng)程序之間。它負(fù)責(zé)跟蹤在一個(gè)系統(tǒng)中所有可用的JDBC驅(qū)動(dòng)程序,并在數(shù)據(jù)庫(kù)和相應(yīng)驅(qū)動(dòng)程序之間建立連接通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第45頁(yè)/共64頁(yè)10.2.3對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作建立好到數(shù)據(jù)庫(kù)的連接后,就可以進(jìn)行對(duì)數(shù)據(jù)庫(kù)的操作了,一般包括如下三個(gè)步驟使用Connection對(duì)象創(chuàng)建Statement對(duì)象使用Statement對(duì)象執(zhí)行SQL命令從上一步驟返回的ResultSet對(duì)象中提取執(zhí)行結(jié)果通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第46頁(yè)/共64頁(yè)Connection接口有3個(gè)方法可用來(lái)創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的對(duì)象createStatement創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的Statement對(duì)象,用于簡(jiǎn)單的SQL語(yǔ)句Statementstmt=con.createStatement();prepareStatement創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的PreparedStatement對(duì)象,用于帶有一個(gè)或多個(gè)參數(shù)的SQL語(yǔ)句。在SQL語(yǔ)句執(zhí)行前,這些參數(shù)將被賦值prepareCall創(chuàng)建向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句的CallableStatement對(duì)象,用于調(diào)用數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)10.2.3對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作(續(xù))

——?jiǎng)?chuàng)建Statement對(duì)象第47頁(yè)/共64頁(yè)Statement接口提供了三種執(zhí)行SQL語(yǔ)句的方法,使用哪一個(gè)方法由SQL語(yǔ)句所產(chǎn)生的內(nèi)容決定executeQuery用于產(chǎn)生單個(gè)結(jié)果集的語(yǔ)句,例如SELECT語(yǔ)句

ResultSetrs=stmt.executeQuery("Select*FromPerson");executeUpdate用于執(zhí)行INSERT、UPDATE或DELETE語(yǔ)句,以及CREATETABLE

stmt.executeUpdate("DELETEFROMPersonWHEREName='李四'");返回值是一個(gè)整數(shù),表示受影響的行數(shù)(即更新計(jì)數(shù)),比如修改了多少行、刪除了多少行等。對(duì)于CREATETABLE等語(yǔ)句,因不涉及到行的操作,所以executeUpdate的返回值總為零Execute用于執(zhí)行返回多個(gè)結(jié)果集(ResultSet對(duì)象)、多個(gè)更新計(jì)數(shù)或二者組合的語(yǔ)句。例如執(zhí)行某個(gè)已存儲(chǔ)過(guò)程或動(dòng)態(tài)執(zhí)行SQL,這時(shí)有可能出現(xiàn)多個(gè)結(jié)果的情況10.2.3對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作(續(xù))

——使用Statement對(duì)象執(zhí)行語(yǔ)句通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第48頁(yè)/共64頁(yè)查詢(xún)結(jié)果作為結(jié)果集(ResultSet)對(duì)象返回后,我們可以從ResultSet對(duì)象中提取結(jié)果使用next方法ResultSet對(duì)象中含有檢索出來(lái)的行,其中有一個(gè)指示器,指向當(dāng)前可操作的行,初始狀態(tài)下指示器是指向第一行之前方法next的功能是將指示器下移一行,所以第一次調(diào)用next方法時(shí)便將指示器指向第一行,以后每一次對(duì)next的成功調(diào)用都會(huì)將指示器移向下一行10.2.3對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作(續(xù))

——提取執(zhí)行結(jié)果通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第49頁(yè)/共64頁(yè)使用getXXX方法使用相應(yīng)類(lèi)型的getXXX方法可以從當(dāng)前行指定列中提取不同類(lèi)型的數(shù)據(jù)。例如,提取VARCHAR類(lèi)型數(shù)據(jù)時(shí)就要用getString方法,而提取FLOAT類(lèi)型數(shù)據(jù)的方法是getFloat允許使用列名或列序號(hào)作為getXXX方法的參數(shù)Strings=rs.getString("Name");提取當(dāng)前行Name列中的數(shù)據(jù),并把其從SQL的VARCHAR類(lèi)型轉(zhuǎn)換成Java的String類(lèi)型,然后賦值給對(duì)象sStrings=rs.getString(2);//提取當(dāng)前行的第2列數(shù)據(jù)這里的列序號(hào)指的是結(jié)果集中的列序號(hào),而不是原表中的列序號(hào)10.2.3對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作(續(xù))

——提取執(zhí)行結(jié)果通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第50頁(yè)/共64頁(yè)通過(guò)JDBC訪問(wèn)PIMS數(shù)據(jù)庫(kù),進(jìn)行查詢(xú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ù)庫(kù)

stmt=con.createStatement();//創(chuàng)建Statement對(duì)象

rs=stmt.executeQuery("Select*FromPerson");//查詢(xún)表

while(rs.next()){//顯示所有記錄的ID和姓名

System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); };10.2.3對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作(續(xù))

——例10_1通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第51頁(yè)/共64頁(yè)

stmt.executeUpdate("INSERTINTOPersonVALUES(9,'林時(shí)',3,'accountant',2000,4)");//添加一條記錄

System.out.println("添加數(shù)據(jù)后的信息為");

rs=stmt.executeQuery("Select*FromPerson");//查詢(xún)表格

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");//查詢(xún)表格

while(rs.next()){//顯示

System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); }; stmt.close();//關(guān)閉語(yǔ)句

con.close();//關(guān)閉連接}}10.2.3對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作(續(xù))

——例10_1通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第52頁(yè)/共64頁(yè)執(zhí)行結(jié)果為1張三2李四3王五4韓六添加數(shù)據(jù)后的信息為:1張三2李四3王五4韓六9林時(shí)刪除數(shù)據(jù)后的信息為:1張三2李四3王五4韓六可見(jiàn)數(shù)據(jù)庫(kù)中的確是先增加了一條記錄,后又刪除了一條記錄10.2.3對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作(續(xù))

——例10_1運(yùn)行結(jié)果通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第53頁(yè)/共64頁(yè)建立員工信息輸入與統(tǒng)計(jì)界面,實(shí)現(xiàn)一個(gè)圖形用戶(hù)界面的數(shù)據(jù)庫(kù)應(yīng)用程序按“員工登記”按鈕后彈出的員工記錄錄入界面菜單“選項(xiàng)”包括“員工登記”和“員工統(tǒng)計(jì)”兩個(gè)菜單項(xiàng)。點(diǎn)擊“員工統(tǒng)計(jì)”將顯示出當(dāng)前員工數(shù)10.2.3對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作(續(xù))

——例10_2通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)第54頁(yè)/共64頁(yè)importjavax.swing.*;importjavax.swing.border.*;importjava.awt.*;importjava.awt.event.*;importjava.sql.*;publicclassEx10_2implementsActionListener{JFramef=null;//類(lèi)屬性

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)聽(tīng)器對(duì)象

buttonPanel.add(b);//將此按鈕添加到中間容器

b=newJButton("退出系統(tǒng)");//再創(chuàng)建一按鈕

b.addActionListener(this);//為按鈕增加事件監(jiān)聽(tīng)器

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頁(yè)/共64頁(yè)

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)聽(tīng)器

sum.addActionListener(this);exit.addActionListener(this);

f.pack();f.setVisible(true);

f.addWindowListener(newWindowAdapter(){//為窗口操作添加監(jiān)聽(tīng)器

publicvoidwindowClosing(WindowEvente){System.exit(0);}});}第56頁(yè)/共64頁(yè)

publicvoidactionPerformed(ActionEvente){//實(shí)現(xiàn)ActionListener接口唯一的方法

Stringcmd=e.getActionCommand();//從事件對(duì)象獲得相關(guān)命令名稱(chēng)

if(cmd.equals("員工登記")){//根據(jù)名稱(chēng)選擇相應(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ù)庫(kù)建立連接

Statementstmt=con.createStatement();//創(chuàng)建語(yǔ)句

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ù)庫(kù)的連接

}catch(Exceptionex){}}}publicstaticvoidmain(String[]args)//主方法,用于創(chuàng)建Ex9_7類(lèi)的一個(gè)對(duì)象

{newEx10_2();}}第57頁(yè)/共64頁(yè)

classRegistSystemimplementsActionListener//用于產(chǎn)生JDialog,實(shí)現(xiàn)事件監(jiān)聽(tīng)器接口{JDialogdialog;JTextFieldtF1=newJTextField();JTextFieldtF2=newJTextField();JTextFieldtF3=newJTextField();JTextFieldtF4=newJTextField();JTextFieldtF5=newJTextField();JTextFieldtF6=newJTextField();第58頁(yè)/共64頁(yè)

RegistSystem(JFramef){//構(gòu)造方法,從其調(diào)用方法中獲得對(duì)話框的父窗口

dialog=newJDialog(f,"員工登記",true);//產(chǎn)生一modal對(duì)話框

ContainerdialogPane=dialog.getContentPane();//接下來(lái)注意添加各個(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("部門(mén)編號(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)聽(tīng)器

b2.addActionListener(this);dialog.setBounds(200,150,400,130);dialog.show();}第59頁(yè)/共64頁(yè)

publicvoidactionPerformed(ActionEvente){Stringcmd=e.getActionCommand();if(cmd.equals("確定")){try{Class.forName("sun.jdbc.odbc.Jdb

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論