![第7章 JSP中使用數(shù)據(jù)庫_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/29/8c4ccd1d-63ac-4e48-8c34-d811fc0bf820/8c4ccd1d-63ac-4e48-8c34-d811fc0bf8201.gif)
![第7章 JSP中使用數(shù)據(jù)庫_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/29/8c4ccd1d-63ac-4e48-8c34-d811fc0bf820/8c4ccd1d-63ac-4e48-8c34-d811fc0bf8202.gif)
![第7章 JSP中使用數(shù)據(jù)庫_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/29/8c4ccd1d-63ac-4e48-8c34-d811fc0bf820/8c4ccd1d-63ac-4e48-8c34-d811fc0bf8203.gif)
![第7章 JSP中使用數(shù)據(jù)庫_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/29/8c4ccd1d-63ac-4e48-8c34-d811fc0bf820/8c4ccd1d-63ac-4e48-8c34-d811fc0bf8204.gif)
![第7章 JSP中使用數(shù)據(jù)庫_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-10/29/8c4ccd1d-63ac-4e48-8c34-d811fc0bf820/8c4ccd1d-63ac-4e48-8c34-d811fc0bf8205.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、JSP實用教程(第三版)配合JSP實用教程(第三版)例子源代碼一起使用例子源代碼一起使用Power Point 制作 張躍平 耿祥義第第7章章 JSP中使用數(shù)據(jù)庫中使用數(shù)據(jù)庫2021-10-292 本章主要內(nèi)容本章主要內(nèi)容7.1 MySQL數(shù)據(jù)庫管理系統(tǒng)數(shù)據(jù)庫管理系統(tǒng)7.2 JDBC7.3 連接連接MySQL數(shù)據(jù)庫數(shù)據(jù)庫7.4 查詢記錄查詢記錄7.5 更新、添加與刪除記錄更新、添加與刪除記錄7.6 用結(jié)果集操作數(shù)據(jù)庫中的表用結(jié)果集操作數(shù)據(jù)庫中的表7.7 預(yù)處理語句預(yù)處理語句7.8 事務(wù)事務(wù)7.9 分頁顯示記錄分頁顯示記錄7.10 常見數(shù)據(jù)庫連接常見數(shù)據(jù)庫連接7.11 標準化考試標準化考試202
2、1-10-2937.1 MySQL數(shù)據(jù)庫管理系統(tǒng)數(shù)據(jù)庫管理系統(tǒng) MySQL數(shù)據(jù)庫管理系統(tǒng),簡稱MySQL,是世界上最流行的開源數(shù)據(jù)庫管理系統(tǒng),其社區(qū)版(MySQL Community Edition)是世界上最流行的免費下載的開源數(shù)據(jù)庫管理系統(tǒng)。 目前許多Web開發(fā)項目都選用MySQL,其主要原因是MySQL的社區(qū)版(MySQL Community Edition)性能卓越,滿足許多Web應(yīng)用已經(jīng)綽綽有余,而且MySQL的社區(qū)版是開源數(shù)據(jù)庫管理系統(tǒng)、可以降低軟件的開發(fā)和使用成本.2021-10-294 1.下載下載 登錄后選擇導航條上的products,在出現(xiàn)的頁面的左側(cè)選擇“MySQL Co
3、mmunity Edition”或在出現(xiàn)的頁面的右側(cè)選擇“下載MySQL社區(qū)版”。如圖7.1所示意。 7.1.1 下載、安裝與啟動下載、安裝與啟動MySQL2. 安裝安裝 將下載的mysql-5.6.16-win32.zip解壓縮到本地計算機即可,比如解壓縮到D:。形成的安裝目錄結(jié)構(gòu)如圖7.2。3.啟動啟動 打開MS-DOS命令行窗口,進入到bin目錄中,執(zhí)行MySQL安裝目錄的bin子目錄中的mysqld.exe文件: 即在命令行鍵入: mysqld 或 mysqld -nt啟動MySQL數(shù)據(jù)庫服務(wù)器。啟動成功,MySQL數(shù)據(jù)庫服務(wù)器將占用當前MS-DOS窗口,如圖7.3所示。2021-10
4、-295 7.1.2 建立數(shù)據(jù)庫建立數(shù)據(jù)庫 啟動MySQL數(shù)據(jù)庫服務(wù)器后,就可以建立數(shù)據(jù)庫,并在數(shù)據(jù)庫中創(chuàng)建表。 可以下載圖形界面的MySQL管理工具,并使用該工具進行創(chuàng)建數(shù)據(jù)庫、在數(shù)據(jù)庫中創(chuàng)建表等操作,MySQL管理工具有免費的也有需要購買的。 也可以使用MySQL提供的命令行工具進行創(chuàng)建數(shù)據(jù)庫、在數(shù)據(jù)庫中創(chuàng)建表等操作2021-10-29 1使用使用MySQL管理工具管理工具可以登錄:http:/ 啟動navicat for MySQL 出現(xiàn)如圖7.4所示界面 。我們建立的連接名稱是gengxiangyi,用戶名取root,密碼是空,MySQL服務(wù)器占用的端口是3306,如圖7.5。(2)建
5、立數(shù)據(jù)庫)建立數(shù)據(jù)庫 在新建的連接(gengxiangyi)上單擊鼠標右鍵,然后選擇“新建數(shù)據(jù)庫”,在彈出的新建數(shù)據(jù)庫對話框中輸入,選擇有關(guān)信息.如圖7.6所示.(3)創(chuàng)建表)創(chuàng)建表 在其“表”選擇項上單擊鼠標右鍵,選擇“新建表”,將出現(xiàn)創(chuàng)建表的對話框。如圖7.7所示以及7.8所示。2021-10-297 2使用使用MySQL監(jiān)視器監(jiān)視器 MySQL提供的監(jiān)視器(MySQL monitor),允許用戶使用命令行方式管理數(shù)據(jù)庫。如果讀者有比較好的數(shù)據(jù)庫知識,特別是SQL語句的知識,那么使用命令行方式管理MySQL數(shù)據(jù)庫也是很方便的. 需要再打開一個MS-DOS命令行窗口,并使用MS-DOS命令進
6、入到bin目錄中,然后使用默認的root用戶啟動MySQL監(jiān)視器(在安裝MySQL時root用戶是默認的一個用戶,沒有密碼)。命令如下: mysql u root如圖7.9所示2021-10-298 (1) 創(chuàng)建數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)庫 啟動MySQL監(jiān)視器后就可以使用SQL語句進行創(chuàng)建數(shù)據(jù)庫、建表等操作。在MS-DOS命令行窗口輸入SQL語句需要用語句需要用“;”號結(jié)束號結(jié)束,在編輯SQL語句的過程中可以使用c終止當前SQL語句的編輯。需要提醒的是,可以把一個完整的SQL語句命令分成幾行來輸入,最后用分號作結(jié)束標志即可。 使用MySQL監(jiān)視器創(chuàng)建一個名字為Book的數(shù)據(jù)庫,在當前MySQL監(jiān)視器占用
7、的命令行窗口輸入創(chuàng)建數(shù)據(jù)庫的SQL語句:create database Book;(如圖7.10所示意)2021-10-299 (2) 為數(shù)據(jù)庫建表為數(shù)據(jù)庫建表u 首先進入該數(shù)據(jù)庫(即使用數(shù)據(jù)庫): use Book如圖7.11所示意。u在數(shù)據(jù)庫Book建立一個名字為bookList表:(如圖7.12)CREATE TABLE bookList ( ISBN varchar(100) not null , name varchar(100) CHARACTER SET gb2312, price float , PRIMARY KEY (ISBN); u插入記錄的SQL語句:(如圖7.13)i
8、nsert into bookList values(7-302-01465-5,高等數(shù)學高等數(shù)學,28.67); u查詢記錄的SQL語句(圖7.14) select * from bookList;2021-10-2910 ( (3)導入)導入.sql文件中的文件中的SQL語句語句 可以事先將需要的SQL語句保存在一個擴展名是.sql的文本文件中,然后在MySQL監(jiān)視器占用的命令行窗口使用source命令導入.sql的文本文件中的SQL語句. drop table carList ;create table carList(number char(60) CHARACTER SET gb23
9、12 not null,name char(50) CHARACTER SET gb2312 ,price float,year date,PRIMARY KEY(number);insert into carList values(加A89CQ8,奔馳,820000,2015-12-26);insert into carList values(洲C12456,寶馬,620000,2015-10-10);select * from carList;然后在當前MySQL監(jiān)視器占用的命令行窗口鍵入如下命令:source d:/1000/group.sqlsource d:/1000/group.s
10、ql導入SQL語句,如圖7.15 。 group.sql文本文件的內(nèi)容如下:文本文件的內(nèi)容如下:2021-10-2911刪除數(shù)據(jù)庫的命令刪除數(shù)據(jù)庫的命令:drop database ,例如:刪除名為tiger的數(shù)據(jù)庫: drop database tiger;刪除表的命令刪除表的命令:drop table ,例如,使用book數(shù)據(jù)庫后,執(zhí)行 drop table booklist;將刪除book數(shù)據(jù)庫中的bookList表。 (4)刪除數(shù)據(jù)庫或表)刪除數(shù)據(jù)庫或表2021-10-29127.2 JDBC JDBC(Java DataBase Connectivity)提供了訪問數(shù)據(jù)庫的API,即
11、由一些Java類和接口組成,是Java運行平臺的核心類庫中的一部分。在JSP中可以使用JDBC實現(xiàn)對數(shù)據(jù)庫中表的記錄的查詢、修改和刪除等操作。如圖7.16所示意我們經(jīng)常使用JDBC進行如下的操作:與一個數(shù)據(jù)庫建立連接。向已連接的數(shù)據(jù)庫發(fā)送SQL語句。1. 處理SQL語句返回的結(jié)果。2021-10-2913 使用JDBC-數(shù)據(jù)庫驅(qū)動程序方式和數(shù)據(jù)庫建立連接需要經(jīng)過2個步驟:7.3 連接連接MySQL數(shù)據(jù)庫數(shù)據(jù)庫加載加載JDBC-數(shù)據(jù)庫驅(qū)動程序數(shù)據(jù)庫驅(qū)動程序和指定的數(shù)據(jù)庫建立連接和指定的數(shù)據(jù)庫建立連接如圖7.17所示意2021-10-2914 教材下載的是mysql-connector-java-
12、5.1.28.zip,將該zip文件解壓至硬盤,在解壓后的目錄下的mysql-connector-java-5.1.28-bin.jar文件就是連接MySQL數(shù)據(jù)庫的JDBC-數(shù)據(jù)庫驅(qū)動程序。將該驅(qū)動程序復(fù)制到Tomcat服務(wù)器所使用的JDK的擴展目錄中(即java_home環(huán)境變量指定的JDK,見第1章的1.2),比如:D:jdk1.7jrelibext或復(fù)制到Tomcat服務(wù)器安裝目錄的commonlib文件夾中,比如:D:apache-tomcat-8.0.3commonlib 7.3.1加載加載JDBC-數(shù)據(jù)庫驅(qū)動程序數(shù)據(jù)庫驅(qū)動程序加載MySQL的JDBC-數(shù)據(jù)庫驅(qū)動程序代碼如下:tr
13、y try Class.forName(com.mysql.jdbc.Driver);Class.forName(com.mysql.jdbc.Driver); catch(Exception e)catch(Exception e)2021-10-2915 為了能和MySQL數(shù)據(jù)庫服務(wù)器管理的數(shù)據(jù)庫建立連接,必須保證該MySQL數(shù)據(jù)庫服務(wù)器已經(jīng)啟動,如果沒有更改過MySQL數(shù)據(jù)庫服務(wù)器的配置,那么該數(shù)據(jù)庫服務(wù)器占用的端口是3306。假設(shè)MySQL數(shù)據(jù)庫服務(wù)器所駐留的計算機的IP地址是 7.3.2 建立連接建立連接_1使用 Connection getConnecti
14、on(String,String,String)方法建立連接的代碼如下:try String uri = jdbc:mysql:/ :3306/warehouse; String user =root; String password =99; con = DriverManager.getConnection(uri,user,password); catch(SQLException e) System.out.println(e);2021-10-2916 7.3.2建立連接建立連接_2 使用Connection getConnection(String) 方法
15、建立連接的代碼如下:try String uri = jdbc:mysql:/:3306/warehouse?user=root&password=99; con = DriverManager.getConnection(uri); catch(SQLException e) System.out.println(e);如果root用戶沒有設(shè)置密碼,那么將上述uri中的&password=99更改為:&password= 2021-10-2917 7.3.2建立連接建立連接_3 避免操作數(shù)據(jù)庫出現(xiàn)中文亂碼(細節(jié)見稍后的7.3.3),那么需要使
16、用 Connection getConnection(String) 方法建立連接,連接代碼是(假設(shè)用戶是root,其密碼是99):String uri = jdbc:mysql://warehouse?+ user=root&password=99&characterEncoding=gb2312;con = DriverManager.getConnection(uri); 用戶要和連接MySQL駐留在同一計算機上,使用的IP地址可以是或localhost。另外,由于3306是MySQL數(shù)據(jù)庫服務(wù)器的默認端口號,鏈接數(shù)據(jù)庫時允許應(yīng)用程序省
17、略默認的3360端口號.2021-10-2918 7.3.3 MySQL亂碼解決方案亂碼解決方案_11數(shù)據(jù)庫和表使用支持中文的字符編碼 在創(chuàng)建數(shù)據(jù)庫時指定數(shù)據(jù)庫使用的字符編碼: create 數(shù)據(jù)庫名數(shù)據(jù)庫名 CHARACTER SET字符編碼字符編碼 創(chuàng)建表時,可以指定某個字段使用的字符編碼: 字段名字段名 類型類型 CHARACTER SET字符編碼字符編碼例如:create people CHARACTER SET gb2312create table myList (id int, name varchar(100) CHARACTER SET gb2312,PRIMARY KEY (
18、id);2021-10-2919 7.3.3 MySQL亂碼解決方案亂碼解決方案_22連接數(shù)據(jù)庫支持中文編碼連接數(shù)據(jù)庫支持中文編碼JSP中連接MySQL數(shù)據(jù)庫時,需要使用Connection getConnection(java.lang.String) 方法建立連接,而且向該方法參數(shù)傳遞的字符串是:“jdbc:mysql:/地址/數(shù)據(jù)庫?user=用戶&password=密碼 &characterEncoding=gb2312characterEncoding=gb2312;2021-10-2920 例子例子7_17_1 例子1是一個簡單的JSP頁面,該頁面中的Java程序片
19、代碼負責加載JDBC-驅(qū)動程序,并連接到數(shù)據(jù)庫warehouse,查詢product表中全部記錄(見7.1節(jié)曾建立的warehouse數(shù)據(jù)庫),頁面運行效果如圖7.18。 2021-10-29217.4 查詢記錄查詢記錄 和數(shù)據(jù)庫建立連接后,就可以使用JDBC提供的API和數(shù)據(jù)庫交互信息。比如查詢、修改和更新數(shù)據(jù)庫中的表等。 JDBC和數(shù)據(jù)庫表進行交互的主要方式是使用SQL語句(其它方式見7.8節(jié)),JDBC提供的API可以將標準的SQL語句發(fā)送給數(shù)據(jù)庫,實現(xiàn)和數(shù)據(jù)庫的交互。2021-10-2922 7.4.1 結(jié)果集與查詢結(jié)果集與查詢_11SQL查詢語句與結(jié)果集查詢語句與結(jié)果集讓連接對象co
20、n調(diào)用方法createStatement()創(chuàng)建這個SQL語句對象:try Statement sql=con.createStatement(); catch(SQLException e ) System.out.println(e); 對于 ResultSet rs=sql.executeQuery(SELECT * FROM product);內(nèi)存的結(jié)果集對象rs的列數(shù)是4列,剛好和product的列數(shù)相同.2021-10-2923 7.4.1 結(jié)果集與查詢結(jié)果集與查詢_2對于ResultSet rs=sql.executeQuery(SELECT name,price FROM pr
21、oduct);內(nèi)存的結(jié)果集對象rs只有兩列,第1列是name列、第2列是price列。 ResultSet結(jié)果集一次只能看到一個數(shù)據(jù)行,使用next()方法走到下一數(shù)據(jù)行,獲得一行數(shù)據(jù)后,ResultSet結(jié)果集可以使用getXxx方法獲得字段值(列值),將位置索引(第一列使用1,第二列使用2等等)或列名傳遞給getXxx方法的參數(shù)即可2021-10-2924 表7.1 ResultSet類的若干方法2021-10-2925 7.4.1 結(jié)果集與查詢結(jié)果集與查詢_32結(jié)果集的列名與列的數(shù)目結(jié)果集的列名與列的數(shù)目 程序查詢的時候。為了代碼更加容易維護,希望知道數(shù)據(jù)庫表的字段(列)的名字以及表的字
22、段的個數(shù),那么一個辦法是使用返回到程序中的結(jié)果集來獲取相關(guān)的信息。假如結(jié)果集是rs(1) 得到元數(shù)據(jù)對象metaData ResultSetMetaData metaData = rs.getMetaData();(2)得到結(jié)果集的列的個數(shù),即共有幾列 int columnCount = metaData.getColumnCount();(3)結(jié)果集rs中的第i列的名字: String columnName = metaData.getColumnName(i);2021-10-2926 7.4.2 隨機查詢隨機查詢_1使用下述方法獲得一個Statement對象:Statement stmt
23、=con.createStatement(int type, int concurrency);type取值: ResultSet.TYPE_SCROLL_INSENSITIVE或 ResultSet.TYPE_SCROLL_SENSITIVEConcurrency取值: ResultSet.CONCUR_READ_ONLY或 ResultSet.CONCUR_UPDATABLE2021-10-2927 7.4.2 隨機查詢隨機查詢_2 根據(jù)參數(shù)的type、concurrency的取值情況,stmt返回相應(yīng)類型的結(jié)果集:ResultSet re=stmt.executeQuery(SQL語句語
24、句);滾動查詢經(jīng)常用到ResultSet的下述方法:u public void first():將游標移到結(jié)果集的第一行。u public void last():將游標移到結(jié)果集的最后一行。u public int getRow():得到當前游標所指行的行號,行號從1開始,如果結(jié)果集沒有行,返回0u public boolean absolute(int row):將游標移到參數(shù)row指定的行號。 2021-10-29 7.4.3 條件查詢條件查詢select from 表表 where 字段字段 滿足的條件滿足的條件例如: select * from product where price
25、 2000 and price5000select * from product where name = javaselect * from product where name like %里% 2021-10-2929 例子例子7_27_2 例子2使用MVC模式(有關(guān)知識見第6章)顯示warehouse數(shù)據(jù)庫product表中price字段值大于某個值的記錄。2021-10-2930 例子例子7_27_2中的中的web.xmlweb.xml 根據(jù)例子2中使用的servlet的名字及相關(guān)類,Web服務(wù)目錄ch7的WEB-INF下的web.xml文件需包含如下內(nèi)容(有關(guān)web.xml文件的編
26、輯與保存見見5.1.2)。 queryByConditionServlet myservlet.control.Example7_2_Servlet queryByConditionServlet /queryByConditionServlet2021-10-2931 例子例子7_27_2中的模型中的模型 模型(Javabean)Javabean模型Example7_2_Bean.java負責存 儲 查 詢 到 的 記 錄 , 在 本 例 子 中Example7_2_Bean創(chuàng)建的Javabean模型的id是resultBean,scope取值是request。2021-10-2932 例子
27、例子7_27_2中的中的視圖(視圖(JSP頁面)頁面)視圖(視圖(JSP頁面)頁面) 視圖部分由2個JSP頁面構(gòu)成,其中example7_2.jsp頁面負責提供輸入數(shù)據(jù)的視圖,即用戶可以在該頁面輸入 查 詢 的 價 格 條 件 , 然 后 將 數(shù) 據(jù) 提 交 給 名 字 是q u e r y B y C o n d i t i o n S e r v l e t 的 s e r v l e t 。queryByConditionServlet負責查詢數(shù)據(jù)庫,并將結(jié)果存儲到id為resultBean的Javabean數(shù)據(jù)模型中,然后請求視圖中的showRecord.jsp顯示數(shù)據(jù)模型result
28、Bean中的數(shù)據(jù)。example7_2.jsp和showRecord.jsp的效果如圖如圖7.19(a)和圖圖7.19(b)所示2021-10-2933 例子例子7_27_2中的控制器中的控制器控制器(控制器(servlet)E x a m p l e 7 _ 2 _ S e v l e t 負 責 創(chuàng) 建 名 字 是 queryByConditionServlet的servlet(見例子2前面web.xml文件的有關(guān)內(nèi)容)。 queryByConditionServlet查詢warehouse數(shù)據(jù)庫的product表中滿足價格條件的記錄,將結(jié)果存放到id是resultBean的Javabea
29、n數(shù)據(jù)模型中, 然后用轉(zhuǎn)發(fā)的方法請求showRecord.jsp顯示resultBean中的數(shù)據(jù)。2021-10-29347.5 更新、添加與刪除記錄更新、添加與刪除記錄1更新更新Statement對象調(diào)用方法:對象調(diào)用方法:public int executeUpdate(String sqlStatement);實現(xiàn)對數(shù)據(jù)庫表中記錄的字段值的更新。例如,實現(xiàn)對數(shù)據(jù)庫表中記錄的字段值的更新。例如,executeUpdate(UPDATE product SET price = 6866 WHERE name=海爾電視機海爾電視機);2添加Statement對象調(diào)用方法:public int
30、executeUpdate(String sqlStatement);實現(xiàn)向數(shù)據(jù)庫表中添加新的記錄。例如,executeUpdate(INSERT INTO students VALUES (012,神通手機,2015-2-26,2687);3刪除Statement對象調(diào)用方法:public int executeUpdate(String sqlStatement);刪除數(shù)據(jù)庫表中的記錄。例如:executeUpdate(DELETE FROM product WHERE number = 888 );2021-10-2935 例子例子7_37_3 下面的例子3使用MVC模式(有關(guān)知識見第6
31、章)向warehouse數(shù)據(jù)庫product表中插入錄。2021-10-2936 例子例子7_37_3中的中的web.xmlweb.xml 根據(jù)例子3中使用的servlet的名字及相關(guān)類,Web服務(wù)目錄ch7的WEB-INF下的web.xml文件需包含如下內(nèi)容(有關(guān)web.xml文件的編輯與保存見見5.1.2): insertServlet myservlet.control.Example7_3_Servlet insertServlet /insertServlet2021-10-2937 例子例子7_37_3中的模型中的模型 模型(Javabean) J a v a b e a n 模
32、型 例 子 2 中 的Example7_2_Bean.java完全相同,創(chuàng)建的Javabean模型的id是resultBean,scope取值是request。2021-10-2938 例子例子7_37_3中的中的視圖(視圖(JSP頁面)頁面)視圖(JSP頁面) 視 圖 部 分 由 2 個 J S P 頁 面 構(gòu) 成 , 一 個 是example7_3.jsp,另一個是例子2中的showRecord.jsp,其中example7_3.jsp頁面負責提供輸入新記錄提交給名字是insertServlet的servlet。 insertServlet負責將記錄插入到數(shù)據(jù)庫的表中,然后查詢數(shù)據(jù)庫的表,
33、并將查詢結(jié)果存儲到id為resultBean的 J a v a b e a n 數(shù) 據(jù) 模 型 中 , 然 后 請 求 視 圖 中 的showRecor.jsp顯示數(shù)據(jù)模型resultBean中的數(shù)據(jù)。example7_3.jsp和showRecord.jsp的效果如圖如圖7.20(a)和圖圖7.20(b)所示。2021-10-2939 例子例子7_37_3中的控制器中的控制器控制器(控制器(servlet)Example7_3_Sevlet負責創(chuàng)建名字是insertServlet的servlet(見例子3前面web.xml文件的有關(guān)內(nèi)容)。insertServlet負責向數(shù)據(jù)庫warehou
34、se的product表插入記錄,并查詢product表中的全部記錄,將結(jié)果存放到id是resultBean的Javabean數(shù)據(jù)模型中,然后用轉(zhuǎn)發(fā)的方法請求showRecod.jsp顯示resultBean中的數(shù)據(jù)。為了避免出現(xiàn)中文亂碼,數(shù)據(jù)庫的連接方式采用:“jdbc:mysql:/地址地址/數(shù)據(jù)庫數(shù)據(jù)庫?user=用戶用戶&password=密碼密碼 &characterEncoding=gb2312;2021-10-29407.6用結(jié)果集操作數(shù)據(jù)庫中的表用結(jié)果集操作數(shù)據(jù)庫中的表 盡管可以用SQL語句對數(shù)據(jù)庫中表進行更新、插入操作,但也可以使用內(nèi)存中ResultSet結(jié)果集
35、對底層數(shù)據(jù)庫表進行更新和插入操作(這些操作由系統(tǒng)自動轉(zhuǎn)化為相應(yīng)的SQL語句),優(yōu)點是不必熟悉有關(guān)更新、插入的SQL語句,而且方便編寫代碼,缺點是,必須要事先返回結(jié)果集。 7.6.1 更新記錄更新記錄2021-10-2941使用結(jié)果集更新數(shù)據(jù)庫表中第使用結(jié)果集更新數(shù)據(jù)庫表中第n行記錄中某列的值的步驟是:行記錄中某列的值的步驟是:1.結(jié)果集rs的游標移動到第n行 rs.absolute(n);2.結(jié)果集將第n行的某列的列值更新例如 更新列名是columnName的日期值是x指定的值: updateDate(String columnName, Date x) 3.更新數(shù)據(jù)庫中的表最后,結(jié)果集調(diào)用u
36、pdateRow()方法用結(jié)果集中的第n行更新數(shù)據(jù)庫表中的第n行記錄。 以下代碼片段更新product表中的第3行記錄的name列(字段)的值。rs.absolute(3);rs.updateString(name, IBM PC);rs.updateRow(); 7.6.2 插入記錄插入記錄2021-10-2942使用結(jié)果集向數(shù)據(jù)庫表中插入(添加)一行記錄步驟是使用結(jié)果集向數(shù)據(jù)庫表中插入(添加)一行記錄步驟是:1.結(jié)果集rs的游標移動到插入行 rs.moveToInsertRow();2.更新插入行的列值 例如:rs.updateString(1, c002);rs.updateString
37、(2, IBM iPad);rs.updateDate(3,Date();rs.updateDouble(4, 5356);3. 插入記錄最后,結(jié)果集調(diào)用insertRow()方法用結(jié)果集中的插入行向數(shù)據(jù)庫表中插入一行新記錄。2021-10-2943 例子例子7_47_4 下面的例子4使用MVC模式(有關(guān)知識見第6章)向warehouse數(shù)據(jù)庫product表中插入錄,但和前面的例子3不同的是,例子4不直接使用SQL語句,而是使用結(jié)果集操作數(shù)據(jù)庫中的表。2021-10-2944 例子例子7_47_4中的中的web.xmlweb.xml 根據(jù)例子4中使用的servlet的名字及相關(guān)類,Web服務(wù)
38、目錄ch7的WEB-INF下的web.xml文件需包含如下內(nèi)容(有關(guān)web.xml文件的編輯與保存見見5.1.2): insertBySetServlet myservlet.control.Example7_4_Servlet insertBySetServlet /insertBySetServlet2021-10-2945 例子例子7_47_4中的模型中的模型 模型(Javabean) J a v a b e a n 模 型 與 例 子 2 中 的Example7_2_Bean.java完全相同,創(chuàng)建的Javabean模型的id是resultBean,scope取值是request。20
39、21-10-2946 例子例子7_47_4中的中的視圖(視圖(JSP頁面)頁面)視圖(視圖(JSP頁面)頁面) 視圖部分由2個JSP頁面構(gòu)成,一個是example7_4.jsp,另一個是例子2中的showRecord.jsp。 其中example7_4.jsp頁面負責提供輸入新記錄的視圖,即用戶可以在該頁面輸入要添加的記錄,然后將要添加的記錄提交給名字是insertBySetServlet的servlet。 insertBySetServlet負責將記錄插入到數(shù)據(jù)庫的表中,然后查詢數(shù)據(jù)庫的表,并將查詢結(jié)果存儲到id為resultBean的Javabean數(shù)據(jù)模型中,然后請求視圖中的showRe
40、cor.jsp顯示數(shù)據(jù)模型resultBean中的數(shù)據(jù)。example7_4.jsp和showRecord.jsp的效果如圖7.21(a)和圖7.21(b)所示。2021-10-2947 例子例子7_47_4中的控制器中的控制器控制器(控制器(servlet) Example7_4_Sevlet負責創(chuàng)建名字是insertBySetServlet的s e r v l e t ( 見 例 子 4 前 面 w e b . x m l 文 件 的 有 關(guān) 內(nèi) 容 ) 。insertBySetServlet使用結(jié)果集操作數(shù)據(jù)庫,并向數(shù)據(jù)庫warehouse的product表插入記錄,然后查詢produc
41、t表中的全部記錄,將結(jié)果存放到id是resultBean的Javabean數(shù)據(jù)模型中,然后用轉(zhuǎn)發(fā)的方法請求showRecod.jsp顯示resultBean中的數(shù)據(jù). 為了避免出現(xiàn)中文亂碼,數(shù)據(jù)庫的連接方式采用:jdbc:mysql:/地址地址/數(shù)據(jù)庫數(shù)據(jù)庫?user=用戶用戶&password=密碼密碼&characterEncoding=gb2312;2021-10-29487.7 預(yù)處理語句預(yù)處理語句 Java提供了更高效率的數(shù)據(jù)庫操作機制,就是PreparedStatement對象,該對象被習慣地稱作預(yù)處理語句對象。本節(jié)學習怎樣使用預(yù)處理語句對象操作數(shù)據(jù)庫中的表。 7.
42、7.1 預(yù)處理語句優(yōu)點預(yù)處理語句優(yōu)點2021-10-2949 Connection連接對象con調(diào)用prepareStatement(String sql)方法:PreparedStatement pre=con.prepareStatement(String sql);對參數(shù)sql指定的SQL語句進行預(yù)編譯處理.那么pre調(diào)用下列方法都可以使得該底層內(nèi)部命令被 數(shù)據(jù)庫執(zhí)行: ResultSet executeQuery()boolean execute()int executeUpdate() 只要編譯好了PreparedStatement對象pre,那么pre可以隨時地執(zhí)行上述方法,提高了
43、訪問數(shù)據(jù)庫的速度。2021-10-2950 例子例子7_57_5 在下面的例5使用預(yù)處理語句來查詢warehouse數(shù)據(jù)庫中product表的全部記錄(有關(guān)product表見7.1.2節(jié)),請讀者比較例子5和例子1的不同之處2021-10-2951 7.7.2 使用通配符使用通配符在對SQL進行預(yù)處理時可以使用通配符“?”來代替字段的值。例如:prepareStatement pre=con.prepareStatement(SELECT * FROM product WHERE price ? );先調(diào)用相應(yīng)的方法設(shè)置通配符“?”代表的具體值,比如:pre.setDouble(1,6565)
44、;指定上述預(yù)處理語句pre中第1個通配符“?”代表的值是6565。 通配符按著它們在預(yù)處理的“SQL語句”中從左至右依次出現(xiàn)的順序分別被稱做第1個、第2個 第m個通配符。預(yù)處理語句設(shè)置通配符“?”的值的常用方法有:void setDate(int parameterIndex,Date x)void setDouble(int parameterIndex,double x)void setFloat(int parameterIndex,float x)2021-10-2952 例子例子7_67_6 例子6使用MVC模式(有關(guān)知識見第6章)更新warehouse數(shù)據(jù)庫product表中的記錄
45、,但和前面的例子不同的是,這里使用了預(yù)處理語句。2021-10-2953 例子例子7_67_6中的中的web.xmlweb.xml 根據(jù)例子6中使用的servlet的名字及相關(guān)類,Web服務(wù)目錄ch7的WEB-INF下的web.xml文件需包含如下內(nèi)容(有關(guān)web.xml文件的編輯與保存見5.1.2): preparedServlet myservlet.control.Example7_6_Servlet preparedServlet /preparedServlet2021-10-2954 例子例子7_67_6中的模型中的模型 模型(Javabean) Javabean模型與例子2中的E
46、xample7_2_Bean.java完全相同,創(chuàng)建的Javabean模型的id是resultBean,scope取值是request。2021-10-2955 例子例子7_67_6中的中的(JSP頁面)頁面)視圖(JSP頁面) 視圖部分由2個JSP頁面構(gòu)成,一個是example7_6.jsp,另一個是例子2中的showRecord.jsp(showRecod.jsp的代碼見例子2的視圖部分)。example7_6.jsp頁面將要更新的記錄,提交給名字是preparedServlet的servlet。preparedServlet負責更新數(shù)據(jù)庫表中的記錄,然后查詢數(shù)據(jù)庫的表,并將查詢結(jié)果存儲到
47、id為resultBean的Javabean數(shù)據(jù)模型中,然后請求視圖中的showRecor.jsp(見例子2中的視圖部分)顯示數(shù)據(jù)模型resultBean中的數(shù)據(jù)。example7_6.jsp和showRecord.jsp的效果如圖7.22(a)和圖7.22(b)所示2021-10-2956 例子例子7_67_6中的控中的控視圖視圖制器制器控制器(控制器(servlet) Example7_6_Servlet負責創(chuàng)建名字是insertServlet的servlet(見例子3前面web.xml文件的有關(guān)內(nèi)容)。insertServlet負責向數(shù)據(jù)庫warehouse的product表插入記錄,并
48、查詢product表中的全部記錄,將結(jié)果存放到id是resultBean的Javabean數(shù)據(jù)模型中,然后用轉(zhuǎn)發(fā)的方法請求showRecod.jsp顯示resultBean中的數(shù)據(jù)。為了避免出現(xiàn)中文亂碼,數(shù)據(jù)庫的連接方式采用:“jdbc:mysql:/地址地址/數(shù)據(jù)庫數(shù)據(jù)庫?user=用戶用戶&password=密碼密碼 &characterEncoding=gb2312;2021-10-29577.8 事務(wù)事務(wù) 事務(wù)由一組SQL語句組成,所謂“事務(wù)處理”是指:應(yīng)用程序保證事務(wù)中的SQL語句要么全部都執(zhí)行,要么一個都不執(zhí)行。 事務(wù)處理步驟如下:1連接對象使用setAutoCom
49、mit(boolean autoCommit)方法將參數(shù)autoCommit取值為false來關(guān)閉自動提交模式:con.setAutoCommit(false);2commit()方法 con調(diào)用commit()方法就是讓事務(wù)中的SQL語句全部生效。3rollback()方法 只要事務(wù)中任何一個SQL語句沒有生效,就拋出SQLException異常。在處理SQLException異常時,必須讓con調(diào)用rollback()方法,其作用是撤消事務(wù)中成功執(zhí)行過的SQL語句對數(shù)據(jù)庫數(shù)據(jù)所做的更新、插入或刪除操作.2021-10-2958 例子例子7_77_7 為了例子7的需要,我們在bank數(shù)據(jù)庫中
50、創(chuàng)建了表user表,表的字段及屬性如下:name(文本文本) userMoney(雙精度型雙精度型) 例子7使用了事務(wù)處理,將user表中name字段是geng的userMoney的值減少50,并將減少的50增加到name字段是zhang的userMony屬性值上。運行效果如圖如圖7.23.2021-10-29597.9 分頁顯示記錄分頁顯示記錄 可以使用二維數(shù)組table存放表的記錄,即用二維數(shù)組table中的行(一維數(shù)組tablei)存放一條記錄。假設(shè)table存放了m行記錄,準備每頁顯示n行,那么,總頁數(shù)的計算公式:如果m除以n的余數(shù)大于0,總頁數(shù)等于m除以n的商加1;如果m除以n的余數(shù)
51、等于0,總頁數(shù)等于m除以n的商。 總頁數(shù)總頁數(shù)=(m%n)=0?(m/n):(m/n+1);=(m%n)=0?(m/n):(m/n+1); 如果準備顯示第p頁的內(nèi)容,應(yīng)當從tablel第 (p-1)*n行開始,連續(xù)輸出行開始,連續(xù)輸出n行行(最后一頁可能不足n行)。2021-10-2960 例子例子7_87_8 下面的例子8使用MVC模式(有關(guān)知識見第6章)分頁顯示warehouse數(shù)據(jù)庫product表中的記錄。2021-10-2961 例子例子7_87_8中的中的web.xmlweb.xml 根據(jù)例子8中使用的servlet的名字及相關(guān)類,Web服務(wù)目錄ch7的WEB-INF下的web.x
52、ml文件需包含如下內(nèi)容(有關(guān)web.xml文件的編輯與保存見見5.1.2): queryAllServlet myservlet.control.Example7_8_Servlet queryAllServlet /queryAllServlet2021-10-2962 例子例子7_87_8中的模型中的模型 模型(Javabean) Javabean模型的id是pageBean(Example7_8_Bean創(chuàng)建),生命周期是session,用于存儲數(shù)據(jù)庫中的記錄。2021-10-2963 例子例子7_87_8中的中的視圖(視圖(JSP頁面)頁面)視圖(JSP頁面)視圖部分由2個JSP頁面構(gòu)
53、成,其中example7_8.jsp頁面負責提供輸入數(shù)據(jù)的視圖,即用戶可以在該頁面輸入數(shù)據(jù)庫的名、表名、密碼等信息,然后提交給名字是queryAllServlet的servlet。queryAllServlet負責查詢數(shù)據(jù)庫,并將結(jié)果存儲到id為pageBean的 J a v a b e a n 數(shù) 據(jù) 模 型 中 , 然 后 請 求 視 圖 中 的example7_8_pageShow.jsp頁面負責分頁顯示pageBean的數(shù)據(jù)。example7_8.jsp和example7_8_pageShow.jsp的效果如圖7.24(a)和圖7.24(b)所示。2021-10-2964 例子例子7_
54、87_8中的控制器中的控制器控制器(控制器(servlet)Example7_8_Servlet負責創(chuàng)建名字是queryAllServlet的servlet(見例子8前面web.xml文件的有關(guān)內(nèi)容)。queryAllServlet查詢數(shù)據(jù)庫表中的全部記錄,將結(jié)果存放到id是pageBean的Javabean數(shù)據(jù)模型中,然后用轉(zhuǎn)發(fā)的方法請求example7_8_pageShow.jsp顯示pageBean中的數(shù)據(jù)。2021-10-29657.10 常見數(shù)據(jù)庫連接常見數(shù)據(jù)庫連接 7.10.1 .連接連接Microsoft SQL Server數(shù)據(jù)庫數(shù)據(jù)庫try Class.forName(com
55、.microsoft.sqlserver.jdbc.SQLServerDriver);catch(Exception e)try String uri= jdbc:sqlserver:/:1433;DatabaseName=warehouse; String user=sa; String password=dog123456; con=DriverManager.getConnection(uri,user,password); catch(SQLException e) System.out.println(e);2021-10-2966 7.10.2 連接Ora
56、cle數(shù)據(jù)庫Class.forName(oracle.jdbc.driver.OracleDriver).newInstance(); Class.forName(oracle.jdbc.driver.OracleDriver).newInstance(); Connection con=DriverManager.getConnection( jdbc:oracle:thin:主機:端口號:數(shù)據(jù)庫名,用戶名,密碼);例如:String user=scott;String password=tiger;con = DriverManager.getConnection (jdbc:oracle
57、:thin::1521:oracle9i,user,password);2021-10-2967 7.10.3 連接Microsoft Access數(shù)據(jù)庫Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);Connection con = DriverManager.getConnection(jdbc:odbc:數(shù)據(jù)源名字“, loginName, password )2021-10-2968 例子例子7_97_9例子9連接Access數(shù)據(jù)庫shop、查詢其中的goods表。2021-10-29697.11 標準化考試標準化考試 我
58、們很熟悉標準化考試,就是只需在給出的選擇中選出正確的答案。在本節(jié)的標準化考試中,用戶只能順序的回答每個隨機抽取到的題目,即回答一個題目,然后讀取下一個題目后,用戶就不能再回到上一個題目(類似新的駕駛員交通理論考試規(guī)則)。 7.11.1 設(shè)計要求設(shè)計要求2021-10-29701. 考生可以在輸入考號的頁面輸入考號,單擊確認提交鍵開始考試。2 .考生單擊確認提交鍵后,可以在答題頁面看到隨機抽取到的第1題。3考生回答一個題目后,可以繼續(xù)隨機抽取下一題目。4. 考生在答題頁面單擊交卷提交鍵,完成考試,系統(tǒng)將給出考生的分數(shù)。 7.11.2 數(shù)據(jù)庫設(shè)計數(shù)據(jù)庫設(shè)計2021-10-2971 創(chuàng)建一個名字為s
59、chool的數(shù)據(jù)庫,在數(shù)據(jù)庫中使用test表存放試題。test表的各個字段及意義如下:number(int) number(int) :存放題號,content(char) content(char) :存放試題內(nèi)容 ,a(char) a(char) :存放試題提供的a選擇 , ,b(char) b(char) :存放試題提供的b選擇,c(char) c(char) :存放試題提供的c選擇,d(char) d(char) :存放試題提供的d選擇,pic(char) pic(char) :存放試題示意圖的圖像文件的名字 ,answer(char) answer(char) :存放試題的答案使用s
60、tudent表存放考生的學號和分數(shù)。student表的各個字段及意義如下:id(char) :存放考號,score(float) :存放分數(shù)。2021-10-2972 7.11.3 有關(guān)代碼有關(guān)代碼 例子10給出設(shè)計的有關(guān)代碼,使用MVC模式(有關(guān)知識見第6章)設(shè)計標準化考試。2021-10-2973 例子例子7_107_10中的中的web.xmlweb.xml 根據(jù)例子10中使用的servlet的名字及相關(guān)類,Web服務(wù)目錄ch7的WEB-INF下的web.xml文件需包含如下內(nèi)容(有關(guān)web.xml文件的編輯與保存見5.1.2): readTestServlet myservlet.control.Example7_10_Servlet readTestServlet /readT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國純棉棉襖行業(yè)投資前景及策略咨詢研究報告
- 2025年焊泥粉項目可行性研究報告
- 2025年槽式混合機項目可行性研究報告
- 2025年料流開關(guān)項目可行性研究報告
- 廣西2025年廣西民族大學招聘教職人員控制數(shù)人員28人筆試歷年參考題庫附帶答案詳解
- 2025至2031年中國單片微電腦繞線機控制器行業(yè)投資前景及策略咨詢研究報告
- 2025年制冷管項目可行性研究報告
- 2025至2031年中國CRP定量試劑盒行業(yè)投資前景及策略咨詢研究報告
- 2025至2030年高真冷裱膜項目投資價值分析報告
- 2025至2030年中國閃光繼電器數(shù)據(jù)監(jiān)測研究報告
- (高清版)DB43∕T 1147-2015 太陽能果蔬烘干機
- 醫(yī)院人體器官捐獻及獲取流程
- 結(jié)腸造瘺還納手術(shù)配合
- 2024年云南省中考物理真題含解析
- 《安防監(jiān)控培訓》課件
- 2025年中國艾草行業(yè)市場現(xiàn)狀、發(fā)展概況、未來前景分析報告
- (閩教版)六年級下英語教學計劃
- 人教版英語高考試卷與參考答案(2024年)
- 河砂、碎石生產(chǎn)質(zhì)量保證措施方案
- 全國教育科學規(guī)劃課題申報書:02.《鑄牢中華民族共同體意識的學校教育研究》
- 三位數(shù)除以兩位數(shù)過關(guān)練習口算題大全附答案
評論
0/150
提交評論