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

下載本文檔

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

文檔簡介

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

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

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

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

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

SQL語言簡介(續(xù))

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

SQL語言簡介(續(xù))

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

PRIMARYKEY,//定義該列為主碼

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

departmentINTEGER,//列定義,整型

occupationVARCHAR(10),salaryNUMBER,educationINTEGER);10.1.5

SQL語言簡介(續(xù))

——建表語句數(shù)據(jù)庫基礎(chǔ)知識第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語言簡介(續(xù))

——插入語句數(shù)據(jù)庫基礎(chǔ)知識第23頁/共64頁修改語句修改指定記錄中某列的值,更新表中原有數(shù)據(jù)其格式為UPDATEtable_nameSETcolumn_name=new_value

WHEREcolumn_name=some_value例如:將person表中id號為1的人員的工資修改為3700元UPDATEpersonSETsalary=3700//指定對哪列進行修改、如何修改WHEREid=1;//選擇要修改的行10.1.5

SQL語言簡介(續(xù))

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

10.1.5

SQL語言簡介(續(xù))

——刪除語句數(shù)據(jù)庫基礎(chǔ)知識第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語言簡介(續(xù))

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

SQL語言簡介(續(xù))

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

使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應用程序用JDBC寫的程序能夠自動地將SQL語句傳送給幾乎任何一種數(shù)據(jù)庫管理系統(tǒng)(DBMS)第28頁/共64頁JDBC(JavaDataBaseConnectivity)是一種規(guī)范,它讓各數(shù)據(jù)庫廠商為Java程序員提供標準的數(shù)據(jù)庫訪問類和接口,這樣就使得獨立于DBMS的Java應用開發(fā)工具和產(chǎn)品成為可能隔離了Java與不同數(shù)據(jù)庫之間的對話,使得程序員只須寫一遍程序就可讓它在任何數(shù)據(jù)庫管理系統(tǒng)平臺上運行使用已有的SQL標準,并支持其它數(shù)據(jù)庫連接標準,如與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語言實現(xiàn)的訪問數(shù)據(jù)庫的API通過ODBCAPI,應用程序可以存取保存在多種不同數(shù)據(jù)庫管理系統(tǒng)(DBMS)中的數(shù)據(jù),而不論每個DBMS使用了何種數(shù)據(jù)存儲格式和編程接口對于沒有提供JDBC驅(qū)動的數(shù)據(jù)庫,從Java程序調(diào)用本地的C程序訪問數(shù)據(jù)庫會帶來一系列安全性、完整性、健壯性等方面的問題,因而通過JDBC-ODBC橋來訪問沒有提供JDBC接口的數(shù)據(jù)庫是一個常用的方案10.1.2通過JDBC訪問數(shù)據(jù)庫(續(xù))

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

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

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

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

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

——JDBC

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

——JDBC

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

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

——通過JDBC-ODBC橋訪問數(shù)據(jù)庫通過JDBC訪問數(shù)據(jù)庫第40頁/共64頁1.確定數(shù)據(jù)源名稱和說明。依次進入本機的控制面板——>管理工具——>數(shù)據(jù)源(ODBC),彈出“ODBC數(shù)據(jù)源管理器”對話框,單擊“系統(tǒng)DSN”選項卡,選擇”Add”按鈕10.2.1設置環(huán)境(續(xù))

——注冊數(shù)據(jù)源通過JDBC訪問數(shù)據(jù)庫第41頁/共64頁2.單擊“添加”按鈕后彈出“創(chuàng)建數(shù)據(jù)源”對話框,選擇“MicrosoftAccessDriver”選項。單擊“完成”按鈕后,彈出“ODBCMicrosoftAccess安裝”對話框,在“數(shù)據(jù)源名”輸入框中填寫“PIMS”;在“說明”輸入中填寫“員工信息管理系統(tǒng)”;單擊選擇按鈕,彈出“選擇數(shù)據(jù)庫”對話框,在目錄中選定剛剛建好的數(shù)據(jù)庫文件“PMS.mdb”10.2.1設置環(huán)境(續(xù))

——注冊數(shù)據(jù)源通過JDBC訪問數(shù)據(jù)庫第42頁/共64頁3.單擊“高級”按鈕,彈出“設置高級選項”對話框,在“登錄名稱”文本編輯框中設定登陸名稱為“Test”,在“密碼”文本編輯框中設定密碼為“1234”。依次確定返回到“ODBC數(shù)據(jù)源管理器”對話框,這時可以發(fā)現(xiàn)“系統(tǒng)數(shù)據(jù)源”選項中增添了一個新確定的數(shù)據(jù)源“PIMS”,單擊“ODBCMicrosoftAccess”對話框的“確定”按鈕,就完成了數(shù)據(jù)源的注冊10.2.1設置環(huán)境(續(xù))

——注冊數(shù)據(jù)源通過JDBC訪問數(shù)據(jù)庫第43頁/共64頁10.2.2建立連接

