




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第10章JDBC與數據庫訪問目錄10.1數據庫根底知識10.2通過JDBC訪問數據庫10.3JavaDB10.4本章小結10.1數據庫根底知識數據管理的兩個階段文件管理各種數據都是以文件為單位存儲在外存,且由操作系統統一管理文件相對獨立,文件結構不能很好地反映現實世界中事物之間的聯系,文件中存在大量的數據冗余數據庫管理以數據為中心組織數據,減少冗余,并提供更高的數據共享能力,由數據庫系統進行管理程序和數據具有較高的獨立性,當數據的邏輯結構改變時,不涉及數據的物理結構,也不影響應用程序,從而降低應用程序研制與維護的費用10.1.1數據庫技術的特點數據庫技術有如下一些特點面向企業或部門,以數據為中心組織數據,形成綜合性的數據庫為各應用共享采用一定的數據模型。數據模型不僅要描述數據本身的特點,而且要描述數據之間的聯系數據冗余小,易修改、易擴充。不同的應用程序根據處理要求,從數據庫中獲取需要的數據,這樣就減少了數據的重復存貯,也便于維護數據的一致性程序和數據有較高的獨立性。當數據的物理結構和邏輯結構改變時,有可能不影響或較少影響應用程序具有良好的用戶接口,用戶可方便地開發和使用數據庫對數據進行統一管理和控制,提供了數據的平安性、完整性、以及并發控制數據庫根底知識10.1.1數據庫技術的特點(續)應用程序訪問數據庫的根本模式DBMS〔數據庫管理系統〕是數據庫的核心軟件。數據庫系統的各種操作,包括創立數據庫對象、檢索和修改數據庫中的數據,都是通過DBMS實現的數據庫應用程序1數據庫應用程序2數據庫應用程序3DBMS數據庫數據庫根底知識10.1.2數據模型數據模型數據庫的邏輯結構所有的數據庫系統都是基于某種數據模型的不同種類的數據庫可能支持不同的數據模型關系數據庫就是因為支持關系模型而得名數據庫根底知識10.1.2數據模型關系模型形象地說就是二維表結構,也稱之為關系表一個關系數據庫可以包含多個關系表,關系表是數據庫中組織和存儲數據的根本單位每個表都用于存儲面向某個主題的信息。例如:學生表 存儲學生信息系表 存儲各系的信息課程表 存儲課程信息等關系表每一行存儲一個記錄,每一列表示記錄的一個屬性。設計一個關系表時需要為表命名設計表的列結構,其中包括列名及列的數據類型數據庫根底知識10.1.2數據模型學生表由5列組成,每一列表示學生的一個屬性每個學生都是用學號、姓名、性別、出生年月及所屬系的系號等屬性來描述,在這些屬性上的一組合法取值就對應一個學生記錄〔表中的一行〕數據庫根底知識10.1.3關系表中的主碼與外來碼主碼為了保證關系表中沒有重復的記錄,需要為關系表定義一個主碼,作用是唯一標識表中的一個記錄可以是表中的一列,也可以由幾列組合而成在建表時如果定義了主碼,系統可以對輸入該表的數據進行檢查,要求主碼不能重、也不能空〔NULL〕例如在學生表中學號可以作為主碼,因為一個學號可以唯一地確定表中的一個學生記錄由于學生中有重名現象,姓名就不能用來做為主碼數據庫根底知識10.1.3關系表中的主碼與外來碼外來碼現實世界中事物之間的聯系反映到數據庫中就表達為表之間的聯系,在關系數據庫中,借助“外來碼”實現存貯這種聯系的信息如果一個表中的某一列是另外一個表中的主碼,那么該列稱之為外來碼。例如在學生表中,“系號”就是外來碼,因為系號是系表的主碼,在學生表中設計了“系號”一列,就是為了存儲學生和系之間的聯系信息通過外來碼和主碼的等值連接將不同表里的相關記錄連接在一起,從而實現數據庫中相關數據的查找可以查詢每個學生所在系的信息,也可以查詢指定系所包含的學生信息數據庫根底知識10.1.3關系表中的主碼與外來碼NumberNameDepartmentSalaryLocation23603Jones4131100NewJersey24568Kerwin4132000NewJersey34589Larson6421800LosAngeles35761Myers6111400Orlando47132Neumann4139000NewJersey78321Stephens6118500OrlandoPrimarykeyForeign
key數據庫根底知識10.1.3關系表中的主碼與外來碼
——員工信息管理系統(PIMS)的例子該數據庫中建有員工根本信息表〔person〕包括工作證號、姓名、部門編號、職務、工資、學歷編號等字段工作證號〔ID〕是該表的主碼Department列是一個外來碼,匹配部門編碼表中的DepID主碼Education列也是一個外來碼,匹配學歷編碼表中的EduID主碼部門編碼表〔department〕保存了部門編號和部門名稱部門編號〔DepID〕是主碼學歷編碼表〔education〕保存了學歷編號和學歷名稱學歷編號〔EduID〕是主碼數據庫根底知識10.1.3關系表中的主碼與外來碼
——員工信息管理系統(PIMS)的例子personIDNameDepartmentOccupationSalaryEducation1張三1Manager350052李四2Secretary120033王五3Driver150024韓六4Engineer30004departmentDepIDName1經理室2項目部3財務部4市場部5運輸部6后勤部educationEduIDName1初中2高中3大專4本科5碩士6博士數據庫根底知識10.1.4建立一個實例數據庫建立數據庫需要借助于數據庫管理系統,不同的數據庫管理系統其具體操作方法是不同的,以Windows平臺上的一個簡單的關系型數據庫Access為例,建立一個數據庫,為編寫Java的數據庫訪問程序提供一個實例環境1.啟動Office2007,在左側“模板類別”下選擇功能,并在右側選擇“新建空白數據庫”。在文件名輸入欄中輸入“PMS.accdb”。該文件代表一個Access數據庫數據庫根底知識10.1.4建立一個實例數據庫(續)PMS數據庫窗口出現在Access主窗口中。在數據庫窗口的左側,列出了常用的7類數據庫對象。中選中某對象類后,就可以在右窗口中進行有關該對象的操作,如建立、修改,運行等。7類對象的主要含義分別是:表-關系表,可以實現的操作包括表的建立、數據的維護、查詢等查詢-可以建立一個查詢〔視圖的概念〕,還可以運行SQL語句窗體-數據庫應用界面,可進行簡單數據庫應用開發報表-報表的制作與打印輸出頁-可生成基于web頁面的數據庫應用界面宏-可定義完成特定任務的操作或操作集模塊-可定義數據庫中使用的公共過程與函數數據庫根底知識10.1.4建立一個實例數據庫(續)2.左側的對象欄中右鍵“表1:表”,再選擇“設計視圖”,確定表名后,出現如圖表設計窗口。在該窗口中可以定義字段的名稱、數據類型、字段說明信息〔可選〕等。分別設計Person表、Department表、Education表數據庫根底知識10.1.4建立一個實例數據庫(續)數據庫根底知識10.1.4建立一個實例數據庫(續)3.建立表之間的聯系點擊主窗口“數據庫工具”菜單中的“關系”選項,翻開“關系”視圖窗口用鼠標拖動Education表的EduID屬性,拉到Person表的Education屬性上,在自動彈出的“編輯關系”對話框中,選擇實施參照完整性,點擊“創立”按鈕用同樣方法建立Department表中DepID列和Person表中Department列數據庫根底知識10.1.4建立一個實例數據庫(續)4.為每個表創立數據數據庫根底知識10.1.5SQL語言簡介SQL語言關系數據庫的標準語言,從大型數據庫〔如Oracle〕到微機數據庫〔如Access〕都支持可以實現對數據庫的各種操作。例如表及其他數據庫對象的定義數據的查詢與數據維護對數據庫進行控制是非過程化的語言,只需要告訴數據庫做什么,而不需要描述怎么做語句都是獨立執行的,無上下文聯系本身不區分大小寫數據庫根底知識10.1.5SQL語言簡介(續)
——SQL關鍵字SQL關鍵字 描述SELECT 從一個或多個表中提取數據FROM SELECT查詢的數據表格WHERE 決定數據行被提取、刪除或更新的標準GROUPBY 對行進行分組的標準ORDERBY 對行進行排序的標準INNERJOIN 合并多個表格中的行INSERT 向指定表中插入行UPDATE 更新指定表中的行DELETE 刪除指定表格中的行數據庫根底知識10.1.5SQL語言簡介(續)
——SQL語言的讀/寫操作在SQL語言中,對數據庫中數據的操作可分為讀寫兩種讀操作〔查詢〕通過SELECT語句實現,該語句的執行不會改變數據庫中的數據可以返回一行或多行數據也可能沒有返回結果〔沒有查到滿足條件的記錄〕寫操作,涉及到寫操作的語句共有3個INSERTUPDATEDELETE數據庫根底知識10.1.5SQL語言簡介(續)
——建表語句建表語句定義表中各列的名稱及數據類型有關列的數據類型可參考具體數據庫的語法手冊CREATETABLEperson( idINTEGERPRIMARYKEY, //定義該列為主碼 nameVARCHAR(10), //列定義,字符型 departmentINTEGER, //列定義,整型 occupationVARCHAR(10), salaryNUMBER, educationINTEGER);數據庫根底知識10.1.5SQL語言簡介(續)
——插入語句插入語句向指定表插入一條記錄,插入的值要與表的定義匹配插入一行數據INSERTINTOtable_nameVALUES(value1,value2,....)插入一行數據在指定的字段上INSERTINTOtable_name(column1,column2,...)VALUES(value1,value2,....)例如在person表中插入一行INSERTINTOpersonVALUES(1,'張三',1,'manager',3500,5);數據庫根底知識10.1.5SQL語言簡介(續)
——修改語句修改語句修改指定記錄中某列的值,更新表中原有數據其格式為UPDATEtable_nameSETcolumn_name=new_value
WHEREcolumn_name=some_value例如:將person表中id號為1的人員的工資修改為3700元UPDATEpersonSETsalary=3700//指定對哪列進行修改、如何修改WHEREid=1;//選擇要修改的行數據庫根底知識10.1.5SQL語言簡介(續)
——刪除語句刪除語句刪除表中的指定的數據其格式為DELETEFROMtable_nameWHEREcolumn_name=some_value例如刪除部門號為4的員工記錄DELETEFROMpersonWHEREdepartment=4;數據庫根底知識10.1.5SQL語言簡介(續)
——查詢語句查詢語句從指定表中取出指定的數據SELECTselect_list[INTOnew_table]FROMtable_source[WHEREsearch_condition][GROUPBYgroup_by_expression][HAVINGsearch_condition][ORDERBYorder_expression[ASC|DESC]]數據庫根底知識10.1.5SQL語言簡介(續)
——查詢語句例:查詢工資大于2000的員工的姓名及職務SELECT* //“*”號表示輸出全部列的值FROMperson //指定查詢的表,本查詢只用到person表WHEREsalary>2000; //查詢條件例:查詢員工“張三”的學歷,輸出學歷名SELECTFROMperson,education //該查詢用到兩個表WHERE='張三'ANDcation=id;數據庫根底知識10.2通過JDBC訪問數據庫JDBC〔JavaDataBaseConnectivity〕是用于執行SQL語句的Java應用程序接口,由一組用Java語言編寫的類與接口組成,是一種底層API使開發人員可以用純Java語言編寫完整的數據庫應用程序用JDBC寫的程序能夠自動地將SQL語句傳送給幾乎任何一種數據庫管理系統〔DBMS〕10.2通過JDBC訪問數據庫(續)
——JDBCJDBC〔JavaDataBaseConnectivity〕是一種標準,它讓各數據庫廠商為Java程序員提供標準的數據庫訪問類和接口,這樣就使得獨立于DBMS的Java應用開發工具和產品成為可能隔離了Java與不同數據庫之間的對話,使得程序員只須寫一遍程序就可讓它在任何數據庫管理系統平臺上運行使用已有的SQL標準,并支持其它數據庫連接標準,如與ODBC之間的橋接通過JDBC訪問數據庫10.2通過JDBC訪問數據庫(續)Java程序通過JDBC訪問數據庫的關系應用程序(Java)Java
JDBC驅動程序(Java類)Sun
JDBC/ODBC橋(本地)ODBC驅動程序(本地)數據庫客戶機數據庫100%純Java解決方案Java-本地代碼混合解決方案通過JDBC訪問數據庫10.1.2通過JDBC訪問數據庫(續)
——ODBCODBC〔OpenDatabaseConnectivity〕由微軟公司提出,用于在數據庫管理系統(DBMS)中存取數據是一套用C語言實現的訪問數據庫的API通過ODBCAPI,應用程序可以存取保存在多種不同數據庫管理系統〔DBMS〕中的數據,而不管每個DBMS使用了何種數據存儲格式和編程接口對于沒有提供JDBC驅動的數據庫,從Java程序調用本地的C程序訪問數據庫會帶來一系列平安性、完整性、健壯性等方面的問題,因而通過JDBC-ODBC橋來訪問沒有提供JDBC接口的數據庫是一個常用的方案通過JDBC訪問數據庫10.1.2通過JDBC訪問數據庫(續)
——ODBC的結構ODBC的結構應用程序(Application):本身不直接與數據庫打交道,主要負責處理并調用ODBC函數,發送對數據庫的SQL請求及取得結果驅動器管理器(ODBCmanager):為應用程序裝載數據庫驅動器數據庫驅動器(ODBCDrivers):實現ODBC的函數調用,提供對特定數據源的SQL請求。數據源(DataSources數據庫):由用戶想要存取的數據以及與它相關的操作系統、DBMS和用于訪問DBMS的網絡平臺組成。訪問數據庫的模式你的程序<-->ODBC管理器<-->ODBC驅動程序<-->數據庫通過JDBC訪問數據庫10.2通過JDBC訪問數據庫(續)
——ODBC的缺乏ODBC的缺乏是一個C語言實現的API,并不適合在Java中直接使用。從Java程序調用本地的C程序會帶來一系列類似平安性、完整性、健壯性的缺點完全精確地實現從C代碼ODBC到JavaAPI寫的ODBC的翻譯也并不令人滿意。比方,Java沒有指針,而ODBC中大量地使用了指針,包括極易出錯的無類型指針“void*”。ODBC并不容易學習,它將簡單特性和復雜特性混雜在一起,甚至對非常簡單的查詢都有復雜的選項。而JDBC剛好相反,它保持了簡單事物的簡單性,但又允許復雜的特性通過JDBC訪問數據庫10.2通過JDBC訪問數據庫(續)
——JDBCAPIJDBCAPI是一組由Java語言編寫的類和接口,包含在java.sql和javax.sql兩個包中java.sql為核心包,這個包包含于J2SE中javax.sql包擴展了JDBCAPI的功能,成為了J2EE的一個根本組成局部可分為兩個層次面向底層的JDBCDriverAPI主要是針對數據庫廠商開發數據庫底層驅動程序使用面向程序員的JDBCAPI通過JDBC訪問數據庫10.2通過JDBC訪問數據庫(續)
——JDBCAPI的體系結構應用程序通過JDBCAPI和底層的JDBCDriverAPI打交道通過JDBC訪問數據庫10.2通過JDBC訪問數據庫(續)
——JDBCAPI的任務面向程序員的JDBCAPI可以完成以下主要任務首先建立和數據源的連接然后向其傳送查詢和修改等SQL命令最后處理數據源返回的SQL執行的結果通過JDBC訪問數據庫10.2通過JDBC訪問數據庫(續)
——JDBCAPI中重要的接口和類名稱解釋DriverManager處理驅動的調入并且對產生新的數據庫連接提供支持DataSource在JDBC2.0API中被推薦使用代替DriverManager實現和數據庫的連接Connection代表對特定數據庫的連接Statement代表一個特定的容器,容納并執行一條SQL語句ResultSet控制執行查詢語句得到的結果集通過JDBC訪問數據庫10.2通過JDBC訪問數據庫(續)
——JDBC程序開發步驟一個根本的JDBC程序開發包含如下步驟設置環境,引入相應的JDBC類選擇適宜的JDBC驅動程序并加載分配一個Connection對象分配一個Statement對象用該Statement對象進行查詢等操作從返回的ResultSet對象中獲取相應的數據關閉Connection通過JDBC訪問數據庫10.2.1設置環境在本機上安裝有關數據庫軟件下載相應數據庫驅動程序并安裝在Java程序中引入相應的類和包。任何使用JDBC的源程序都需要引入java.sql包,如必要的時候還需要裝載相應的JDBC-ODBC驅動程序的包importjava.sql.*;importsun.jdbc.odbc.JdbcOdbcDriver;通過JDBC訪問數據庫10.2.1設置環境(續)
——通過JDBC-ODBC橋訪問數據庫通過JDBC-ODBC橋訪問數據庫安裝Java和JDBCAPI安裝JDK的同時就自動安裝了安裝數據庫驅動程序安裝JDK的同時就自動安裝了安裝JDBC-ODBC橋驅動程序安裝DBMS建立一個數據庫,并注冊數據源通過JDBC訪問數據庫10.2.1設置環境(續)
——注冊數據源1.在Windows7操作系統下,依次進入本機的控制面板——>系統和平安——>管理工具——>數據源〔ODBC〕,或者在WindowsXP操作系統下,一次進入本機的控制面板——>管理工具——>數據源〔ODBC〕,彈出“ODBC數據源管理器”對話框,單擊“系統DSN”選項卡通過JDBC訪問數據庫10.2.1設置環境(續)
——注冊數據源2.單擊“添加”按鈕后彈出“創立數據源”對話框,選擇“MicrosoftAccessDriver”選項。單擊“完成”按鈕后,彈出“ODBCMicrosoftAccess安裝”對話框,在“數據源名”輸入框中填寫“PIMS”;在“說明”輸入中填寫“員工信息管理系統”;單擊選擇按鈕,彈出“選擇數據庫”對話框,在目錄中選定剛剛建好的數據庫文件“PMS.mdb”通過JDBC訪問數據庫10.2.1設置環境(續)
——注冊數據源3.單擊“高級”按鈕,彈出“設置高級選項”對話框,在“登錄名稱”文本編輯框中設定登錄名稱為“Test”,在“密碼”文本編輯框中設定密碼為“1234”。依次確定返回到“ODBC數據源管理器”對話框,這時可以發現“系統數據源”選項中增添了一個新確定的數據源“PIMS”,單擊“ODBCMicrosoftAccess”對話框的“確定”按鈕,就完成了數據源的注冊通過JDBC訪問數據庫10.2.2建立連接
——裝載驅動器接下來要建立和DBMS的連接。包括兩個步驟裝載驅動器,用Class.forName方法顯式裝載驅動程序,如:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");以完整的Java類名字符串為參數,裝載此類,并返回一個Class對象描述此類執行上述代碼時將自動創立一個驅動器類的實例,并自動調用驅動器管理器DriverManager類中的RegisterDriver方法來注冊它這里“sun.jdbc.odbc.JdbcOdbcDriver”是驅動器類的名字,可以從驅動程序的說明文檔中得到需要注意的是,如果驅動器類有可能不存在,使用此方法就可能會拋出ClassNotFoundException異常,因此需要捕獲這個異常:try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){System.out.println(e.getMessage);}通過JDBC訪問數據庫10.2.2建立連接(續)
——建立連接建立與數據庫的連接,調用DriverManager.getConnection()方法。例如,我們要連接上一節創立的Access數據庫PIMS,語句如下:Connectioncon=DriverManager.getConnection("jdbc:odbc:PIMS","test","1234");將返回與指定數據庫建立的連接該方法有三個字符串參數第一個是JDBCURL,格式為jdbc:子協議:子名稱Jdbc表示協議,JDBCURL中的協議總是jdbc;子協議是驅動器名稱;子名稱是數據庫的名稱,如果是位于遠程效勞器上的數據庫,那么還應該包括網絡地址,//主機名:端口/數據庫名第二個是訪問數據庫所需的用戶名第三個是用戶密碼Connection是一個接口,表示與指定數據庫的連接DriverManager類位于JDBC的管理層,作用于用戶和驅動程序之間。它負責跟蹤在一個系統中所有可用的JDBC驅動程序,并在數據庫和相應驅動程序之間建立連接通過JDBC訪問數據庫10.2.3對數據庫進行操作建立好到數據庫的連接后,就可以進行對數據庫的操作了,一般包括如下三個步驟使用Connection對象創立Statement對象使用Statement對象執行SQL命令從上一步驟返回的ResultSet對象中提取執行結果通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——創立Statement對象Connection接口有3個方法可用來創立向數據庫發送SQL語句的對象createStatement創立向數據庫發送SQL語句的Statement對象,用于簡單的SQL語句
Statementstmt=con.createStatement();prepareStatement創立向數據庫發送SQL語句的PreparedStatement對象,用于帶有一個或多個參數的SQL語句。在SQL語句執行前,這些參數將被賦值prepareCall創立向數據庫發送SQL語句的CallableStatement對象,用于調用數據庫中的存儲過程通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——使用Statement對象執行語句Statement接口提供了三種執行SQL語句的方法,使用哪一個方法由SQL語句所產生的內容決定executeQuery用于產生單個結果集的語句,例如SELECT語句
ResultSetrs=stmt.executeQuery("Select*FromPerson");executeUpdate用于執行INSERT、UPDATE或DELETE語句,以及CREATETABLE
stmt.executeUpdate("DELETEFROMPersonWHEREName='李四'");返回值是一個整數,表示受影響的行數〔即更新計數〕,比方修改了多少行、刪除了多少行等。對于CREATETABLE等語句,因不涉及到行的操作,所以executeUpdate的返回值總為零Execute用于執行返回多個結果集〔ResultSet對象〕、多個更新計數或二者組合的語句。例如執行某個已存儲過程或動態執行SQL,這時有可能出現多個結果的情況通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——提取執行結果查詢結果作為結果集〔ResultSet〕對象返回后,我們可以從ResultSet對象中提取結果使用next方法ResultSet對象中含有檢索出來的行,其中有一個指示器,指向當前可操作的行,初始狀態下指示器是指向第一行之前方法next的功能是將指示器下移一行,所以第一次調用next方法時便將指示器指向第一行,以后每一次對next的成功調用都會將指示器移向下一行通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——提取執行結果使用getXXX方法使用相應類型的getXXX方法可以從當前行指定列中提取不同類型的數據。例如,提取VARCHAR類型數據時就要用getString方法,而提取FLOAT類型數據的方法是getFloat允許使用列名或列序號作為getXXX方法的參數Strings=rs.getString("Name");提取當前行Name列中的數據,并把其從SQL的VARCHAR類型轉換成Java的String類型,然后賦值給對象sStrings=rs.getString(2); //提取當前行的第2列數據這里的列序號指的是結果集中的列序號,而不是原表中的列序號通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10-1通過JDBC訪問PIMS數據庫,進行查詢、添加操作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); //加載驅動器 con=DriverManager.getConnection(connectionStr,“Test”,“1234”); //連接數據庫 stmt=con.createStatement(); //創立Statement對象 rs=stmt.executeQuery(“Select*FromPerson”); //查詢表 while(rs.next()){ //顯示所有記錄的ID和姓名 System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); };通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10-1
//添加一條記錄 stmt.executeUpdate(“INSERTINTOPersonVALUES(9,‘林時’,3,‘accountant’,2000,4)”); System.out.println("添加數據后的信息為"); 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("刪除數據后的信息為:"); rs=stmt.executeQuery(“Select*FromPerson”); //查詢表格 while(rs.next()){ //顯示 System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); }; stmt.close(); //關閉語句 con.close(); //關閉連接 }}通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10_1運行結果執行結果為1張三2李四3王五4韓六添加數據后的信息為:1張三2李四3王五4韓六9林時刪除數據后的信息為:1張三2李四3王五4韓六可見數據庫中確實是先增加了一條記錄,后又刪除了一條記錄通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——getConnectiongetConnection方法的三種形式:staticConnectiongetConnection(Stringurl)staticConnectiongetConnection(Stringurl,Propertiesinfo)staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)urladatabaseurloftheformjdbc:subprotocol:subnameInfoalistofarbitrarystringtag/valuepairsasconnectionarguments;normallyatleasta"user"and"password"propertyshouldbeincluded通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10_1另一種連接方法…StringconnectionStr="jdbc:odbc:PIMS";…Propertiesprop=newProperties();prop.put("charSet","GBK"); //設置數據庫連接編碼為GBKprop.put("user","Test");prop.put("password","1234");con=DriverManager.getConnection(connectionStr,prop);
//連接數據庫…通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10_1另一種連接方法importjava.sql.*;importjava.util.Properties;publicclassJDBCPIMS{ publicstaticvoidmain(String[]args)throwsException{ StringDBDriver="sun.jdbc.odbc.JdbcOdbcDriver"; StringconnectionStr="jdbc:odbc:PIMS"; Connectioncon=null; Statementstmt=null; ResultSetrs=null; Class.forName(DBDriver); //加載驅動器
Propertiesprop=newProperties(); prop.put("charSet","GBK"); //設置數據庫連接編碼為GBK prop.put("user","Test"); prop.put("password","1234");通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10_1另一種連接方法 con=DriverManager.getConnection(connectionStr,prop); //連接數據庫 stmt=con.createStatement(); //創立Statement對象 rs=stmt.executeQuery("Select*FromPerson"); //查詢表 while(rs.next()) //顯示所有記錄的ID和姓名 { System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); } stmt.executeUpdate("INSERTINTOPersonVALUES(9,'林時',3,'accountant',2000,4)"); //添加一條記錄 System.out.println("添加數據后的信息為"); rs=stmt.executeQuery("Select*FromPerson"); //查詢表格 while(rs.next()) //顯示 { System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); }通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10_1另一種連接方法 stmt.executeUpdate("DELETEFROMPersonWHEREName='林時'");
//刪除名字為“林時”的記錄
System.out.println("刪除數據后的信息為:"); rs=stmt.executeQuery("Select*FromPerson"); //查詢表格
while(rs.next()) //顯示
{ System.out.print(rs.getInt("ID")+""); System.out.println(rs.getString("Name")+""); } stmt.close(); //關閉語句
con.close(); //關閉連接
}}通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10-2建立員工信息輸入與統計界面,實現一個圖形用戶界面的數據庫應用程序按“員工登記”按鈕后彈出的員工記錄錄入界面菜單“選項”包括“員工登記”和“員工統計”兩個菜單項。點擊“員工統計”將顯示出當前員工數通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10-2importjavax.swing.*;importjavax.swing.border.*;importjava.awt.*;importjava.awt.event.*;importjava.sql.*;publicclassEx10_2implementsActionListener{ JFramef=null; //類屬性 publicEx10_2(){ //構造方法 f=newJFrame("員工信息"); //創立一個頂層容器 ContainercontentPane=f.getContentPane(); //獲得其內容面板 JPanelbuttonPanel=newJPanel(); //創立一中間容器JPanel JButtonb=newJButton("員工登記"); //創立一原子組件——按鈕 b.addActionListener(this); //為按鈕添加事件監聽器對象 buttonPanel.add(b); //將此按鈕添加到中間容器 b=newJButton("退出系統"); //再創立一按鈕 b.addActionListener(this); //為按鈕增加事件監聽器 buttonPanel.add(b); //將按鈕添加到中間容器 buttonPanel.setBorder(BorderFactory.createTitledBorder( //設置中間容器邊 BorderFactory.createLineBorder(Color.blue,2),"員工登記系統", TitledBorder.CENTER,TitledBorder.TOP)); contentPane.add(buttonPanel,BorderLayout.CENTER); //將中間容器添加到內容面板通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10-2 JMenuBarmBar=newJMenuBar(); //創立菜單條 JMenuselection=newJMenu("選項"); JMenuItemregist=newJMenuItem("員工登記"); JMenuItemsum=newJMenuItem("統計"); selection.add(regist); selection.add(sum); JMenusys=newJMenu("系統"); JMenuItemexit=newJMenuItem("退出系統"); sys.add(exit); mBar.add(selection); mBar.add(sys); f.setJMenuBar(mBar); //為窗體增加菜單 regist.addActionListener(this); //為菜單添加事件監聽器 sum.addActionListener(this); exit.addActionListener(this); f.pack(); f.setVisible(true); f.addWindowListener(newWindowAdapter(){ //為窗口操作添加監聽器 publicvoidwindowClosing(WindowEvente){ System.exit(0); } }); }通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10-2 publicvoidactionPerformed(ActionEvente){ //實現ActionListener接口唯一的方法 Stringcmd=e.getActionCommand(); //從事件對象獲得相關命令名稱 if(cmd.equals("員工登記")){ //根據名稱選擇相應事件 newRegistSystem(f); //顯示員工登記對話框 }elseif(cmd.equals("退出系統")){ System.exit(0); }elseif(cmd.equals("統計")){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加載驅動器 //和數據庫建立連接 Connectioncon=DriverManager.getConnection("jdbc:odbc:PIMS","Test","1234"); Statementstmt=con.createStatement(); //創立語句 ResultSetrs=stmt.executeQuery("Select*FromPerson"); inti=0; while(rs.next()) i=i+1; JOptionPane.showMessageDialog(f,"共有"+i+"名員工"); //顯示信息對話框 stmt.close(); con.close(); //關閉到數據庫的連接 }catch(Exceptionex){} } } publicstaticvoidmain(String[]args) //主方法,用于創立Ex9_7類的一個對象 {newEx10_2();}}通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10-2classRegistSystemimplementsActionListener//用于產生JDialog,實現事件監聽器接口{ JDialogdialog; JTextFieldtF1=newJTextField(); JTextFieldtF2=newJTextField(); JTextFieldtF3=newJTextField(); JTextFieldtF4=newJTextField(); JTextFieldtF5=newJTextField(); JTextFieldtF6=newJTextField(); RegistSystem(JFramef){//構造方法,從其調用方法中獲得對話框的父窗口
dialog=newJDialog(f,"員工登記",true);//產生一modal對話框
ContainerdialogPane=dialog.getContentPane();//接下來注意添加各個組件
dialogPane.setLayout(newGridLayout(7,2)); dialogPane.add(newJLabel("員工編號:",SwingConstants.CENTER)); dialogPane.add(tF1);通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10-2 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);//為兩按鈕增加事件監聽器
b2.addActionListener(this); dialog.setBounds(200,150,400,130); dialog.show(); }通過JDBC訪問數據庫10.2.3對數據庫進行操作(續)
——例10-2 publicvoidactionPerformed(ActionEvente){ Stringcmd=e.getActionCommand(); if(cmd.equals("確定")){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加載驅動器 Connectioncon=DriverManager.getConnection("jdbc:odbc:PIMS","Test","1234"); Statementstmt=con.createStatement();//創立語句 intID=Integer.parseInt(tF1.getText()); Stringname=tF2.getText(); intDepID=Integer.parseInt(tF3.getText()); StringOccupation=tF4.getText(); intsalary=Integer.parseInt(tF5.getText()); intEduID=Integer.parseInt(tF6.getText()); StringSQLOrder="INSERTINTOPersonVALUES("+ID+",'" //創立SQL命令字符串 +name+"',"+DepID+",'"+Occupation+"'," +salary+","+EduID+")"; stmt.executeUpdate(SQLOrder);//添加一條記錄 stmt.close(); con.close();//關閉連接 }catch(Exceptionex){} }elseif(cmd.equals("取消")){ dialog.dispose();//直接返回主窗口 } }}通過JDBC訪問數據庫10.2.4執行帶參數的SQL語句JDBC支持帶參數的SQL語句的執行,這給SQL語句的執行帶來很大的靈活性使用該功能時不能使用Statement類對象,必須利用PreparedStatement類對象通過JDBC訪問數據庫10.2.4執行帶參數的SQL語句(續)
——例10-3importjava.sql.*;publicclassEx10_3{ publicstaticvoidmain(String[]args)throwsException{ StringDBDriver="sun.jdbc.odbc.JdbcOdbcDriver"; StringconnectionStr="jdbc:odbc:PIMS"; Class.forName(DBDriver); Connectioncon=DriverManager.getConnection(connectionStr,"Test","1234");
//設置了2個參數 Stringsq="UPDATEpersonSETsalary=?WHEREname=?"; PreparedStatementpstmt=con.prepareStatement(sq);
//為第1個參數賦值,根據參數類型的不同調用不同方法 pstmt.setInt(1,5000); pstmt.setString(2,“張三”); //為第2個參數賦值 pstmt.executeUpdate(); //執行SQL語句 pstmt.close(); //關閉語句 con.close(); //關閉連接 }}通過JDBC訪問數據庫10.3JavaDBJavaDB:從Java6開始,在JDK中自帶的數據庫采用Java實現通過JavaDB,程序員可以省掉安裝和配置外部數據庫的過程,并能方便的進行數據庫編程JavaDB的使用方式可以分為嵌入式模式和效勞器模式嵌入式模式的驅動器名為“org.apache.derby.jdbc.EmbeddedDriver”,效勞器模式的驅動器名為“org.apache.derby.jdbc.ClientDriver”10.3JavaDB(續)
——例10-4嵌入式模式JavaDBimportjava.sql.*;importjava.util.*;publicclassHelloJavaDB{ publicstaticvoidmain(String[]args){ try{ StringDBDriver="org.apache.derby.jdbc.EmbeddedDriver"; StringconnectionStr="jdbc:derby:Person;create=true"; Class.forName(DBDriver).newInsta
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 25年工廠員工安全培訓考試試題及完整答案(奪冠系列)
- 刷題計劃校對試題及答案
- 車頭燈企業制定與實施新質生產力戰略研究報告
- 高純硒化鎵行業跨境出海戰略研究報告
- 風電變流器行業直播電商戰略研究報告
- 軌道交通PIS系統行業直播電商戰略研究報告
- 鉤編機行業跨境出海戰略研究報告
- 防腐石材企業制定與實施新質生產力戰略研究報告
- 輻射高溫計行業直播電商戰略研究報告
- 人臉識別軟件服務合同標準文本
- 鼠疫防控知識宣傳課件
- 山東省國控設計集團有限公司招聘真題2024
- 公路工程資料管理辦法
- 記者證考試心理素質試題及答案
- GB/T 45417-2025汽車再生制動功能缺陷分析指南
- 2021年5月四級江蘇省人力資源管理師考試《理論知識》真題及答案
- 導學案:5.5 跨學科實踐:制作望遠鏡(學生版)
- 污水處理日常運營管理與維護方案
- 2025年河南機電職業學院單招職業技能測試題庫及參考答案
- 第11課《山地回憶》課件-2024-2025學年統編版語文七年級下冊
- 稀土磁性材料項目可行性研究報告申請備案
評論
0/150
提交評論