




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第11章JDBC連接數(shù)據(jù)庫(kù)11.1關(guān)系數(shù)據(jù)庫(kù)與SQL語(yǔ)言11.2使用JDBC連接數(shù)據(jù)庫(kù)11.3JDBC編程實(shí)例11.1關(guān)系數(shù)據(jù)庫(kù)與SQL語(yǔ)言SQL是StructuredQueryLanguage的縮寫,意思是結(jié)構(gòu)化查詢語(yǔ)言。SQL語(yǔ)言作為關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)的標(biāo)準(zhǔn)語(yǔ)言,其主要功能是同各種數(shù)據(jù)庫(kù)建立聯(lián)系并進(jìn)行操作。SQL最初是由IBM公司提出的,其主要功能是對(duì)IBM自行開發(fā)的關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行操作。11.1.1關(guān)系數(shù)據(jù)庫(kù)的基本概念顧名思義,數(shù)據(jù)庫(kù)(DataBase)是存儲(chǔ)數(shù)據(jù)的倉(cāng)庫(kù),用專業(yè)術(shù)語(yǔ)來(lái)說(shuō)它是指長(zhǎng)期存儲(chǔ)在計(jì)算機(jī)內(nèi)的、有組織的、可共享的數(shù)據(jù)集合。在關(guān)系型數(shù)據(jù)庫(kù)中,數(shù)據(jù)以記錄(Record)和字段(Field)的形式存儲(chǔ)在數(shù)據(jù)表(Table)中,由若干個(gè)數(shù)據(jù)表構(gòu)成一個(gè)數(shù)據(jù)庫(kù)。數(shù)據(jù)表是關(guān)系數(shù)據(jù)庫(kù)的一種基本數(shù)據(jù)結(jié)構(gòu)。如圖1所示,數(shù)據(jù)表在概念上很像我們?nèi)粘K褂玫亩S表格(關(guān)系代數(shù)中稱為關(guān)系)。數(shù)據(jù)表中的一行稱為一條記錄,任意一列稱為一個(gè)字段,字段有字段名與字段值之分。字段名是表的結(jié)構(gòu)部分,由它確定該列的名稱、數(shù)據(jù)類型和限制條件。圖1學(xué)生數(shù)據(jù)庫(kù)的組成及相關(guān)名詞SQL語(yǔ)言的操作對(duì)象主要是數(shù)據(jù)表。依照SQL命令操作關(guān)系型數(shù)據(jù)庫(kù)的不同功能,可將SQL命令分成數(shù)據(jù)定義語(yǔ)言DDL(DataDefinitionLanguage)、數(shù)據(jù)操縱語(yǔ)言DML(DataManipulationLanguage)、數(shù)據(jù)查詢語(yǔ)言DQL(DataQueryLanguage)和數(shù)據(jù)控制語(yǔ)言DCL(DataControlLanguage)四大類。11.1.2數(shù)據(jù)定義語(yǔ)言數(shù)據(jù)定義語(yǔ)言提供對(duì)數(shù)據(jù)庫(kù)及其數(shù)據(jù)表的創(chuàng)建、修改、刪除等操作,屬于數(shù)據(jù)定義語(yǔ)言的命令有Create、Alter和Drop。
1.創(chuàng)建數(shù)據(jù)表在SQL語(yǔ)言中,使用CREATETABLE語(yǔ)句創(chuàng)建新的數(shù)據(jù)庫(kù)表格。CREATETABLE語(yǔ)句的使用格式如下:
CREATETABLE表名(字段名l數(shù)據(jù)類型[限制條件],字段名2數(shù)據(jù)類型[限制條件],……,字段名n數(shù)據(jù)類型[限制條件])
說(shuō)明:
(1)表名是指存放數(shù)據(jù)的表格名稱;字段名是指表格中某一列的名稱,通常也稱為列名。表名和字段名都應(yīng)遵守標(biāo)識(shí)符命名規(guī)則。
(2)數(shù)據(jù)類型用來(lái)設(shè)定某一個(gè)具體列中數(shù)據(jù)的類型。
(3)所謂限制條件就是當(dāng)輸入此列數(shù)據(jù)時(shí)必須遵守的規(guī)則。這通常由系統(tǒng)給定的關(guān)鍵字來(lái)說(shuō)明。例如,使用UNIQUE關(guān)鍵字限定本列的值不能重復(fù);NOTNULL用來(lái)規(guī)定表格中該列的值不能為空;PRIMARYKEY表明該列為該表的主鍵(也稱主碼),它既限定本列的值不能重復(fù),也限定該列的值不能為空。
(4)[]表示可選項(xiàng)(下同)。例如,CREATE語(yǔ)句中的限制條件便是一個(gè)可選項(xiàng)。
2.修改數(shù)據(jù)表修改數(shù)據(jù)表包括向表中添加字段和刪除字段。這兩個(gè)操作都使用ALTER命令,但其中的關(guān)鍵字有所不同。添加字段使用的格式為:
ALTERTABLE表名ADD字段名數(shù)據(jù)類型[限制條件]刪除字段使用的格式為:
ALTERTABLE表名DROP字段名3.刪除數(shù)據(jù)表在SQL語(yǔ)言中使用DROPTABLE語(yǔ)句刪除某個(gè)表格及表格中的所有記錄,其使用格式如下:
DROPTABLE表名11.1.3數(shù)據(jù)操縱語(yǔ)言
1.向數(shù)據(jù)表中插入數(shù)據(jù)
SQL語(yǔ)言使用INSERT語(yǔ)句向數(shù)據(jù)庫(kù)表格中插入或添加新的數(shù)據(jù)行,其格式如下:
INSERTINTO表名(字段名l,……,字段名n)VALUES(值l,……,值n)
說(shuō)明:命令行中的“值”表示對(duì)應(yīng)字段的插入值。在使用時(shí)要注意字段名的個(gè)數(shù)與值的個(gè)數(shù)要嚴(yán)格對(duì)應(yīng),二者的數(shù)據(jù)類型也應(yīng)該一一對(duì)應(yīng),否則就會(huì)出現(xiàn)錯(cuò)誤。
2.?dāng)?shù)據(jù)更新語(yǔ)句
SQL語(yǔ)言使用UPDATE語(yǔ)句更新或修改滿足規(guī)定條件的現(xiàn)有記錄,使用格式如下:
UPDATE表名SET字段名l新值l[,字段名2新值2……]WHERE條件說(shuō)明:關(guān)鍵字WHERE引出更新時(shí)應(yīng)滿足的條件,即滿足此條件的字段值將被更新。在WHERE從句中可以使用所有的關(guān)系運(yùn)算符和邏輯運(yùn)算符。
3.刪除記錄語(yǔ)句
SQL語(yǔ)言使用DELETE語(yǔ)句刪除數(shù)據(jù)庫(kù)表格中的行或記錄,其使用格式如下:
DELETEFROM表名WHERE條件說(shuō)明:通常情況下,由關(guān)鍵字WHERE引出刪除時(shí)應(yīng)滿足的條件,即滿足此條件的記錄將被刪除。如果省略WHERE子句,則刪除當(dāng)前記錄。11.1.4數(shù)據(jù)查詢語(yǔ)句數(shù)據(jù)庫(kù)查詢是數(shù)據(jù)庫(kù)的核心操作。SQL語(yǔ)言提供了SELECT語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)的查詢,并以數(shù)據(jù)表的形式返回符合用戶查詢要求的結(jié)果數(shù)據(jù)。SELECT語(yǔ)句具有豐富的功能和靈活的使用方式,其一般的語(yǔ)法格式如下:
SELECT[DISTINCT]字段名l[,字段名2,……]FROM表名[WHERE條件]
其中:DISTINCT表示不輸出重復(fù)值,即當(dāng)查詢結(jié)果中有多條記錄具有相同的值時(shí),只返回滿足條件的第一條記錄值;語(yǔ)句中的字段名用來(lái)決定哪些字段將作為查詢結(jié)果返回。用戶可以按照自己的需要返回?cái)?shù)據(jù)表中的任意的字段,也可以使用通配符“*”來(lái)表示查詢結(jié)果中包含所有字段。11.2使用JDBC連接數(shù)據(jù)庫(kù)JDBC是JavaDataBaseConnectivity的縮寫,意思是Java程序連接和存取數(shù)據(jù)庫(kù)的應(yīng)用程序接口(API)。此接口是Java核心API的一部分。JDBC由一群類和接口組成,因此,通過(guò)調(diào)用這些類和接口所提供的成員方法,我們可以方便地連接各種不同的數(shù)據(jù)庫(kù),進(jìn)而使用標(biāo)準(zhǔn)的SQL命令對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢、插入、刪除、更新等操作。11.2.1JDBC結(jié)構(gòu)我們只要在Java數(shù)據(jù)庫(kù)應(yīng)用程序中指定使用某個(gè)數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序,就可以連接并存取指定的數(shù)據(jù)庫(kù)。而且,當(dāng)我們要連接幾個(gè)不同的數(shù)據(jù)庫(kù)時(shí),只需修改程序中的JDBC驅(qū)動(dòng)程序,無(wú)需對(duì)其他的程序代碼做任何改動(dòng)。JDBC的基本結(jié)構(gòu)由Java程序、JDBC管理器、驅(qū)動(dòng)程序和數(shù)據(jù)庫(kù)四部分組成,如圖2所示。在這四部分中,根據(jù)數(shù)據(jù)庫(kù)的不同,相應(yīng)的驅(qū)動(dòng)程序又可分為四種類型。圖16.2JDBC驅(qū)動(dòng)程序存取結(jié)構(gòu)
1.Java應(yīng)用程序
Java程序包括Java應(yīng)用程序和小應(yīng)用程序,主要是根據(jù)JDBC方法實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)和操作。完成的主要任務(wù)有:請(qǐng)求與數(shù)據(jù)庫(kù)建立連接;向數(shù)據(jù)庫(kù)發(fā)送SQL請(qǐng)求;為結(jié)果集定義存儲(chǔ)應(yīng)用和數(shù)據(jù)類型;查詢結(jié)果;處理錯(cuò)誤;控制傳輸、提交及關(guān)閉連接等操作。
2.JDBC管理器
JDBC管理器為我們提供了一個(gè)“驅(qū)動(dòng)程序管理器”,它能夠動(dòng)態(tài)地管理和維護(hù)數(shù)據(jù)庫(kù)查詢所需要的所有驅(qū)動(dòng)程序?qū)ο?,?shí)現(xiàn)Java程序與特定驅(qū)動(dòng)程序的連接。它完成的主要任務(wù)有:為特定數(shù)據(jù)庫(kù)選擇驅(qū)動(dòng)程序;處理JDBC初始化調(diào)用;為每個(gè)驅(qū)動(dòng)程序提供JDBC功能的入口;為JDBC調(diào)用執(zhí)行參數(shù)等。
3.驅(qū)動(dòng)程序驅(qū)動(dòng)程序處理JDBC方法,向特定數(shù)據(jù)庫(kù)發(fā)送SQL請(qǐng)求,并為Java程序獲取結(jié)果。驅(qū)動(dòng)程序可以完成下列任務(wù):建立與數(shù)據(jù)庫(kù)的連接;向數(shù)據(jù)庫(kù)發(fā)送請(qǐng)求;用戶程序請(qǐng)求時(shí),執(zhí)行翻譯;將錯(cuò)誤代碼格式化成標(biāo)準(zhǔn)的JDBC錯(cuò)誤代碼等。
4.?dāng)?shù)據(jù)庫(kù)這里的數(shù)據(jù)庫(kù)是指Java程序需要訪問(wèn)的數(shù)據(jù)庫(kù)及其數(shù)據(jù)庫(kù)管理系統(tǒng)。11.2.2四類JDBC驅(qū)動(dòng)程序當(dāng)我們想要連接數(shù)據(jù)庫(kù)并存取其中的數(shù)據(jù)時(shí),選擇適當(dāng)類型的JDBC驅(qū)動(dòng)程序是非常重要的。目前JDBC驅(qū)動(dòng)程序可細(xì)分為四種類型,如圖2所示。不同類型的JDBC驅(qū)動(dòng)程序有著不一樣的特性和使用方法。下面將說(shuō)明不同類型的JDBC驅(qū)動(dòng)程序之間的差異。
類型1:JDBC-ODBCBridge。這類驅(qū)動(dòng)程序的特色是必須在我們的計(jì)算機(jī)上事先安裝好ODBC驅(qū)動(dòng)程序,然后通過(guò)JDBC-ODBCBridge的轉(zhuǎn)換,把Java程序中使用的JDBCAPI轉(zhuǎn)換成ODBCAPI,進(jìn)而通過(guò)ODBC來(lái)存取數(shù)據(jù)庫(kù)。類型2:JDBC-NativeAPIBridge。同類型1一樣,這類驅(qū)動(dòng)程序也必須在我們的計(jì)算機(jī)上先安裝好特定的驅(qū)動(dòng)程序(類似ODBC),然后通過(guò)JDBC-NativeAPIBridge的轉(zhuǎn)換,把Java程序中使用的JDBCAPI轉(zhuǎn)換成NativeAPI,進(jìn)而存取數(shù)據(jù)庫(kù)。
類型3:JDBC-Middleware。使用這類驅(qū)動(dòng)程序時(shí)不需要在我們的計(jì)算機(jī)上安裝任何附加軟件,但是必須在安裝數(shù)據(jù)庫(kù)管理系統(tǒng)的服務(wù)器端加裝中介軟件(Middleware),這個(gè)中介軟件會(huì)負(fù)責(zé)所有存取數(shù)據(jù)庫(kù)時(shí)必要的轉(zhuǎn)換。類型4:PureJDBCDriver。使用這類驅(qū)動(dòng)程序時(shí)無(wú)需安裝任何附加的軟件(無(wú)論是我們的計(jì)算機(jī)或是數(shù)據(jù)庫(kù)服務(wù)器端),所有存取數(shù)據(jù)庫(kù)的操作都直接由JDBC驅(qū)動(dòng)程序來(lái)完成。最佳的JDBC驅(qū)動(dòng)程序類型是類型4,因?yàn)槭褂妙愋?的JDBC驅(qū)動(dòng)程序不會(huì)增加任何額外的負(fù)擔(dān),而且類型4的JDBC驅(qū)動(dòng)程序是由純Java語(yǔ)言開發(fā)而成的,因此擁有最佳的兼容性。反觀類型1和類型2的JDBC驅(qū)動(dòng)程序都必須事先安裝其他附加的軟件,若我們有30臺(tái)計(jì)算機(jī)就必須安裝30次附加軟件,這將使Java數(shù)據(jù)庫(kù)程序的兼容性大打折扣。使用類型3的JDBC驅(qū)動(dòng)程序也是不錯(cuò)的選擇,因?yàn)轭愋?的JDBC驅(qū)動(dòng)程序也是由純Java語(yǔ)言開發(fā)而成的,并且中介軟件也僅需要在服務(wù)器上安裝。因此,我們建議最好以類型3和類型4的JDBC驅(qū)動(dòng)程序?yàn)橹饕x擇,類型1和類型2的JDBC驅(qū)動(dòng)程序?yàn)榇我倪x擇。11.2.3JDBC編程要點(diǎn)在Java中使用數(shù)據(jù)庫(kù)進(jìn)行JDBC編程時(shí),Java程序中通常應(yīng)包含下述幾部分內(nèi)容:
(1)在程序的首部用import語(yǔ)句將java.sql包引入程序:
importjava.sql.*;(2)使用Class.forName()方法加載相應(yīng)數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序。若以加載jdbc-odbc橋?yàn)槔瑒t相應(yīng)的語(yǔ)句格式為:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");(3)定義JDBC的URL對(duì)象。例如:
StringconURL="jdbc:odbc:TestDB";
其中TestDB是我們?cè)O(shè)置的要?jiǎng)?chuàng)建的數(shù)據(jù)源。
(4)連接數(shù)據(jù)庫(kù)。
Connections=DriverManager.getConnection(conURL);(5)使用SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。
(6)使用close()方法解除Java與數(shù)據(jù)庫(kù)的連接并關(guān)閉數(shù)據(jù)庫(kù)。例如:
s.close();11.2.4常用的JDBC類與方法
1.DriverManage類
java.sql.DriverManager類是JDBC的管理器,負(fù)責(zé)管理JDBC驅(qū)動(dòng)程序,跟蹤可用的驅(qū)動(dòng)程序并在數(shù)據(jù)庫(kù)和相應(yīng)驅(qū)動(dòng)程序之間建立連接。如果我們要使用JDBC驅(qū)動(dòng)程序,必須加載JDBC驅(qū)動(dòng)程序并向DriverManage注冊(cè)后才能使用。加載和注冊(cè)驅(qū)動(dòng)程序可以使用Class.forName()這個(gè)方法來(lái)完成。此外,java.sql.DriverManager類還處理如驅(qū)動(dòng)程序登錄時(shí)間限制及登錄和跟蹤消息的顯示等事務(wù)。
2.Connection類
java.sql.Connection類負(fù)責(zé)建立與指定數(shù)據(jù)庫(kù)的連接。
3.Statement類
java.sql.Statement類的主要功能是將SQL命令傳送給數(shù)據(jù)庫(kù),并將SQL命令的執(zhí)行結(jié)果返回。
4.PreparedStatement類
java.sql.PreparedStatement類的對(duì)象可以代表一個(gè)預(yù)編譯的SQL語(yǔ)句,它是Statement接口的子接口。由于PreparedStatement類會(huì)將傳入的SQL命令編譯并暫存在內(nèi)存中,所以當(dāng)某一SQL命令在程序中被多次執(zhí)行時(shí),使用PreparedStatement類的對(duì)象執(zhí)行速度要快于Statement類的對(duì)象。因此,將需要多次執(zhí)行的SQL語(yǔ)句創(chuàng)建為PreparedStatement對(duì)象,可以提高效率。
PreparedStatement對(duì)象繼承Statement對(duì)象的所有功能,另外還添加一些特定的方法。
5.ResultSet類
java.sql.ResultSet類表示從數(shù)據(jù)庫(kù)中返回的結(jié)果集。當(dāng)我們使用Statement和PreparedStatement類提供的executeQuery()方法來(lái)下達(dá)Select命令以查詢數(shù)據(jù)庫(kù)時(shí),executeQuery()方法將會(huì)把數(shù)據(jù)庫(kù)響應(yīng)的查詢結(jié)果存放在ResultSet類對(duì)象中供我們使用。11.2.5安裝ODBC驅(qū)動(dòng)程序示例盡管在四類JDBC驅(qū)動(dòng)程序中,以選擇類型三和類型四的JDBC驅(qū)動(dòng)程序?yàn)樽罴?,但由于目前?guó)內(nèi)應(yīng)用較廣的數(shù)據(jù)庫(kù)是MicrosoftAccess等微軟的產(chǎn)品,因此,本小節(jié)以它為例,說(shuō)明創(chuàng)建ODBC用戶數(shù)據(jù)源的步驟。
(1)在Windows的“控制面板”中找到“ODBC(32)數(shù)據(jù)源”圖標(biāo)并雙擊之,彈出如圖3所示的“ODBC數(shù)據(jù)源管理器”對(duì)話框。圖3“ODBC數(shù)據(jù)源管理器”對(duì)話框
(2)在“用戶DSN”選項(xiàng)卡的“用戶數(shù)據(jù)源”列表中選中“MSAccessDatebase”選項(xiàng),然后單擊“添加”按鈕,彈出如圖4所示的“創(chuàng)建新數(shù)據(jù)源”對(duì)話框。圖4“創(chuàng)建新數(shù)據(jù)源”對(duì)話框
(3)在圖4中,選中“MicrosoftAccessDriver”項(xiàng),然后單擊“完成”按鈕,彈出如圖5所示的“ODBCMicrosoftAccess安裝”對(duì)話框。在此對(duì)話框中,輸入數(shù)據(jù)源名稱后,單擊“創(chuàng)建”按鈕,彈出如圖6所示的“新數(shù)據(jù)庫(kù)”對(duì)話框。如果事先已經(jīng)建好了數(shù)據(jù)庫(kù),在圖5的對(duì)話框中也可單擊“選取”按鈕,進(jìn)而指明數(shù)據(jù)庫(kù)的存放路徑。圖5“ODBCMicrosoftAccess安裝”對(duì)話框
(4)在圖6所示的“新數(shù)據(jù)庫(kù)”對(duì)話框中輸入數(shù)據(jù)庫(kù)名,選擇路徑,選擇排序,然后單擊“確定”按鈕,返回“ODBCMicrosoftAccess安裝”對(duì)話框。圖6“新數(shù)據(jù)庫(kù)”對(duì)話框
(5)在“ODBCMicrosoftAccess安裝”對(duì)話框中單擊“確定”按鈕,返回“ODBC數(shù)據(jù)源管理器”對(duì)話框,新添加的用戶數(shù)據(jù)源將出現(xiàn)在此對(duì)話框中,如圖7所示。此時(shí),單擊“確定”按鈕,新用戶數(shù)據(jù)源創(chuàng)建完成。創(chuàng)建好用戶數(shù)據(jù)源后,便可以對(duì)這個(gè)數(shù)據(jù)源進(jìn)行數(shù)據(jù)表的創(chuàng)建和修改,記錄的添加、修改和刪除等數(shù)據(jù)庫(kù)操作。圖7安裝完成后的“ODBC數(shù)據(jù)源管理器”對(duì)話框
64位操作系統(tǒng)不支持MicrosoftOLEDBProviderforJet驅(qū)動(dòng)程序,也不支持更早的MicrosoftAccessDriver(*.mdb)方式連接。所以,程序里面的鏈接字符串不能正常工作.
Win7下Access的ODBC連接直接在控制面板---管理工具----數(shù)據(jù)源(ODBC)打開數(shù)據(jù)源配置,發(fā)現(xiàn)只有SQLServer的驅(qū)動(dòng),其他的都沒(méi)有了。
解決方法是:C:/Windows/SysWOW64在這個(gè)目錄下找到:odbcad32.exe這個(gè)文件,雙擊打開。里面有很多可用個(gè)數(shù)據(jù)源驅(qū)動(dòng),然后就可用添加連接Access的ODBC的數(shù)據(jù)源了。11.3JDBC編程實(shí)例11.3.1創(chuàng)建數(shù)據(jù)表
【示例程序c16_1.java】創(chuàng)建學(xué)生表student。此表有三個(gè)字段:學(xué)號(hào)(id)、姓名(name)及成績(jī)(score)。importjava.sql.*;//引入java.sql包publicclassc16_1{publicstaticvoidmain(String[]args){StringJDriver="sun.jdbc.odbc.JdbcOdbcDriver";//聲明JDBC驅(qū)動(dòng)程序?qū)ο?/p>
StringconURL="jdbc:odbc:TestDB";//定義JDBC的URL對(duì)象
try{Class.forName(JDriver);//加載JDBC-ODBC橋驅(qū)動(dòng)程序
}catch(java.lang.ClassNotFoundExceptione){System.out.println("ForName:"+e.getMessage());}try{Connectioncon=DriverManager.getConnection(conURL);//連接數(shù)據(jù)庫(kù)URLStatements=con.createStatement();//建立Statement類對(duì)象
Stringquery="createtablestudent("+"idchar(10),"+"namechar(16),"+"scoreinteger"+")";//創(chuàng)建一個(gè)含有三個(gè)字段的學(xué)生表students.executeUpdate(query);//執(zhí)行SQL命令s.close();//釋放Statement所連接的數(shù)據(jù)庫(kù)及JDBC資源
con.close();//關(guān)閉與數(shù)據(jù)庫(kù)的連線
}catch(SQLExceptione){System.out.println("SQLException:"+e.getMessage());}}}其中,
createtablestudent(idchar(10),namechar(16),scoreinteger);
這個(gè)SQL語(yǔ)句表示建立一個(gè)名為student的表,包含id(字符型,寬度為10)、name(字符型,寬度為16)與score(數(shù)字型)三個(gè)字段。這段程序的操作結(jié)果是創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù)中student表的結(jié)構(gòu),表中還沒(méi)有任何記錄。運(yùn)行結(jié)果見數(shù)據(jù)庫(kù)文件TestDB.mdb。11.3.2向數(shù)據(jù)表中插入數(shù)據(jù)
【示例程序c16_2.java】在上例創(chuàng)建的數(shù)據(jù)表student中插入三個(gè)學(xué)生的記錄。importjava.sql.*;publicclassc16_2{
publicstaticvoidmain(String[]args)
{StringJDriver="sun.jdbc.odbc.JdbcOdbcDriver";
StringconURL="jdbc:odbc:TestDB";try{Class.forName(JDriver);//注冊(cè)驅(qū)動(dòng)程序
}catch(java.lang.ClassNotFoundExceptione){System.out.println("ForName:"+e.getMessage(
));}try{Connectioncon=DriverManager.getConnection(conURL);//建立數(shù)據(jù)庫(kù)連接
Statements=con.createStatement(?);//創(chuàng)建Statement類對(duì)象s,準(zhǔn)備進(jìn)行SQL操作
Stringr1="insertintostudentvalues("+"'0001','王明',80)";Stringr2="insertintostudentvalues("+"'0002','高強(qiáng)',94)";Stringr3="insertintostudentvalues("+"'0003','李莉',82)";//使用SQL命令insert插入三條學(xué)生記錄到表中
s.executeUpdate(r1);//執(zhí)行SQL命令
s.executeUpdate(r2);s.executeUpdate(r3);s.close(?);//釋放Statement所連接的數(shù)據(jù)庫(kù)及JDBC資源
con.close(?);//關(guān)閉與數(shù)據(jù)庫(kù)的連線
}
catch(SQLExceptione){System.out.println("SQLException:"+e.getMessage(
));}}}該程序的運(yùn)行結(jié)果如圖16.8所示。
圖16.8程序c16_2的運(yùn)行結(jié)果11.3.3更新數(shù)據(jù)
【示例程序c16_3.java】修改上例數(shù)據(jù)表中的第二條和第三條記錄的學(xué)生成績(jī)字段值,并把修改后的數(shù)據(jù)表的內(nèi)容輸出到屏幕上。importjava.sql.*;publicclassc16_3{publicstaticvoidmain(String[?]args){StringJDriver="sun.jdbc.odbc.JdbcOdbcDriver";
StringconURL="jdbc:odbc:TestDB";String[
]id={"0002","0003"};
int[?]score={89,60};
try{
Class.forName(JDriver);
}catch(java.lang.ClassNotFoundExceptione)
{System.out.println("ForName:"+e.getMessage(
));}try
{Connectioncon=DriverManager.getConnection(conURL);
//修改數(shù)據(jù)庫(kù)中數(shù)據(jù)表的內(nèi)容
PreparedStatementps=con.prepareStatement(
"UPDATEstudentsetscore=?whereid=?");inti=0,idlen=id.length;do{ps.setInt(1,score[i]);ps.setString(2,id[i]);
ps.executeUpdate(
);//執(zhí)行SQL修改命令
++i;}while(i<id.length);
ps.close();//查詢數(shù)據(jù)庫(kù)并把數(shù)據(jù)表的內(nèi)容輸出到屏幕上
Statements=con.createStatement();ResultSetrs=s.executeQuery("select*fromstudent");while(rs.next(?)){System.out.println(rs.getString("id")+"\t"+rs.getString("name")+"\t"+rs.getInt("score"));}s.close();con.close();}catch(SQLExceptione){System.out.println("SQLException:"+e.getMessage());}}}
在這個(gè)程序中使用了PreparedStatement類,它提供了一系列的set方法來(lái)設(shè)定位置。請(qǐng)注意程序中PreparedStatement()方法中的參數(shù)“?”。程序中的語(yǔ)句:
PreparedStatementps=con.prepareStatement("UPDATEstudentsetscore=?whereid=?");ps.setInt(1,score[i]);//將score[i]的值作為SQL語(yǔ)句中第一個(gè)問(wèn)號(hào)所代表參數(shù)的值
ps.executeUpdate();
其中"UPDATEstudentsetscore=?whereid=?"這個(gè)SQL語(yǔ)句中各字段的值并沒(méi)指定,而是以“?”表示。程序必須在執(zhí)行ps.executeUpdate()語(yǔ)句之前指定各個(gè)問(wèn)號(hào)位置的字段值。例如,用ps.setInt(1,score[i])語(yǔ)句中的參數(shù)1指出這里的score[i]的值是SQL語(yǔ)句中第一個(gè)問(wèn)號(hào)位置的值。當(dāng)前面兩條語(yǔ)句執(zhí)行完后,才可執(zhí)行ps.executeUpdate()語(yǔ)句,完成對(duì)一條記錄的修改。程序中用到的查詢數(shù)據(jù)庫(kù)并把數(shù)據(jù)表的內(nèi)容輸出到屏幕的語(yǔ)句是:ResultSetrs=s.executeQuery("select*fromstudent");while(rs.next()){System.out.println(rs.getString("id")+"\t"+rs.getString("name")+"\t"+rs.getInt("score"));}其中,executeQuery()返回一個(gè)Res
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 深入研究2025年西方政治制度的社會(huì)影響試題及答案
- 計(jì)算機(jī)嵌入式測(cè)試實(shí)例試題及答案
- 數(shù)據(jù)庫(kù)備份方案的選擇與應(yīng)用試題及答案
- 公路勘測(cè)方法試題及答案
- 珠寶飾品攝影行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 民族樂(lè)器演奏班企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 電子產(chǎn)品自媒體企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- 電影賞析課程行業(yè)跨境出海項(xiàng)目商業(yè)計(jì)劃書
- 電影配樂(lè)企業(yè)制定與實(shí)施新質(zhì)生產(chǎn)力項(xiàng)目商業(yè)計(jì)劃書
- IT領(lǐng)域演進(jìn)與革新
- 糖尿病病歷模板共享
- 《杜鵑圓舞曲》集體備課教案
- 刑事辯護(hù)技巧與經(jīng)驗(yàn)演示文稿
- 會(huì)計(jì)專業(yè)工作簡(jiǎn)歷表(中級(jí))
- 金融科技課件(完整版)
- 利用與非門或異或門構(gòu)成全加器
- 凍干物料的包裝與儲(chǔ)存
- 籃球--傳切配合(縱切)課件.ppt
- 人工神經(jīng)網(wǎng)絡(luò)6HOPFIELD神經(jīng)網(wǎng)絡(luò)ppt課件
- 第五講-量化與編碼PPT課件.ppt
- 部編版道德與法治六年級(jí)下冊(cè)【全冊(cè)】知識(shí)點(diǎn)總結(jié)
評(píng)論
0/150
提交評(píng)論