——裝載驅(qū)動器接下來要建立和DBMS的連接。包括兩個步驟裝載驅(qū)動器,用Class.forName方法顯式裝載驅(qū)動程序,如:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");以完整的Java類名字符串為參數(shù),裝載此類,并返回一個Class對象描述此類執(zhí)行上述代碼時將自動創(chuàng)建一個驅(qū)動器類的實例,并自動調(diào)用驅(qū)動器管理器DriverManager類中的RegisterDriver方法來注冊它這里“sun.jdbc.odbc.JdbcOdbcDriver”是驅(qū)動器類的名字,可以從驅(qū)動程序的說明文檔中得到需要注意的是,如果驅(qū)動器類有可能不存在,使用此方法就可能會拋出ClassNotFoundException異常,因此需要捕獲這個異常: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ù)庫建立的連接該方法有三個字符串參數(shù)第一個是JDBCURL,格式為jdbc:子協(xié)議:子名稱Jdbc表示協(xié)議,JDBCURL中的協(xié)議總是jdbc;子協(xié)議是驅(qū)動器名稱;子名稱是數(shù)據(jù)庫的名稱,如果是位于遠程服務器上的數(shù)據(jù)庫,則還應該包括網(wǎng)絡地址,//主機名:端口/數(shù)據(jù)庫名第二個是訪問數(shù)據(jù)庫所需的用戶名第三個是用戶密碼Connection是一個接口,表示與指定數(shù)據(jù)庫的連接DriverManager類位于JDBC的管理層,作用于用戶和驅(qū)動程序之間。它負責跟蹤在一個系統(tǒng)中所有可用的JDBC驅(qū)動程序,并在數(shù)據(jù)庫和相應驅(qū)動程序之間建立連接通過JDBC訪問數(shù)據(jù)庫第45頁/共64頁10.2.3對數(shù)據(jù)庫進行操作建立好到數(shù)據(jù)庫的連接后,就可以進行對數(shù)據(jù)庫的操作了,一般包括如下三個步驟使用Connection對象創(chuàng)建Statement對象使用Statement對象執(zhí)行SQL命令從上一步驟返回的ResultSet對象中提取執(zhí)行結(jié)果通過JDBC訪問數(shù)據(jù)庫第46頁/共64頁Connection接口有3個方法可用來創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的對象createStatement創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的Statement對象,用于簡單的SQL語句Statementstmt=con.createStatement();prepareStatement創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的PreparedStatement對象,用于帶有一個或多個參數(shù)的SQL語句。在SQL語句執(zhí)行前,這些參數(shù)將被賦值prepareCall創(chuàng)建向數(shù)據(jù)庫發(fā)送SQL語句的CallableStatement對象,用于調(diào)用數(shù)據(jù)庫中的存儲過程通過JDBC訪問數(shù)據(jù)庫10.2.3對數(shù)據(jù)庫進行操作(續(xù))

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

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

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

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

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

——提取執(zhí)行結(jié)果通過JDBC訪問數(shù)據(jù)庫第50頁/共64頁通過JDBC訪問PIMS數(shù)據(jù)庫,進行查詢、添加操作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ū)動器

con=DriverManager.getConnection(connectionStr,"Test","1234");//連接數(shù)據(jù)庫

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

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

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

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

——例10_1通過JDBC訪問數(shù)據(jù)庫第51頁/共64頁

stmt.executeUpdate("INSERTINTOPersonVALUES(9,'林時',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='林時'");

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對數(shù)據(jù)庫進行操作(續(xù))

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

——例10_1運行結(jié)果通過JDBC訪問數(shù)據(jù)庫第53頁/共64頁建立員工信息輸入與統(tǒng)計界面,實現(xiàn)一個圖形用戶界面的數(shù)據(jù)庫應用程序按“員工登記”按鈕后彈出的員工記錄錄入界面菜單“選項”包括“員工登記”和“員工統(tǒng)計”兩個菜單項。點擊“員工統(tǒng)計”將顯示出當前員工數(shù)10.2.3對數(shù)據(jù)庫進行操作(續(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)建一個頂層容器

ContainercontentPane=f.getContentPane();//獲得其內(nèi)容面板

JPanelbuttonPanel=newJPanel();//創(chuàng)建一中間容器JPanelJButtonb=newJButton("員工登記");//創(chuàng)建一原子組件——按鈕

b.addActionListener(this);//為按鈕添加事件監(jiān)聽器對象

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

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

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

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

buttonPanel.setBorder(BorderFactory.createTitledBorder(//設置中間容器邊框

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("選項");JMenuItemregist=newJMenuItem("員工登記");JMenuItemsum=newJMenuItem("統(tǒng)計");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){//實現(xiàn)ActionListener接口唯一的方法

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

if(cmd.equals("員工登記")){//根據(jù)名稱選擇相應事件

newRegistSystem(f);//顯示員工登記對話框

}elseif(cmd.equals("退出系統(tǒng)")){System.exit(0);}elseif(cmd.equals("統(tǒng)計")){try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加載驅(qū)動器

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+"名員工");//顯示信息對話框

stmt.close();con.close();//關(guān)閉到數(shù)據(jù)庫的連接

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

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

classRegistSystemimplementsActionListener//用于產(chǎn)生JDialog,實現(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)用方法中獲得對話框的父窗口

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

ContainerdialogPane=dialog.getContentPane();//接下來注意添加各個組件

dialogPane.setLayout(newGridLayout(7,2));dialogPane.add(newJLabel("員工編號:",SwingConstants.CENTER));dialogPane.add(tF1);dialogPane.add(newJLabel("員工姓名:",SwingConstants.CENTER));dialogPane.add(tF2);dialogPane.add(newJLabel("部門編號",SwingConstants.CENTER));dialogPane.add(tF3);dialogPane.add(newJLabel("職務",SwingConstants.CENTER));dialogPane.add(tF4);dialogPane.add(newJLabel("工資",SwingConstants.CENTER));dialogPane.add(tF5);dialogPane.add(newJLabel("學歷編號",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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論