




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、NCEPU第7章 數(shù)據(jù)庫(kù)編程N(yùn)CEPU主要內(nèi)容數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)Java數(shù)據(jù)庫(kù)應(yīng)用程序開(kāi)發(fā)7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句v數(shù)據(jù)庫(kù)基本概念 數(shù)據(jù)庫(kù)(Data Base,DB)是長(zhǎng)期儲(chǔ)存在計(jì)算機(jī)內(nèi)的、有組織的、可共享的、大量數(shù)據(jù)的集合。 數(shù)據(jù)庫(kù)的建立、運(yùn)用和維護(hù)由數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)統(tǒng)一管理、統(tǒng)一控制。 通過(guò)數(shù)據(jù)庫(kù)管理系統(tǒng)用戶能方便地定義和操縱數(shù)據(jù),并保證數(shù)據(jù)的安全性、完整性、多用戶對(duì)數(shù)據(jù)的并發(fā)使用及發(fā)生故障后的系統(tǒng)恢復(fù)等。 NCEPUv關(guān)系模型數(shù)據(jù)庫(kù)n關(guān)系模型的邏輯結(jié)構(gòu)就是一張由行和列組成的二維表。n一個(gè)數(shù)據(jù)庫(kù)包含一到多個(gè)表。n表中的一行為一個(gè)元組,或稱為記錄,而
2、一列為一個(gè)屬性,或稱為字段。表中某個(gè)或者某幾個(gè)屬性構(gòu)成的屬性組,如果說(shuō)它能唯一的確定一個(gè)記錄,則稱此屬性為主鍵屬性。 n關(guān)系模型數(shù)據(jù)庫(kù)目前應(yīng)用最廣泛。7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句Edgar Frank Codd數(shù)據(jù)表哪個(gè)字段的取值是唯一的?主 鍵表數(shù)據(jù)表結(jié)構(gòu)NCEPU7.1 7.1 數(shù)據(jù)庫(kù)概念及數(shù)據(jù)庫(kù)概念及SQLSQL語(yǔ)句語(yǔ)句v 關(guān)系數(shù)據(jù)庫(kù)關(guān)系數(shù)據(jù)庫(kù) 關(guān)系模型的數(shù)據(jù)邏輯結(jié)構(gòu)就是一張由行和列組成的二維表。 表中的一行為一個(gè)元組,或稱為記錄,而一列為一個(gè)屬性,或稱為字段。表中某個(gè)或者某幾個(gè)屬性構(gòu)成的屬性組,如果說(shuō)它能唯一的確定一個(gè)記錄,則稱此屬性為主鍵屬性。 表結(jié)構(gòu)記錄了表的所有字段、字段的類型
3、、主鍵等信息。 一個(gè)數(shù)據(jù)庫(kù)可包含多張表。關(guān)系模型數(shù)據(jù)庫(kù)是目前應(yīng)用最廣泛的數(shù)據(jù)庫(kù)類型。學(xué)號(hào)學(xué)號(hào)姓名姓名性別性別出生日期出生日期籍貫籍貫成績(jī)成績(jī)20161290012016129001張清玫女2001/10/9山東677 2016129002 2016129002 李勇男1999/3/21湖南63820161290032016129003劉逸女2000/10/27江蘇68020161290042016129004王晨男2000/2/17北京645表表結(jié)結(jié)構(gòu)構(gòu)表表數(shù)數(shù)據(jù)據(jù)主主 鍵鍵v關(guān)系模型數(shù)據(jù)庫(kù)n關(guān)系模型的邏輯結(jié)構(gòu)就是一張由行和列組成的二維表。n一個(gè)數(shù)據(jù)庫(kù)包含一到多個(gè)表。n表中的一行為一個(gè)元組,或
4、稱為記錄,而一列為一個(gè)屬性,或稱為字段。表中某個(gè)或者某幾個(gè)屬性構(gòu)成的屬性組,如果說(shuō)它能唯一的確定一個(gè)記錄,則稱此屬性為主鍵屬性。 n關(guān)系模型數(shù)據(jù)庫(kù)目前應(yīng)用最廣泛。7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句MySQL數(shù)據(jù)庫(kù)簡(jiǎn)介n MySQLl由瑞典由瑞典MySQL AB公司開(kāi)發(fā),屬于公司開(kāi)發(fā),屬于Oracle旗下產(chǎn)品,是常旗下產(chǎn)品,是常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一。用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一。n MySQL的安裝下載的安裝下載lhttps:/ Database/Schema(庫(kù))(庫(kù))n Table(表)(表)n View(視圖)(視圖)n Stored Procedure(存儲(chǔ)過(guò)程)(存儲(chǔ)過(guò)程)n Fu
5、nction(函數(shù))(函數(shù))10Navicat for MySQL12Navicat for MySQL13建庫(kù)14建庫(kù)15建庫(kù)16建表17添加字段18保存表19添加數(shù)據(jù)20添加記錄在MySQL中創(chuàng)建學(xué)生表v 學(xué)生表的字段包括 學(xué)號(hào)、姓名、性別 、院系、出生日期、平均成績(jī)v 創(chuàng)建學(xué)生表v 添加學(xué)生記錄v 瀏覽學(xué)生記錄v 刪除記錄v 修改記錄v學(xué)生成績(jī)表,包括的字段: 學(xué)號(hào)、姓名、課程、成績(jī)、考試日期字段。v 創(chuàng)建學(xué)生成績(jī)表v 添加5條成績(jī)記錄:C語(yǔ)言、Java語(yǔ)言的成績(jī)v 刪除一條成績(jī)記錄v 修改某一條成績(jī)記錄上機(jī)練習(xí)vSQL簡(jiǎn)介 SQL(Structured Query Language):
6、結(jié)構(gòu)化查詢語(yǔ)言。 它是關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)查詢語(yǔ)言,用于查詢、更新和管理關(guān)系數(shù)據(jù)庫(kù)。 SQL語(yǔ)言結(jié)構(gòu)簡(jiǎn)潔,功能強(qiáng)大,簡(jiǎn)單易學(xué)。 從IBM公司1981年推出以來(lái),SQL語(yǔ)言得到了廣泛的應(yīng)用。 幾乎所有主流的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)都支持SQL語(yǔ)言作為查詢語(yǔ)言。NCEPU7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句24創(chuàng)建查詢25執(zhí)行SQL語(yǔ)句26執(zhí)行SQL語(yǔ)句27導(dǎo)出數(shù)據(jù)庫(kù)28導(dǎo)入數(shù)據(jù)庫(kù)29導(dǎo)入數(shù)據(jù)庫(kù)30 數(shù)據(jù)庫(kù)原理 12/23/202131 數(shù)據(jù)庫(kù)原理 12/23/202132v 表的創(chuàng)建create table 表名 ( 列名 數(shù)據(jù)類型 default 缺省值 not null ,列名 數(shù)據(jù)類型 default 缺
7、省值 not null ,primary key(列名 ,列名 ))7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句MySQL常用數(shù)據(jù)類型https:/ 整數(shù),m表示數(shù)值顯示的寬度4字節(jié)SMALLINT(m)短整數(shù)2字節(jié)DECIMAL(m,d)m為所占位數(shù)(精度,范圍165),d為小數(shù)點(diǎn)后面有d位數(shù)字(標(biāo)度,范圍030)變化DOUBLE(m,d)雙精度浮點(diǎn)數(shù)8字節(jié)FLOAT(m,d)單精度浮點(diǎn)數(shù)4字節(jié)DATE日期,含年、月、日,格式為YYYY-MM-DD3字節(jié)TIME時(shí)間,包含時(shí)、分、秒,格式為HH:MM:SS3字節(jié)例題 v 創(chuàng)建student表,包括學(xué)號(hào)、姓名、性別、系別、出生日期、平均成績(jī)字段。學(xué)號(hào)是主鍵。
8、 CREATE TABLE student ( SNo CHAR(10) NOT NULL PRIMARY KEY, Name VARCHAR(30) , Sex CHAR(2) , Dept VARCHAR(30), Birthday DATE, Averscore FLOAT(5.1) ) DROP TABLE v 刪除表 n 刪除Student表 DROP TABLEstudent 7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句v數(shù)據(jù)更新 插入數(shù)據(jù) 修改數(shù)據(jù) 刪除數(shù)據(jù) 7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句v 插入記錄insert into 表名表名 (字段字段,) values(值值,)insert into
9、 表名表名 values(值值,)v INTO子句 屬性列的順序可與表定義中的順序不一致 沒(méi)有指定屬性列:表示要插入的是一條完整的記錄,且字段與表定義中的順序一致 指定部分屬性列:插入的記錄在其余屬性上取空值v VALUES子句 提供的值在類型和個(gè)數(shù)上必須與INTO子句匹配7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句 要求將一個(gè)學(xué)生記錄插入到student表中。 學(xué)號(hào):7059; 姓名:陳冬; 性別:女; 所在系:自動(dòng)化系; 出生日期:2002-3-3 平均成績(jī):82;INSERT INTO studentVALUES(7059,陳冬,女,自動(dòng)化系,2002-3-3,82)v 插入記錄7.1 數(shù)據(jù)庫(kù)概念及S
10、QL語(yǔ)句v 修改數(shù)據(jù)v功能:修改表中滿足功能:修改表中滿足WHERE子句條件的記錄。子句條件的記錄。UPDATE SET =,= WHERE ;常用條件: = 、(不等于)、in (包含) 、not in (不包含)、like( 匹配) BETWEEN AND (在范圍) 、not BETWEEN (不在范圍) 邏輯運(yùn)算: AND、OR、NOT7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句例:將學(xué)生李紅的平均成績(jī)乘以0.9。UPDATE student SET averscore = averscore*0.9 WHERE name=李紅v 修改數(shù)據(jù)7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句將學(xué)生表中系別為計(jì)算機(jī)系和自動(dòng)
11、化系的改為控計(jì)學(xué)院常用條件: = 、(不等于)、in (包含) 、 not in (不包含)、 like( 匹配) BETWEEN (在范圍) and 、 not BETWEEN (不在范圍) 邏輯運(yùn)算: AND、OR、NOT UPDATE student SET dept = 控計(jì)學(xué)院 WHERE dept in (計(jì)算機(jī)系,自動(dòng)化系)7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句v 修改數(shù)據(jù)v 刪除數(shù)據(jù) DELETE FROM WHERE p功能 刪除指定表中滿足WHERE子句條件的記錄p WHERE子句 指定要?jiǎng)h除的記錄 缺省表示要?jiǎng)h除表中的所有記錄例: 刪除學(xué)號(hào)為4005的學(xué)生記錄。DELETE FR
12、OM student WHERE Sno=40057.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句v采用SQL語(yǔ)言操作學(xué)生成績(jī)表 插入兩條記錄(注意,用SQL語(yǔ)句) 將C語(yǔ)言的成績(jī)乘以0.8再加20 將成績(jī)?cè)?35之間的記錄刪除 刪除不及格的成績(jī)上機(jī)練習(xí)v查詢記錄 SELECT 字段 FROM 表名 WHERE 條件 ORDER BY 排序表達(dá)式 ASC | DESC 常用條件: = 等于 、不等于、in 包含 、 not in 不包含、 like 匹配 BETWEEN 在范圍 、 not BETWEEN 不在范圍 條件運(yùn)算: and 、 or 、 not 7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句7.1 數(shù)據(jù)庫(kù)概念及SQ
13、L語(yǔ)句例:查詢所有學(xué)生的所有字段。 SELECT * FROM student例:查詢?nèi)w學(xué)生的學(xué)號(hào)與姓名。 SELECT sno,name FROM student例:查詢年齡在1822歲之間的學(xué)生。 SELECT * FROM student WHERE (year(now()-year(Birthday) BETWEEN 18 AND 22例:查詢控計(jì)學(xué)院、電力學(xué)院學(xué)生的姓名和性別。SELECT name,sex FROM studentWHERE dept IN ( 控計(jì)學(xué)院,電力學(xué)院);v 查詢結(jié)果排序v 查詢學(xué)生表中女生的平均成績(jī),以成績(jī)降序排列SELECT * FROM stud
14、ent WHERE Sex=女ORDER BY Averscore DESC7.1 數(shù)據(jù)庫(kù)概念及SQL語(yǔ)句v學(xué)生成績(jī)表包括字段:學(xué)號(hào)、姓名、課程、成績(jī)、考試日期v用命令插入兩條記錄v將C語(yǔ)言的成績(jī)乘以0.8再加20v刪除不及格的成績(jī)v查詢所有Java課程的成績(jī),按成績(jī)降序排序v查詢90分以上的成績(jī),按成績(jī)升序排列v查詢Java課程90分以上的成績(jī)v查詢今年的考試成績(jī)上機(jī)練習(xí)產(chǎn)品入庫(kù)功能界面入庫(kù)管理功能界面7.2 Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)7.2 Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)vJava語(yǔ)言通過(guò)JDBC為應(yīng)用程序提供統(tǒng)一接口來(lái)訪問(wèn)和操縱各種數(shù)據(jù)庫(kù)。vJava訪問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)API稱為JDBC,它是一個(gè)注冊(cè)術(shù)
15、語(yǔ),并不是首字母的縮寫(xiě)詞,但常被認(rèn)為表示Java數(shù)據(jù)庫(kù)連接(Java Database Connectivity)。vJDBC是應(yīng)用程序與數(shù)據(jù)庫(kù)進(jìn)行通信的中介,應(yīng)用程序通過(guò)JDBC API可以向數(shù)據(jù)庫(kù)傳送SQL語(yǔ)句并獲取SQL語(yǔ)句執(zhí)行的結(jié)果。pJava語(yǔ)言通過(guò)JDBC(Java Database Connectivity)來(lái)訪問(wèn)各種數(shù)據(jù)庫(kù)。p應(yīng)用程序通過(guò)JDBC API可以向數(shù)據(jù)庫(kù)傳送SQL語(yǔ)句并獲取SQL語(yǔ)句執(zhí)行的結(jié)果。7.2 Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)MySQLMySQLv 利用利用JDBCJDBC開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用一般步驟開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用一般步驟 下載并導(dǎo)入驅(qū)動(dòng)程序 加載驅(qū)動(dòng)程序 建立數(shù)據(jù)庫(kù)連接
16、執(zhí)行SQL語(yǔ)句 處理結(jié)果集 關(guān)閉數(shù)據(jù)庫(kù)連接7.2 Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)程序數(shù)據(jù)庫(kù)sql語(yǔ)句執(zhí)行結(jié)果v 數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序 可以從數(shù)據(jù)庫(kù)廠商官方網(wǎng)站下載 SQL Server的驅(qū)動(dòng)程序sqljdbc4.jar MySQL的驅(qū)動(dòng)程序mysql-connector-java.jar Oracle的驅(qū)動(dòng)程序ojdbc6.jar Access的驅(qū)動(dòng)程序Access_JDBC40.jar7.2 Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)下載驅(qū)動(dòng)程序包n MySQL的的JDBC驅(qū)動(dòng)程序驅(qū)動(dòng)程序l通常包含在一個(gè)以通常包含在一個(gè)以mysql-connector-java為前綴,后為前綴,后面是當(dāng)前版本號(hào)的面是當(dāng)前版本號(hào)的jar文件中
17、。文件中。54https:/ 在進(jìn)行數(shù)據(jù)庫(kù)的連接和訪問(wèn)時(shí)要用到數(shù)據(jù)庫(kù)驅(qū)動(dòng)在進(jìn)行數(shù)據(jù)庫(kù)的連接和訪問(wèn)時(shí)要用到數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序文件(程序文件(jar文件),需要先將特定數(shù)據(jù)庫(kù)的驅(qū)文件),需要先將特定數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序文件導(dǎo)入到動(dòng)程序文件導(dǎo)入到Eclipse的相關(guān)項(xiàng)目里。的相關(guān)項(xiàng)目里。55mysql-connector-java-8.0.20.jarmysql-connector-java-5.1.48.jar導(dǎo)入方式n 導(dǎo)入步驟導(dǎo)入步驟l 在需要導(dǎo)入驅(qū)動(dòng)文件的項(xiàng)目上單擊右鍵,然后依次選擇在需要導(dǎo)入驅(qū)動(dòng)文件的項(xiàng)目上單擊右鍵,然后依次選擇New -Folder,為驅(qū)動(dòng)文件創(chuàng)建文件夾。,為驅(qū)動(dòng)文件創(chuàng)建文件夾。
18、56導(dǎo)入步驟n 在打開(kāi)的在打開(kāi)的New Folder窗口中,輸入文件夾的名窗口中,輸入文件夾的名稱,按照慣例,通常命名為稱,按照慣例,通常命名為“l(fā)ib”,點(diǎn)擊,點(diǎn)擊finish完成。完成。導(dǎo)入步驟n 使用使用“Ctrl+C”復(fù)制復(fù)制jar驅(qū)動(dòng)程序文件,選中驅(qū)動(dòng)程序文件,選中l(wèi)ib文件夾,按文件夾,按“Ctrl+V”粘貼,把粘貼,把jar文件粘貼到文件粘貼到lib文件夾中。文件夾中。58導(dǎo)入步驟n 在在mysql-connector-java-8.0.20.jar文件上文件上單擊右鍵,依次選擇單擊右鍵,依次選擇Build Path Add To Build Path。59pJava語(yǔ)言通過(guò)JD
19、BC(Java Database Connectivity)來(lái)訪問(wèn)各種數(shù)據(jù)庫(kù)。p應(yīng)用程序通過(guò)JDBC API可以向數(shù)據(jù)庫(kù)傳送SQL語(yǔ)句并獲取SQL語(yǔ)句執(zhí)行的結(jié)果。7.2 Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)MySQLMySQLq JDBC API是一組由Java語(yǔ)言編寫(xiě)的類和接口, 包含在 java.sql 和 javax.sql 兩個(gè)包中。q java.sql為核心包,這個(gè)包包含于J2SE中。q javax.sql包擴(kuò)展了JDBC API的功能,成為了J2EE的一個(gè)基本組成部分。v JDBC API7.2 Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)7.2 Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)接口或類 說(shuō)明 DriverManager此類用
20、于加載和卸載各種驅(qū)動(dòng)程序并建立與數(shù)據(jù)庫(kù)的連接DataSource (javax.sql包中)此接口作為 DriverManager的替代項(xiàng),DataSource對(duì)象是獲取連接的首選方法。 Connection此接口表示與特定數(shù)據(jù)庫(kù)的連接PreparedStatement此接口用于執(zhí)行預(yù)編譯的 SQL 語(yǔ)句 Statement此接口用于執(zhí)行 SQL 語(yǔ)句并將數(shù)據(jù)檢索到 ResultSet 中 ResultSet此接口表示查詢出來(lái)的數(shù)據(jù)結(jié)果集加載驅(qū)動(dòng)程序try Class.forName(com.mysql.cj.jdbc.Driver);catch (ClassNotFoundException
21、 e) e.printStackTrace();n MySQL 5.0Class.forName(com.mysql.jdbc.Driver);建立連接n JDBC URL64Connection conn = DriverManager.getConnection( DB_URL, USERNAME, PASSWORD);連接路徑連接路徑用戶名稱用戶名稱密碼密碼String DB_URL= jdbc:mysql:/localhost:3306/test?serverTimezone=UTC;默認(rèn)時(shí)區(qū)默認(rèn)時(shí)區(qū)執(zhí)行SQL語(yǔ)句n 創(chuàng)建語(yǔ)句對(duì)象創(chuàng)建語(yǔ)句對(duì)象l Statement 接口用于在已經(jīng)建立數(shù)
22、據(jù)庫(kù)連接的基礎(chǔ)上,接口用于在已經(jīng)建立數(shù)據(jù)庫(kù)連接的基礎(chǔ)上,向數(shù)據(jù)庫(kù)發(fā)送要執(zhí)行的向數(shù)據(jù)庫(kù)發(fā)送要執(zhí)行的SQL語(yǔ)句。語(yǔ)句。l 創(chuàng)建創(chuàng)建Statement對(duì)象需要調(diào)用對(duì)象需要調(diào)用Connection對(duì)象的對(duì)象的createStatement()方法。方法。65Statement stmt=conn.createStatement();執(zhí)行SQL語(yǔ)句n執(zhí)行語(yǔ)句執(zhí)行語(yǔ)句l 可以調(diào)用可以調(diào)用Statement接口的成員方法來(lái)執(zhí)行接口的成員方法來(lái)執(zhí)行SQL語(yǔ)句。語(yǔ)句。66方法原型方法原型說(shuō)明說(shuō)明public ResultSet executeQuery(String sql)throws SQLExceptio
23、n執(zhí)行執(zhí)行SQL查詢語(yǔ)句查詢語(yǔ)句,并將結(jié)果封裝在結(jié),并將結(jié)果封裝在結(jié)果集果集ResultSet對(duì)象中返回對(duì)象中返回public int executeUpdate(String sql)throws SQLException執(zhí)行執(zhí)行SQL更新語(yǔ)句更新語(yǔ)句或或數(shù)據(jù)定義語(yǔ)句數(shù)據(jù)定義語(yǔ)句。返。返回值是受影響的記錄行數(shù)回值是受影響的記錄行數(shù)public boolean execute(String sql)throws SQLException執(zhí)行執(zhí)行SQL語(yǔ)句。返回值表示語(yǔ)句。返回值表示SQL語(yǔ)句成語(yǔ)句成功與否。需要使用功與否。需要使用getResultSet()或或getUpdateCount()
24、方法來(lái)獲取結(jié)果方法來(lái)獲取結(jié)果向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句 try Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery (SELECT * FROM table”); catch (SQLException e) v Statement接口 Statement對(duì)象用于發(fā)送SQL語(yǔ)句執(zhí)行數(shù)據(jù)庫(kù)操作。 ResultSet executeQuery(String sql) 執(zhí)行select查詢,返回一個(gè)ResultSet 結(jié)果集對(duì)象。 int executeUpdate(String sql)執(zhí)行除查詢之外的操作
25、,若是增刪改,返回值說(shuō)明該語(yǔ)句所涉及的數(shù)據(jù)行數(shù)。 boolean execute(String sql):可執(zhí)行任意的SQL操作。 若執(zhí)行的是select語(yǔ)句,則返回true 否則返回false ResultSet getResultSet(): 獲得結(jié)果集對(duì)象。 int getUpdateCount():返回修改計(jì)數(shù)。7.2 Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)v ResultSet 接口 對(duì)數(shù)據(jù)庫(kù)查詢操作后返回查詢結(jié)果集ResultSet對(duì)象,結(jié)果集類似于數(shù)據(jù)表,也以行、列的形式表現(xiàn)。 ResultSet對(duì)象的常用方法 boolean next() 光標(biāo)向后移動(dòng)一行; getXXX(int index)
26、 獲取結(jié)果集當(dāng)前行中index列的值(列從1開(kāi)始),XXX為數(shù)據(jù)類型,如String、int等。 getXXX(字段名) 獲取當(dāng)前行的該字段的值。 String name = rs.getString(1); String name = rs.getString(“姓名); 姓名性別出生日期張三男1991-2-1李四女1992-3-2王五男1990-6-77.2 Java訪問(wèn)數(shù)據(jù)庫(kù)技術(shù)n 創(chuàng)建結(jié)果集對(duì)象創(chuàng)建結(jié)果集對(duì)象l查詢結(jié)果在結(jié)果集對(duì)象查詢結(jié)果在結(jié)果集對(duì)象ResultSet中返回。中返回。lResultSet有一個(gè)游標(biāo),用于指向結(jié)果集的某一行(稱有一個(gè)游標(biāo),用于指向結(jié)果集的某一行(稱為當(dāng)前行
27、),它的初始位置在第一行的前面。為當(dāng)前行),它的初始位置在第一行的前面。查詢結(jié)果(程序內(nèi)存)處理結(jié)果集70snonamesexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx游標(biāo)next()ResultSet rs = stmt.executeQuery(SELECT * FROM table”) ; 處理結(jié)果集n 迭代處理迭
28、代處理 lResultSet中的中的next()方法用于將游標(biāo)移動(dòng)到下一行方法用于將游標(biāo)移動(dòng)到下一行71boolean next() throws SQLException查詢結(jié)果(程序內(nèi)存)snonamesexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx游標(biāo)next() while( rs.next() ) String
29、 id = rs.getString(sno); String name = rs.getString(2); / 讀取其他字段 處理結(jié)果集72MySQL數(shù)據(jù)類型數(shù)據(jù)類型Java類型類型ResultSet接口的對(duì)應(yīng)讀取方法接口的對(duì)應(yīng)讀取方法CHAR, VARCHARjava.lang.StringgetString()/getObject()/INT,INTEGER, SMALLINTjava.lang.IntegergetInt()/getShort()/ getObject()/ getString()/DOUBLEjava.lang.DoublegetDouble()/getObject
30、()/ getString()/FLOATjava.lang.FloatgetFloat()/getObject()/ getString()/DECIMALjava.math.BigDecimalgetBigDecimal()/getObject()/getString()/DATEJava.sql.DategetDate()/getObject()/ getString()/TIMEjava.sql.TimegetTime()/getObject()/ getString()/Xxx getXxx(int columnNumber)Xxx getXxx(String columnName)
31、關(guān)閉連接n 在數(shù)據(jù)庫(kù)所有操作都完成后,要將數(shù)據(jù)庫(kù)在數(shù)據(jù)庫(kù)所有操作都完成后,要將數(shù)據(jù)庫(kù) 訪問(wèn)過(guò)程中建立的各個(gè)對(duì)象按順序關(guān)閉,以釋放訪問(wèn)過(guò)程中建立的各個(gè)對(duì)象按順序關(guān)閉,以釋放 JDBC資源。資源。n 關(guān)閉順序和聲明順序相反。關(guān)閉順序和聲明順序相反。73 if (rs != null) rs.close(); rs=null; /關(guān)閉ResultSet結(jié)果集對(duì)象 if (stmt != null) stmt.close(); stmt=null; /關(guān)閉Statement語(yǔ)句對(duì)象 if (conn != null) conn.close(); conn=null; /關(guān)閉JDBC與數(shù)據(jù)庫(kù)的連接imp
32、ort java.sql.*; class DbDemo public static void main(String args) throws Exception Class.forName(com.mysql.cj.jdbc.Driver); /加載驅(qū)動(dòng)程序String url = “jdbc:mysql:/localhost:3306/user?serverTimezone=UTC; String user = root; String pwd = password;/建立與數(shù)據(jù)庫(kù)的連接Connection conn =DriverManager.getConnection(url, u
33、ser,pwd);Statement stmt = conn.createStatement(); /創(chuàng)建Statement對(duì)象 stmt.execute(insert into user values(張三,666666); /插入一條記錄ResultSet rs=stmt.executeQuery(select * from user); /查詢記錄while(rs.next() /顯示記錄 System.out.print(rs.getString(1); System.out.println(rs.getString(2); rs.close(); conn.close(); stmt
34、.close(); 編程練習(xí)使用JDBCv在MySQL中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),創(chuàng)建學(xué)生表(姓名、院系、出生日期、平均成績(jī)),插入若干記錄。v 編程實(shí)現(xiàn) 插入兩條記錄 查詢并顯示所有男生記錄 將控計(jì)學(xué)院學(xué)生的平均成績(jī)改為:平均成績(jī)*0.7+30 刪除所有平均成績(jī)不及格的學(xué)生記錄。用戶登錄的實(shí)現(xiàn)vuser表存儲(chǔ)著各用戶的用戶名和密碼。v編程實(shí)現(xiàn):用戶輸入用戶名和密碼,如果正確,則提示登錄成功;否則,提示錯(cuò)誤。class DbDemoLogin public static void main(String args) throws Exception String suser,spwd; Scanner
35、sc=new Scanner(System.in); System.out.print(請(qǐng)輸入用戶名:); suser=sc.nextLine(); System.out.print(請(qǐng)輸入密碼:); spwd=sc.nextLine(); Class.forName(com.mysql.cj.jdbc.Driver); /加載驅(qū)動(dòng)程序 String url = “jdbc:mysql:/localhost:3306/user?serverTimezone=UTC; String user = root; String pwd = password; Connection conn =Driv
36、erManager.getConnection(url, user,pwd); Statement stmt = conn.createStatement(); String ssql=select * from user ; ResultSet rs=stmt.executeQuery(ssql);SQL字符串的拼接select * from user where 用戶名=linda and 密碼=1234567“select * from user where 用戶名=linda and 密碼=1234567”select * from user where 用戶名=+suser+ and
37、 密碼=“+spwdselect * from user where 用戶名=+suser+ and 密碼=“ + spwdselect * from user where 用戶名=linda and 密碼=1234567select * from user where 用戶名=linda and 密碼=1234567select * from user where 用戶名=+suser+ and 密碼=“ + spwdimport java.sql.*; import java.io.*;class DbDemoLogin public static void main(String arg
38、s) throws Exception Scanner sc=new Scanner(System.in); System.out.print(請(qǐng)輸入用戶名:); String suser=sc.nextLine(); System.out.print(請(qǐng)輸入密碼:); String spwd=sc.nextLine(); Class.forName(com.mysql.cj.jdbc.Driver); /加載驅(qū)動(dòng)程序 String url = “jdbc:mysql:/localhost:3306/user?serverTimezone=UTC; String user = root; St
39、ring pwd = password; Connection conn =DriverManager.getConnection(url, user,pwd); Statement stmt = conn.createStatement(); String ssql= select * from user where 用戶名=+suser+and 密碼=+spwd+; ResultSet rs=stmt.executeQuery(ssql); if(rs.next() System.out.println(成功登錄); else System.out.println(用戶名或密碼錯(cuò)誤);用戶
40、登錄的實(shí)現(xiàn)數(shù)據(jù)庫(kù)應(yīng)用示例v 創(chuàng)建學(xué)生表(姓名、性別、專業(yè)、成績(jī))v 輸入一個(gè)用戶的信息,存入學(xué)生表中。PreparedStatement接口 PreparedStatement接口(預(yù)編譯的 SQL 語(yǔ)句)PreparedStatement 用于提高運(yùn)行時(shí)效率執(zhí)行PreparedStatement 比執(zhí)行Statement對(duì)象快Statement 接口PreparedStatement接口 n 創(chuàng)建創(chuàng)建PreparedStatementString sql = “insert into user values(張三,666666)”; PreparedStatement pstmt = con
41、n.prepareStatement(sql);Statement stmt = conn.createStatement( ); stmt.execute(insert into user values(張三,666666); ResultSet rs=stmt.executeQuery(select * from user”); n executeUpdate()方法方法:對(duì)表數(shù)據(jù)的增刪改操作。對(duì)表數(shù)據(jù)的增刪改操作。n executeQuery()方法:執(zhí)行查詢語(yǔ)句。方法:執(zhí)行查詢語(yǔ)句。n execute()方法:執(zhí)行方法:執(zhí)行SQL語(yǔ)句。語(yǔ)句。public int executeUpda
42、te()throws SQLExceptionpublic ResultSet executeQuery()throws SQLException public boolean execute() throws SQLExceptionPreparedStatement接口 PreparedStatement接口 String sql = “insert into user values(張三,666666)”; PreparedStatement pstmt = conn.prepareStatement(sql);pstmt.executeUpdate ();Statement stmt
43、= conn.createStatement( ); stmt.execute(insert into user values(張三,666666); ResultSet rs=stmt.executeQuery(select * from user”); PreparedStatement接口 n創(chuàng)建創(chuàng)建PreparedStatementString sql = SELECT * FROM user WHERE username=? AND password=?;PreparedStatement pstmt = conn.prepareStatement(sql);n void setSt
44、ring(int parameterIndex, String x) 將指定參數(shù)設(shè)置為給定的字符串值。n void setInt(int parameterIndex, int x) 將指定參數(shù)設(shè)置為給定 的int 值。 n void setDate(int parameterIndex, Date x) 將指定參數(shù)設(shè)置為給定的Date 值。 n void setDouble(int parameterIndex, double x) 將指定參數(shù)設(shè)置為給定 的double 值。 PreparedStatement接口 pstmt.setString(1,Zhanghua); pstmt.set
45、Int(2,123);防止注入攻擊87占位符占位符只能只能替換替換值類型值類型, ,不能替換不能替換或者其他或者其他Class.forName(com.mysql.cj.jdbc.Driver); String url = “jdbc:mysql:/localhost:3306/user?serverTimezone=UTC;String user = root; String pwd = password;Connection conn =DriverManager.getConnection(url, user,pwd);PreparedStatement pstmt = conn.pre
46、paredStatement( select * from user where 用戶名=? ? and 密碼=? ?“ );pstmt.setString(1,Linda); pstmt.setString(2,1234567);ResultSet rs =pstmt.executeQuery();pstmt.setString(1,”admin”) pstmt.setString(2,”123123”);ResultSet rs =pstmt.executeQuery();【例例】從鍵盤(pán)輸入用戶名和密碼,查詢從鍵盤(pán)輸入用戶名和密碼,查詢user表,判斷是否為合法用戶。表,判斷是否為合法用戶
47、。import java.sql.*; import java.io.*;class DbDemoLogin public static void main(String args) throws Exception Scanner sc=new Scanner(System.in); System.out.print(請(qǐng)輸入用戶名:); String suser=sc.nextLine(); System.out.print(請(qǐng)輸入密碼:); String spwd=sc.nextLine(); Class.forName(com.mysql.cj.jdbc.Driver); String
48、url = “jdbc:mysql:/localhost:3306/user?serverTimezone=UTC; String user = root; String pwd = password; Connection conn =DriverManager.getConnection(url, user,pwd); PreparedStatement pstmt=conn.preparedStatement (select * from user where 用戶名=? and 密碼=?); pstmt.setString(1,suser); pstmt.setString(2,spwd); ResultSet rs =pstmt.executeQuery(); if(rs.next() System.out.println(成功登錄); else System.out.println(用戶名或密碼錯(cuò)誤);用戶登錄的實(shí)現(xiàn)import java.sql.*;class UserManage public static void main(String args) throws Exception Class.forName(com.mysql.cj.jdbc.Driver); String url = “jdbc:mysql:/localhost:3306/
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 供應(yīng)商采購(gòu)合同協(xié)議
- 現(xiàn)代農(nóng)業(yè)種植技術(shù)操作手冊(cè)
- 建材供應(yīng)居間協(xié)議合同
- 互聯(lián)網(wǎng)企業(yè)員工培訓(xùn)服務(wù)合同
- 總工程師聘用合同
- 短期個(gè)人借款合同范本與短期臨時(shí)工合同7篇
- 2023年高考全國(guó)乙卷數(shù)學(xué)(文)真題(原卷版)
- XX學(xué)校民主生活會(huì)個(gè)人剖析材料模板2
- 裝修提升工程合同范本
- 原水供水協(xié)議合同范本
- 犬的訓(xùn)練課件
- 五年級(jí)英語(yǔ)下冊(cè)素材-Unit1 Cinderella課文翻譯 譯林版(三起)
- 2022年南京信息職業(yè)技術(shù)學(xué)院職業(yè)適應(yīng)性測(cè)試模擬試題及答案解析
- 英語(yǔ)演講素材OfMiceandMen課件
- 歐洲鼻竇炎共識(shí)解讀 EPOS 2020
- 第5章 海洋資源開(kāi)發(fā)與管理
- 工業(yè)氣體企業(yè)公司組織架構(gòu)圖職能部門(mén)及工作職責(zé)
- 稅收基礎(chǔ)知識(shí)考試題庫(kù)
- 1t燃?xì)庹羝仩t用戶需求(URS)(共13頁(yè))
- 廣發(fā)證券分支機(jī)構(gòu)人員招聘登記表
- 機(jī)電一體化系統(tǒng)設(shè)計(jì)課件姜培剛[1]
評(píng)論
0/150
提交評(píng)論