版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章動(dòng)態(tài)顯示信息
7.1目標(biāo)及演示
7.2使用MySQL7.3編寫UserBean7.4編寫userlist.jsp7.5創(chuàng)建控制器
小結(jié)
習(xí)題7實(shí)訓(xùn)7:圖書信息查詢
7.1目?標(biāo)?及?演?示
7.1.1功能描述
首先需要在數(shù)據(jù)庫(kù)中建立存儲(chǔ)用戶信息的表,然后使用JSP
7.1.2運(yùn)行效果
當(dāng)點(diǎn)擊查看用戶信息的時(shí)候,會(huì)得到如圖7.1圖7.1所有用戶信息
7.1.3相關(guān)文件
顯示用戶信息的功能包括3個(gè)文件:
●?UserBean.java,需要在這個(gè)文件中添加一個(gè)查詢方法,查詢所有的用戶信息。
●?userlist.jsp,顯示所有用戶信息。
●?FindAllUserServlet.java,控制器Servlet,調(diào)用UserBean中的查詢所有用戶的方法,傳遞給userlist.jsp。
7.1.4思路分析
根據(jù)前面介紹的MVC模式,對(duì)于本功能應(yīng)該做如下設(shè)計(jì):
(1)考慮V部分,也就是輸入/輸出,應(yīng)該從用戶的角度出發(fā)。用戶要查看所有用戶的信息,分兩步:
●輸入。用戶要查看所有用戶的信息,應(yīng)該在某個(gè)界面上有一個(gè)超鏈接,通過點(diǎn)擊這個(gè)超鏈接發(fā)送請(qǐng)求。所以只需要在需要查看所有用戶信息的界面上增加一個(gè)超鏈接即可。
●輸出。系統(tǒng)完成查詢之后,界面要顯示查詢的結(jié)果。而這些信息是動(dòng)態(tài)的,所以需要從控制層傳遞過來,這里需要知道要傳遞的信息的名字。我們使用userlist表示,這個(gè)名字相當(dāng)于控制層與表示層之間的接口。因?yàn)椴樵兊慕Y(jié)果可能有很多,所以通常需要使用表格來呈現(xiàn)信息,使用標(biāo)準(zhǔn)標(biāo)簽庫(kù)的<c:forEach>標(biāo)簽完成信息的輸出。
(2)考慮M部分,也就是功能如何實(shí)現(xiàn)。該功能是查詢所有用戶信息,是與用戶相關(guān)的操作,可以考慮使用前面介紹的UserBean,然后增加一個(gè)新的方法即可。方法的設(shè)計(jì)
如下:
●方法名。方法名要體現(xiàn)方法的功能,所以這里使用findAllUser。
●方法的參數(shù)。因?yàn)橐樵兯械挠脩?,不需要查詢條件,所以參數(shù)列表為空。
●方法的返回值。查詢的結(jié)果是多個(gè)用戶,每個(gè)用戶是一個(gè)對(duì)象,所以應(yīng)該返回對(duì)象的集合,通常使用ArrayList。
●方法的異常列表。這里不需要考慮異常,所以異常列表為空。
●方法實(shí)現(xiàn),訪問數(shù)據(jù)庫(kù)獲取所有用戶信息,然后把這些信息封裝成對(duì)象,再把對(duì)象封裝成集合對(duì)象。
(3)考慮C部分,也就是如何建立視圖和模型之間的關(guān)聯(lián),這里使用Servlet來實(shí)現(xiàn),設(shè)計(jì)過程如下:
●獲取用戶的輸入信息,這個(gè)請(qǐng)求沒有條件,所以不需要獲取。
●調(diào)用模型,創(chuàng)建UserBean的對(duì)象,然后調(diào)用findAllUser方法,并保存返回的結(jié)果。
●把得到的結(jié)果存儲(chǔ)在request對(duì)象中,使用名字userlist,這是前面界面設(shè)計(jì)時(shí)給出的名字。
●跳轉(zhuǎn)到響應(yīng)界面userlist.jsp。
圖7.2文件之間的關(guān)系
7.2使用MySQL
7.2.1MySQL數(shù)據(jù)庫(kù)的下載
本書使用的安裝程序是:mysql-5.0.20-win32.exe7.2.2MySQL數(shù)據(jù)庫(kù)的安裝
安裝前的準(zhǔn)備工作和注意事項(xiàng):
(1)首先檢查計(jì)算機(jī)上是否已經(jīng)安裝了MySQL。方法是:打開【開始】【程序】,查看是否有MySQL的目錄;或者到【服務(wù)】中查看是否有名為MySQL的服務(wù)。
(2)所有的安裝目錄必須是英文目錄(不能是中文)。
下面是具體的安裝過程:
(1)運(yùn)行mysql-5.0.20-win32.exe,進(jìn)入歡迎界面,如圖7.3所示。
圖7.3歡迎界面
(2)選擇安裝類型,這里選擇默認(rèn)的安裝類型,即“Typical”,如圖7.4所示。
圖7.4選擇安裝類型
(3)下一個(gè)界面顯示默認(rèn)的安裝目錄,如圖7.5所示。如果不想使用默認(rèn)的安裝目錄,則可以點(diǎn)擊【Back】按鈕,回到前一界面,選擇“Custom”,這樣可以自己指定安裝目錄。
(4)點(diǎn)擊【Install】開始安裝,如圖7.6所示。
圖7.5安裝信息確認(rèn)
圖7.6安裝過程
圖7.7注冊(cè)
圖7.8配置服務(wù)器
(7)點(diǎn)擊【Finish】進(jìn)入下一個(gè)界面:使用配置向?qū)砼渲肕ySQL實(shí)例,如圖7.9所示。
圖7.9開始配置
(8)點(diǎn)擊【Next】進(jìn)入下一個(gè)界面:選擇配置類型,請(qǐng)選擇標(biāo)準(zhǔn)配置“StandardConfiguration”,如圖7.10所示。
圖7.10選擇配置類型
(9)點(diǎn)擊【Next】進(jìn)入下一個(gè)界面:設(shè)置Windows選項(xiàng),默認(rèn)情況下選擇將MySQL安裝為Windows服務(wù),并在開機(jī)時(shí)自動(dòng)啟動(dòng)該服務(wù)。注意選中“IncludeBinDirectoryinWindowsPATH”,這樣會(huì)使得MySQL的bin目錄被包含在Windows的環(huán)境變量PATH中,便于安裝以后在命令行下執(zhí)行MySQL命令,如圖7.11所示。
圖7.11服務(wù)設(shè)置
(10)點(diǎn)擊【Next】進(jìn)入下一個(gè)界面:設(shè)置安全選項(xiàng),如圖7.12所示。這里要求設(shè)置管理員root的口令,輸入兩遍相同的密碼,一定要把它記住。選中“Enablerootaccessfromremotemachines”,則允許遠(yuǎn)程計(jì)算機(jī)使用root(管理員)登錄到MySQL。選中“CreateAnAnonymousAccount”,會(huì)自動(dòng)創(chuàng)建匿名用戶,這樣就可以不使用任何用戶名登錄到MySQL服務(wù)器。
圖7.12設(shè)置口令
(11)點(diǎn)擊【Next】進(jìn)入下一個(gè)界面,直接點(diǎn)擊【Execute】按鈕開始配置,如圖7.13所示。
圖7.13開始配置
圖7.13開始配置
(12)配置完成的界面如圖7.14所示。
圖7.14完成配置
(13)配置完成以后,首先到【控制面板】【管理工具】【服務(wù)】中查看是否有名為MySQL的服務(wù),以及該服務(wù)是否已經(jīng)啟動(dòng),如圖7.15所示。如果服務(wù)已經(jīng)安裝并且啟動(dòng),說明安裝成功。
圖7.15查看安裝的MySQL服務(wù)
7.2.3MySQL數(shù)據(jù)庫(kù)的常用操作
1.登錄和退出MySQL
要登錄到MySQL數(shù)據(jù)庫(kù)服務(wù)器,首先要進(jìn)入命令行界面并輸入如下的命令:
mysql-hhostname-uusername–p
圖7.16是一個(gè)連接數(shù)據(jù)庫(kù)的例子。
圖7.16連接數(shù)據(jù)庫(kù)
如果連接成功,應(yīng)該出現(xiàn)mysql>提示符,這時(shí)就可以輸入mysql命令和SQL語句了。
如果要退出mysql,只需要輸入“quit”命令就可以了。
2.顯示現(xiàn)有的數(shù)據(jù)庫(kù)和表信息
連接到數(shù)據(jù)庫(kù)服務(wù)器以后,通常需要對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行操作。首先需要查看數(shù)據(jù)庫(kù)服務(wù)器上有哪些可用的數(shù)據(jù)庫(kù)和表。
查看數(shù)據(jù)庫(kù)的命令為:
showdatabases;
要想查看某個(gè)數(shù)據(jù)庫(kù)中有哪些表,首先需要選擇數(shù)據(jù)庫(kù)。
選擇數(shù)據(jù)庫(kù)的命令為:
usedbname;選擇了數(shù)據(jù)庫(kù)以后,就可以對(duì)該數(shù)據(jù)庫(kù)進(jìn)行操作。
查看當(dāng)前數(shù)據(jù)庫(kù)中的表的命令為:
showtables;
如果想查看的數(shù)據(jù)庫(kù)不是當(dāng)前使用的數(shù)據(jù)庫(kù),可以使用下面的命令:
showtablesfromdbname;
該命令僅僅顯示當(dāng)前數(shù)據(jù)庫(kù)中的表的名稱。如果想查看某個(gè)表的結(jié)構(gòu),可以使用下面的命令:
desctablename;
要查看表中的列信息,使用下面的命令:
showcolumnsfromdbname.tablename;圖7.17顯示所有數(shù)據(jù)庫(kù)和表
3.創(chuàng)建用戶和授權(quán)
在安裝完MySQL以后,默認(rèn)的用戶只有root用戶。為了安全起見,root用戶通常只用做管理目的。對(duì)于每個(gè)需要使用該數(shù)據(jù)庫(kù)的用戶(或應(yīng)用),都應(yīng)該為他們創(chuàng)建一個(gè)帳號(hào)和
密碼。
通常情況下,使用MySQL數(shù)據(jù)庫(kù)的用戶并不需要root用戶所擁有的所有權(quán)限。一個(gè)用戶只需要擁有能夠執(zhí)行需要執(zhí)行的任務(wù)的最低級(jí)別的權(quán)限就可以了。
創(chuàng)建用戶的一種簡(jiǎn)單的方法是直接使用授權(quán)命令(grant)來授予權(quán)限。
授權(quán)命令的語法形式為:
grantprivileges[columns]ondbname.tablename
touser_name[identifiedby'password']
[with[grantoption|limit_options]];說明:
●
privileges應(yīng)該是由逗號(hào)分開的一組權(quán)限。
●
columns是可選的,可以用它對(duì)每一列指定權(quán)限。
●
dbname.tablename用于指定使用權(quán)限的數(shù)據(jù)庫(kù)和表。*或者*.*表示將權(quán)限用于所有數(shù)據(jù)庫(kù)(全局權(quán)限)。要想指定權(quán)限用于某個(gè)數(shù)據(jù)庫(kù)中的所有表(表級(jí)),可以寫為dbname.*。
●?user_name是登錄MySQL使用的用戶名,也可以加上@hostname以指定是來自哪個(gè)域的用戶。
●?password是用戶登錄時(shí)使用的密碼。
●?如果指定withgrantoption選項(xiàng),則表示允許指定的用戶向別人授予自己所擁有的權(quán)限。
執(zhí)行g(shù)rant命令時(shí),如果要授權(quán)的用戶不存在,則系統(tǒng)會(huì)自動(dòng)創(chuàng)建該用戶。因此,授權(quán)命令也可以用來創(chuàng)建用戶。
例如,如果要?jiǎng)?chuàng)建一個(gè)用戶,允許訪問當(dāng)前的所有數(shù)據(jù)庫(kù)和所有表,則可以使用下面的命令:
grantallon*.*tozhangidentifiedby'zhang123';
在該語句中創(chuàng)建的用戶名為zhang,密碼為zhang123,可以對(duì)所有數(shù)據(jù)庫(kù)和表執(zhí)行任何操作。
如果要?jiǎng)?chuàng)建一個(gè)用戶,允許訪問test數(shù)據(jù)庫(kù),則可以使用下面的命令:
grantallontest.*towangidentifiedby'wang123';創(chuàng)建好用戶以后,可以使用下面的命令來查看數(shù)據(jù)庫(kù)中現(xiàn)有的用戶:
selectuserfrommysql.user;
可以在退出mysql以后,再次使用新創(chuàng)建的用戶登錄到mysql。
命令的運(yùn)行結(jié)果如圖7.18所示。
如果想要收回某個(gè)用戶的權(quán)限,可以使用revoke命令。語法如下:
revokeprivileges[(columns)]ondbname.table
fromuser_name;
例如,如果希望刪除用戶wang,可以使用下面的命令:
revokeallprivilegesfromwang;
4.創(chuàng)建數(shù)據(jù)庫(kù)和刪除數(shù)據(jù)庫(kù)
MySQL可以支持多個(gè)數(shù)據(jù)庫(kù)。通常,每個(gè)應(yīng)用程序都需要一個(gè)數(shù)據(jù)庫(kù)。
創(chuàng)建數(shù)據(jù)庫(kù)的命令是:
createdatabasedbname;
例如,本書中用到的數(shù)據(jù)庫(kù)為bookstore,則可以使用下面的語句創(chuàng)建數(shù)據(jù)庫(kù):
createdatabasebookstore;
刪除數(shù)據(jù)庫(kù)的命令是:
dropdatabasedbname;圖7.18連接到MySQL
5.創(chuàng)建表和刪除表
創(chuàng)建好數(shù)據(jù)庫(kù)以后,通常需要?jiǎng)?chuàng)建表。創(chuàng)建表可以使用SQL語句createtable。語法格式為:
createtabletablename(columns);
說明:
●?tablename是要?jiǎng)?chuàng)建的表的名稱。
●?columns是表中包含的列。每個(gè)列都需要指定列名,后面加上該列的數(shù)據(jù)類型,還可以加上約束條件。如果有多個(gè)列,需要使用逗號(hào)分隔。
●也可以設(shè)置表級(jí)的約束條件。
例如,創(chuàng)建后面的實(shí)例時(shí)將要使用的用戶表如下:
createtableusertable(
useridvarchar(8)primarykey,
usernamevarchar(10),
userpassvarchar(8),
typechar(1),
birthdaydate,
degreevarchar(10),
localvarchar(4),
emailvarchar(20),
addressvarchar(50),
commentvarchar(100)
)
要?jiǎng)h除表,可以使用下面的語句:
droptabletablename;
6.向表中插入數(shù)據(jù)
創(chuàng)建好表以后,要想對(duì)表進(jìn)行操作,必須先保存一些數(shù)據(jù),方法是使用SQL語句insert。通常,insert語句的語法格式如下:
insert[into]tablename[(col1,col2,…)]values(value1,value2,…);
例如,要向表中插入一條記錄,可以輸入下面的命令:
insertintousertablevalues(
'user004','張三','zhangsan','0','1985-02-04','本科','東北','zhangsan@',
'大連軟件園','我喜歡計(jì)算機(jī)類圖書');
如果只針對(duì)少部分列插入數(shù)據(jù),可以使用下面的語法格式:
insert[into]tablenamesetcol1=expression1,…
也可以一次將多行數(shù)據(jù)插入表中。每行數(shù)據(jù)用括號(hào)括起來,每組括號(hào)之間用逗號(hào)分隔。
7.從表中獲取數(shù)據(jù)
從表中獲取數(shù)據(jù)使用的是select語句。它的語法格式如下:
select[options]items
[intofile_name]
fromtables
[wherecondition]
[groupbygroup_type][HAVINGconditon]
[orderbyorder_type]
[limitlimit_criteria]
例如,要查看所有用戶信息,可以使用下面的語句:
select*fromusertable;
8.刪除表中數(shù)據(jù)
要想刪除表中的數(shù)據(jù),可以使用delete語句。語法格式為:
deletefromtablename
[wherecondition]
[orderbyorder_cols]
[limitnumber]
例如,要?jiǎng)h除用戶ID為“user002”的用戶信息,可以使用下面的代碼:
deletefromusertablewhereuserid='user002'
9.更新表中的數(shù)據(jù)
要想修改表中的數(shù)據(jù),可以使用update語句。語法格式為:
updatetablename
setcol1=expression1,…
[wherecondition]
[orderbyorder_criteria]
[limitnumber]
例如,要將用戶ID為“user002”的用戶的用戶名修改為“Jack”,可以使用下面的語句:
updateusertablesetusername='Jack'whereuserid='user002' 7.3編寫UserBean
7.3.1JDBC的基本用法
JDBC是Java應(yīng)用與數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)行交互的標(biāo)準(zhǔn)API,包括多個(gè)接口:Driver、DriverManager、Connection、Statement、PrepareStatement和ResultSet等。Driver表示驅(qū)動(dòng)程序,DriverManager用于管理驅(qū)動(dòng)程序,Connection表示與數(shù)據(jù)庫(kù)之間的一個(gè)連接,要執(zhí)行SQL語句需要使用Statement和PrepareStatement,如果要查詢數(shù)據(jù)庫(kù)會(huì)得到結(jié)果集ResultSet。這些接口是JDBC的基本接口,編寫數(shù)據(jù)庫(kù)應(yīng)用的時(shí)候,主要就是對(duì)這些接口的使用。編寫Java數(shù)據(jù)庫(kù)應(yīng)用的基本過程如下:
●建立數(shù)據(jù)源(庫(kù));
●導(dǎo)入用到的包;
●加載驅(qū)動(dòng)程序;
●創(chuàng)建與數(shù)據(jù)庫(kù)的連接;
●創(chuàng)建語句對(duì)象;
●編寫SQL語句;
●執(zhí)行SQL語句;
●處理結(jié)果集;
●關(guān)閉相關(guān)對(duì)象;
●處理異常。
(1)建立數(shù)據(jù)源(庫(kù))。要使用的數(shù)據(jù)庫(kù)就是在“使用MySQL”一節(jié)創(chuàng)建的數(shù)據(jù)庫(kù),所以這個(gè)步驟就省略了。
(2)導(dǎo)入java.sql包。在連接數(shù)據(jù)庫(kù)的過程中需要用到以下接口和類:
Driver:驅(qū)動(dòng)程序(不同的數(shù)據(jù)庫(kù)使用不同的驅(qū)動(dòng)程序),用于連接應(yīng)用程序(包括Application,JSP,Servlet,JavaBean)和數(shù)據(jù)庫(kù)。
DviverManager:驅(qū)動(dòng)程序管理器,用于對(duì)程序中用到的驅(qū)動(dòng)程序進(jìn)行管理,包括加載驅(qū)動(dòng)程序、創(chuàng)建對(duì)象、調(diào)用方法等。
Connection:連接,不管對(duì)數(shù)據(jù)庫(kù)進(jìn)行什么樣的操作,都需要先創(chuàng)建一個(gè)連接,然后通過這個(gè)連接來完成操作。
Statement:語句對(duì)象,用于執(zhí)行SQL語句。連接數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問,主要就是執(zhí)行一些SQL語句,語句對(duì)象就是用于執(zhí)行SQL語句的。
ResultSet:結(jié)果集對(duì)象,用于表示查詢后得到的結(jié)果。如果要查詢數(shù)據(jù)庫(kù)中的一些信息,例如所有用戶信息,查詢完之后查詢結(jié)果就保存在結(jié)果集對(duì)象中。
這些接口和類在java.sql包中,要訪問這些接口和類,需要導(dǎo)入這個(gè)包。在Java中引入這個(gè)包的語句為:
importjava.sql.*;
(3)加載驅(qū)動(dòng)程序。驅(qū)動(dòng)程序的作用就是把用戶對(duì)數(shù)據(jù)庫(kù)的訪問請(qǐng)求轉(zhuǎn)換成數(shù)據(jù)庫(kù)可以理解的方式,然后把數(shù)據(jù)庫(kù)的執(zhí)行結(jié)果返回給用戶。例如要向數(shù)據(jù)庫(kù)中添加一個(gè)新的用戶,需要編寫相應(yīng)的SQL語句,然后執(zhí)行SQL語句。怎么執(zhí)行SQL語句呢?驅(qū)動(dòng)程序把這個(gè)請(qǐng)求提交給數(shù)據(jù)庫(kù),然后由數(shù)據(jù)庫(kù)執(zhí)行。因?yàn)槊總€(gè)數(shù)據(jù)庫(kù)的執(zhí)行過程不同,所以每個(gè)數(shù)據(jù)庫(kù)都應(yīng)該有自己的驅(qū)動(dòng)程序。根據(jù)要訪問的數(shù)據(jù)庫(kù),首先要加載相應(yīng)的驅(qū)動(dòng)程序。
如果驅(qū)動(dòng)程序的名字是MyDriver,則加載驅(qū)動(dòng)程序的語句是:
Class.forName("MyDriver");本書中使用的是MySQL數(shù)據(jù)庫(kù),連接MySQL數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序是com.mysql.
jdbc.Driver。
加載該驅(qū)動(dòng)程序的語句是:
Class.forName("com.mysql.jdbc.Driver");
(4)創(chuàng)建與數(shù)據(jù)庫(kù)的連接。不管對(duì)數(shù)據(jù)庫(kù)進(jìn)行什么樣的操作,都需要先創(chuàng)建連接,然后操作。
要連接數(shù)據(jù)庫(kù),首先需要知道數(shù)據(jù)庫(kù)的相關(guān)信息。通常連接數(shù)據(jù)庫(kù)需要的信息包括以下幾個(gè)方面:
①
數(shù)據(jù)庫(kù)的位置:包括數(shù)據(jù)庫(kù)所在的主機(jī)和所使用的端口。每個(gè)應(yīng)用程序都會(huì)有自己的端口,例如Oracle使用的端口默認(rèn)情況下是1521,MicroSoftSQLServer使用的端口默認(rèn)情況下是1433,我們要使用的MySQL的端口默認(rèn)情況下是3306。
②
數(shù)據(jù)庫(kù)的信息:包括數(shù)據(jù)庫(kù)的名字。因?yàn)樵谕粋€(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)中可能會(huì)有多個(gè)數(shù)據(jù)庫(kù),所以需要指出要訪問哪個(gè)數(shù)據(jù)庫(kù)。這里,我們要訪問的數(shù)據(jù)庫(kù)是bookstore。
③
用戶信息:包括用戶名和口令。因?yàn)閿?shù)據(jù)庫(kù)中的信息通常都非常重要,所以一般需要提供身份驗(yàn)證。
有了數(shù)據(jù)庫(kù)的相關(guān)信息,接下來就可以創(chuàng)建與數(shù)據(jù)庫(kù)的連接了。連接數(shù)據(jù)庫(kù)的格式如下:
Connectioncon=DriverManager.getConnection(constr,user,pass);
其中,constr是連接字符串,user是用戶名,pass是口令。
若使用MySQL數(shù)據(jù)庫(kù),連接字符串的格式為jdbc:mysql://localhost:3306/bookstore,其中bookstore是數(shù)據(jù)庫(kù)的名字,假設(shè)用戶名和口令都是root,則連接該數(shù)據(jù)庫(kù)的代碼如下:
Connectioncon=
DriverManager.getConnection("jdbc:mysql://localhost:3306/bookstore","root","root");
(5)創(chuàng)建語句對(duì)象。創(chuàng)建語句對(duì)象是用來執(zhí)行SQL語句的。不管對(duì)數(shù)據(jù)庫(kù)進(jìn)行什么樣的操作,都是執(zhí)行SQL語句,不同的是,不同的功能需要執(zhí)行不同的SQL語句。
語句對(duì)象是Statement的對(duì)象,語句對(duì)象的創(chuàng)建是通過連接對(duì)象創(chuàng)建的,所以在創(chuàng)建語句對(duì)象之前應(yīng)該確保連接對(duì)象已經(jīng)創(chuàng)建。
創(chuàng)建語句對(duì)象的代碼如下:
Statementstmt=con.createStatement();不管連接什么數(shù)據(jù)庫(kù),不管執(zhí)行什么樣的操作,這句代碼都不用修改。
(6)編寫SQL語句。根據(jù)要完成的功能,編寫相應(yīng)的SQL語句。最常用的SQL語句有如下幾個(gè):
①
添加:insert語句。
②
刪除:delete語句。
③
查詢:selete語句。
④
修改:update語句。
在程序中SQL語句表現(xiàn)為字符串,例如要查詢所有的用戶信息,代碼如下:
Stringsql="select*fromusertable";
(7)執(zhí)行SQL語句。使用語句對(duì)象來執(zhí)行SQL語句,語句對(duì)象提供了多個(gè)用于執(zhí)行SQL語句的方法,常用的有兩個(gè):
executeQuery(Stringsql):主要用于執(zhí)行有結(jié)果集返回的SQL語句,典型的就是select查詢語句。要從數(shù)據(jù)庫(kù)得到一些數(shù)據(jù),會(huì)有一些數(shù)據(jù)返回,這時(shí)候就應(yīng)該使用該方法。
executeUpdate(Stringsql):主要用于執(zhí)行沒有結(jié)果集返回的SQL語句。比如要向數(shù)據(jù)庫(kù)中添加信息、修改數(shù)據(jù)庫(kù)中的信息或者刪除數(shù)據(jù)庫(kù)中的信息,它們都沒有結(jié)果集返回,就應(yīng)該使用該方法。該方法的返回值是整數(shù),表示影響數(shù)據(jù)庫(kù)中記錄的個(gè)數(shù)。
假設(shè)要執(zhí)行上面的查詢語句,可以使用下面的代碼:
ResultSetrs=stmt.execute(sql);
因?yàn)橛薪Y(jié)果集返回,所以創(chuàng)建ResultSet的對(duì)象來接收這個(gè)結(jié)果集。stmt是前面創(chuàng)建的語句對(duì)象,sql是前面編寫的SQL語句。
(8)處理結(jié)果集。如果進(jìn)行刪除、插入或者更新操作,執(zhí)行完就可以了。如果要查詢數(shù)據(jù),需要處理查詢結(jié)果。查詢的結(jié)果在結(jié)果集中保存,結(jié)果集的數(shù)據(jù)就像數(shù)據(jù)庫(kù)中的表格一樣,由若干行、若干列組成,每一行表示一個(gè)記錄。而Java是面向?qū)ο蟮恼Z言,操作的是一個(gè)個(gè)的對(duì)象,所以需要把結(jié)果集的數(shù)據(jù)進(jìn)行處理,轉(zhuǎn)化成對(duì)象。
結(jié)果集就像一個(gè)表格,由若干行和若干列組成,查詢的結(jié)果中有多少條記錄,結(jié)果集中就有多少行,查詢的結(jié)果中有多少字段,結(jié)果集中就有多少列。
處理結(jié)果集的過程,就是對(duì)結(jié)果集的遍歷過程。遍歷每一行,然后取出當(dāng)前行的每一列,再根據(jù)這一行的各列的信息構(gòu)造對(duì)象。
對(duì)行的遍歷,使用結(jié)果集的next()方法。
要獲取某一列,使用get方法。有很多get方法用于獲取不同類型的值,例如通過getInt可獲取整數(shù)字段的值,通過getString可獲取字符串字段的值,這些方法的區(qū)別在于方法的返回值不同。為了便于大家記憶,只需要記住getString方法就可以了。如果需要其他類型的值,則進(jìn)行轉(zhuǎn)換就可以了。
getString方法需要一個(gè)參數(shù),參數(shù)表示要獲取哪一列的值。參數(shù)可以使用序號(hào),例如獲取第1列,可以使用getString(1)。參數(shù)也可以使用列的名字,例如獲取用戶名,可以使用getString("username")。
例如要以字符串的形式獲取第1列可以使用下面的代碼:
Stringuserid=rs.getString(1);
(9)關(guān)閉相關(guān)對(duì)象。在上面的介紹中,我們創(chuàng)建了多個(gè)對(duì)象,其中連接對(duì)象、語句對(duì)象、結(jié)果集對(duì)象需要關(guān)閉,如果不關(guān)閉,這些連接會(huì)占用資源。對(duì)于網(wǎng)絡(luò)應(yīng)用來說,用戶量非常大,如果每個(gè)用戶都浪費(fèi)資源的話,系統(tǒng)資源的浪費(fèi)就會(huì)很大。所以需要關(guān)閉這些對(duì)象。
關(guān)閉連接的代碼是:
con.close();
關(guān)閉語句的代碼是:
stmt.close();
關(guān)閉結(jié)果集的代碼是:
rs.close();
(10)處理異常。在對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的過程中可能會(huì)發(fā)生各種各樣的異常,例如數(shù)據(jù)庫(kù)服務(wù)器沒有啟動(dòng)、網(wǎng)絡(luò)沒有連接、SQL語句寫錯(cuò)等。如果不對(duì)這些異常進(jìn)行處理,程序在運(yùn)行過程中就會(huì)出錯(cuò),對(duì)用戶來說是不友好的,所以應(yīng)該對(duì)異常進(jìn)行處理。
使用下面的框架對(duì)異常進(jìn)行處理:
try{
//要執(zhí)行的可能出錯(cuò)的代碼
}catch(Exceptione){
//出錯(cuò)后的處理代碼
}finally{
//不管是否出錯(cuò)都要執(zhí)行的代碼
}7.3.2編寫表示用戶信息的JavaBean
在數(shù)據(jù)庫(kù)中,實(shí)體是以記錄的形式存在的,而在程序中,實(shí)體是以對(duì)象的形式存在的。對(duì)應(yīng)數(shù)據(jù)庫(kù)中的表,應(yīng)該提供一個(gè)類。用于保存用戶信息的表是usertable
packagebookstore.bean;
importjava.util.*;
importjava.sql.*;
publicclassUserBean{
privateStringuserid;
privateStringusername;
privateStringuserpass;
privateStringtype="0";
privatejava.util.Datebirthday;
privateStringdegree;
privateStringlocal;
privateStringemail;
privateStringaddress;
privateStringcomment;
publicStringgetUserid(){
returnuserid;
}
publicvoidsetUserid(Stringuserid){
this.userid=userid;
}
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetUserpass(){
returnuserpass;
}
publicvoidsetUserpass(Stringuserpass){
this.userpass=userpass;
}
publicStringgetType(){
returntype;
}
publicvoidsetType(Stringtype){
this.type=type;
}
publicjava.util.DategetBirthday(){
returnbirthday;
}
publicvoidsetBirthday(java.util.Datebirthday){
this.birthday=birthday;
}
publicStringgetDegree(){
returndegree;
}
publicvoidsetDegree(Stringdegree){
this.degree=degree;
}
publicStringgetLocal(){
returnlocal;
}
publicvoidsetLocal(Stringlocal){
this.local=local;
}
publicStringgetEmail(){
returnemail;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
publicStringgetCommentt(){
returncomment;
}
publicvoidsetComment(Stringcontent){
ment=comment;
}
}7.3.3編寫查詢所有用戶的方法
接下來編寫查詢所有用戶信息的方法,方法的返回值是所有用戶對(duì)象的集合,不需要查詢條件,方法的定義如下:
publicArrayListfindAllUser()
根據(jù)前面介紹的訪問數(shù)據(jù)庫(kù)的基本過程,需要在類的前面添加導(dǎo)入java.sql包的代碼。另外,要使用ArrayList,需要在類的定義前面添加導(dǎo)入java.util.ArrayList的代碼。類代碼之前添加的代碼如下:
importjava.sql.*;
importjava.util.*;
方法的定義如下:
publicArrayListfindAllUser()
{
ArrayListuserlist=newArrayList();
//連接對(duì)象
Connectioncon=null;
//語句對(duì)象
Statementstmt=null;
//結(jié)果集對(duì)象
ResultSetrs=null;
//查詢語句
Stringsql="select*fromusertable";
//連接數(shù)據(jù)庫(kù)的URLStringurl="jdbc:mysql://:3306/bookstore";
//用戶名
Stringdbuser="root";
//口令
Stringdbpass="root";
try
{
//加載驅(qū)動(dòng)程序,參數(shù)是驅(qū)動(dòng)程序的名字
Class.forName("com.mysql.jdbc.Driver");
//建立連接,第一個(gè)參數(shù)是url,
//第二個(gè)是用戶名,第三個(gè)是口令
con=DriverManager.getConnection(url,dbuser,dbpass);
//創(chuàng)建語句對(duì)象
stmt=con.createStatement();
//執(zhí)行select語句,返回結(jié)果集對(duì)象
rs=stmt.executeQuery(sql);
//對(duì)結(jié)果集進(jìn)行遍歷
while(rs.next())
{
//獲取結(jié)果集中的信息
StringtmpUserid=rs.getString(1);
StringtmpUsername=rs.getString(2);
//進(jìn)行編碼轉(zhuǎn)換
tmpUsername=newString(tmpUsername.getBytes("8859_1"));
StringtmpUserpass=rs.getString(3);
StringtmpType=rs.getString(4);
java.util.DatetmpBirthday=rs.getDate(5);
StringtmpDegree=rs.getString(6);
tmpDegree=newString(tmpDegree.getBytes("8859_1"));
StringtmpLocal=rs.getString(7);
tmpLocal=newString(tmpLocal.getBytes("8859_1"));
StringtmpEmail=rs.getString(8);
StringtmpAddress=rs.getString(9);
tmpAddress=newString(tmpAddress.getBytes("8859_1"));
StringtmpComment=rs.getString(10);
//創(chuàng)建用戶對(duì)象
UserBeanuser=newUserBean();
//根據(jù)獲取的用戶信息初始化用戶對(duì)象
user.setUserid(tmpUserid);
user.setUsername(tmpUsername);
user.setUserpass(tmpUserpass);
user.setType(tmpType);
user.setBirthday(tmpBirthday);
user.setDegree(tmpDegree);
user.setLocal(tmpLocal);
user.setEmail(tmpEmail);
user.setAddress(tmpAddress);
user.setComment(tmpComment);
//把對(duì)象添加到集合中
userlist.add(user);
}
}catch(Exceptione)
{
}
finally
{
//關(guān)閉對(duì)象的順序:rsstmtcon
//與創(chuàng)建對(duì)象的順序相反
try{rs.close();}catch(Exceptione){}
try{stmt.close();}catch(Exceptione){}
try{con.close();}catch(Exceptione){}
}
//返回查詢到的所有對(duì)象
returnuserlist;
}7.3.4采用數(shù)據(jù)庫(kù)連接池
1.配置JNDI數(shù)據(jù)源
DBCP可以使用很多技術(shù)實(shí)現(xiàn),本書介紹的是比較流行的Jakarta-Commons的DBCP。
使用連接池的時(shí)候存在一個(gè)問題。Web應(yīng)用必須顯式地關(guān)閉結(jié)果集對(duì)象、語句對(duì)象、連接對(duì)象,如果關(guān)閉失敗,將導(dǎo)致這些對(duì)象不能重用。可能還會(huì)導(dǎo)致在連接使用完的時(shí)候,Web應(yīng)用無法連接到數(shù)據(jù)庫(kù)。
Jakarta-Commons的DBCP提供了一種機(jī)制,能夠跟蹤和恢復(fù)那些不能被管理的連接。此時(shí)需要在配置數(shù)據(jù)源的時(shí)候增加下面的代碼:
removeAbandoned=“true”
當(dāng)可用的連接數(shù)比較少時(shí),連接池會(huì)查找并重復(fù)使用這些不能被管理的連接??梢允褂胷emoveAbandonedTimeout屬性設(shè)置一個(gè)連接空閑多少秒之后就認(rèn)為是已經(jīng)被放棄的連接,默認(rèn)值是300s。如果想改為60s,可以使用下面的代碼:
removeAbandonedTimeout=“60”
可以設(shè)置logAbandoned屬性來記錄沒有正確釋放連接的代碼:
logAbandoned="true"
2.配置server.xml
server.xml文件在Tomcat安裝目錄的conf子目錄下。在</host>之前應(yīng)增加下面的代碼:
<Contextpath="/bookstore"docBase="bookstore"
debug="5"reloadable="true"crossContext="true">
<Resourcename="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root“
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://:3306/bookstore?autoReconnect=true"/>
</Context>各屬性的含義如下:
(1)
maxActive:池中連接的最大數(shù)目。要確保讓MySQL的最大連接數(shù)大于這個(gè)值。如果其值為0,則沒有最大數(shù)量限制。
(2)
maxIdle:池中最大空閑數(shù)據(jù)庫(kù)連接數(shù)。如果其值為-1,則沒有限制。
(3)?maxWait:等待一個(gè)連接變成可用的最長(zhǎng)時(shí)間,單位是ms。這個(gè)例子中該值為10s,如果超時(shí)將拋出異常。如果設(shè)置為-1,將無限等待。
(4)
username和
password:連接MySQL數(shù)據(jù)庫(kù)的用戶名和口令。
(5)
driverClassName:MySQL數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序的名字,這里的名字是com.mysql.jdbc.Driver。
(6)
url:JDBC連接MySQL數(shù)據(jù)庫(kù)的url。參數(shù)autoReconnect=true確保連接池能夠重新連接。如果8個(gè)小時(shí)沒有操作,MySQL管理器會(huì)關(guān)閉連接。
3.配置web.xml
需要為當(dāng)前應(yīng)用配置web.xml。其主要作用是聲明數(shù)據(jù)源。代碼如下:
<resource-ref>
<description>DBConnection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
4.使用連接池訪問數(shù)據(jù)庫(kù)
使用連接池訪問數(shù)據(jù)庫(kù)與使用JDBC直接訪問數(shù)據(jù)庫(kù)的過程基本相同,只是得到連接的方式不同。
下面的代碼展示了在使用連接池的時(shí)候,如何獲取到數(shù)據(jù)庫(kù)的連接:
ContextinitContext=newInitialContext();
ContextenvContext=(Context)initContext.lookup("java:/comp/env");
DataSourceds=(DataSource)envContext.lookup("jdbc/TestDB");
Connectionconn=ds.getConnection();
修改后的findAllUser方法的代碼如下:
publicArrayListfindAllUser()
{
ArrayListuserlist=newArrayList();
//連接對(duì)象
Connectioncon=null;
//語句對(duì)象
Statementstmt=null;
//結(jié)果集對(duì)象
ResultSetrs=null;
//查詢語句
Stringsql="select*fromusertable";
try
{
//創(chuàng)建上下文環(huán)境
ContextinitContext=newInitialContext();
//查找數(shù)據(jù)源
ContextenvContext=(Context)initContext.lookup("java:/comp/env");
DataSourceds=(DataSource)envContext.lookup("jdbc/TestDB");
//從連接池中獲取連接
con=ds.getConnection();
//創(chuàng)建語句對(duì)象
stmt=con.createStatement();
//執(zhí)行select語句,返回結(jié)果集對(duì)象
rs=stmt.executeQuery(sql);
//對(duì)結(jié)果集進(jìn)行遍歷
while(rs.next())
{
//獲取結(jié)果集中的信息
StringtmpUserid=rs.getString(1);
StringtmpUsername=rs.getString(2);
//進(jìn)行編碼轉(zhuǎn)換
tmpUsername=newString(tmpUsername.getBytes("8859_1"));
StringtmpUserpass=rs.getString(3);
StringtmpType=rs.getString(4);
java.util.DatetmpBirthday=rs.getDate(5);
StringtmpDegree=rs.getString(6);
tmpDegree=newString(tmpDegree.getBytes("8859_1"));StringtmpLocal=rs.getString(7);
tmpLocal=newString(tmpLocal.getBytes("8859_1"));
StringtmpEmail=rs.getString(8);
StringtmpAddress=rs.getString(9);
//進(jìn)行編碼轉(zhuǎn)換
tmpAddress=newString(tmpAddress.getBytes("8859_1"));
StringtmpComment=rs.getString(10);
//創(chuàng)建用戶對(duì)象
UserBeanuser=newUserBean();
//根據(jù)獲取的用戶信息初始化用戶對(duì)象
user.setUserid(tmpUserid);
user.setUsername(tmpUsername);
user.setUserpass(tmpUserpass);
user.setType(tmpType);
user.setBirthday(tmpBirthday);
user.setDegree(tmpDegree);
user.setLocal(tmpLocal);
user.setEmail(tmpEmail);
user.setAddress(tmpAddress);
user.setComment(tmpComment);
//把對(duì)象添加到集合中
userlist.add(user);
}
}catch(Exceptione)
{
System.out.println(e.toString());
}
finally
{
//關(guān)閉對(duì)象的順序:rsstmtcon
//與創(chuàng)建對(duì)象的順序相反
try{rs.close();}catch(Exceptione){}
try{stmt.close();}catch(Exceptione){}
try{con.close();}catch(Exceptione){}
}
//返回查詢到的所有對(duì)象
returnuserlist;
}
需要在這個(gè)文件中導(dǎo)入多個(gè)包,語句如下:
importjava.sql.*;
importjavax.sql.*;
importjavax.naming.*;
7.4編寫userlist.jsp
7.4.1實(shí)現(xiàn)代碼
實(shí)現(xiàn)代碼如下:
<%@pagecontentType="text/html;charset=gb2312"%>
<%@taglibprefix="c"uri="/jsp/jstl/core"prefix="c"%>
<h2align=center>所有用戶信息<h2>
<tablealign=center>
<tr>
<th>用戶編號(hào)</th>
<th>用戶名</th>
<th>用戶類型</th>
<th>生日</th>
<th>學(xué)歷</th>
<th>地區(qū)</th>
<th>Email</th>
<th>地址</th>
</tr>
<c:forEachitems="${userlist}"var="user">
<tr>
<td>${user.userid}</td>
<td>${user.username}</td>
<td>
<c:iftest="${user.type==0}">普通用戶</c:if>
<c:iftest="${user.type==1}">管理員</c:if>
</td>
<td>${user.birthday}</td>
<td>${user.degree}</td>
<td>${user.local}</td>
<td>${user.email}</td>
<td>${user.address}</td>
</tr>
</c:forEach>
</table>
<c:forEach>標(biāo)簽中的items屬性表示要遍歷的集合,可以使用表達(dá)式語言。var屬性定義一個(gè)變量,該變量表示集合中的一個(gè)元素,在循環(huán)中對(duì)該變量進(jìn)行處理,相當(dāng)于循環(huán)變量。它的功能與下面代碼中的i類似:
int[]a=newint[10];
for(inti=0;i<10;i++)
{
a[i]=i*i;
}7.4.2<c:forEach>標(biāo)簽
<c:forEach>標(biāo)簽的語法結(jié)構(gòu)如下:
<c:forEach
var="變量名"
[items="集合"]
[begin="起始位置"]
[end="結(jié)束位置"]
[step="步長(zhǎng)"]
[varStatus="狀態(tài)信息"]
>
循環(huán)體
</c:forEach>這個(gè)標(biāo)簽包括開始標(biāo)志、結(jié)束標(biāo)志和循環(huán)體。
var屬性表示要循環(huán)的集合中的一個(gè)元素,例如要遍歷1~10,var的值是i,第1次遍歷的時(shí)候i表示1,第2次遍歷的時(shí)候i表示2,依次類推。
items表示要循環(huán)遍歷的集合,通常是集合對(duì)象。
begin表示從集合的第幾個(gè)元素開始循環(huán),集合的第一個(gè)元素的序號(hào)是0。
end表示循環(huán)到集合中的第幾個(gè)元素。
step表示循環(huán)的步長(zhǎng),如果是1,就遍歷所有元素,如果是2,就間隔一個(gè)遍歷一個(gè)。
varStatus表示的變量保存了循環(huán)的狀態(tài)信息,如index、count、first和last等,分別表示當(dāng)前元素的索引、集合中元素的個(gè)數(shù)、是否是第一個(gè)元素和是否是最后一個(gè)元素。
該標(biāo)簽可以對(duì)集合進(jìn)行遍歷,也可以使用規(guī)律的數(shù)字控制循環(huán)。
例如,要用循環(huán)把1、3、5、7、9分別輸出到5行上,可以使用下面的代碼:
<c:forEach
var="i"
begin="1"
end="9"
step="2"
>
${i}<br>
</c:forEach>其中,var指出的i表示循環(huán)變量,從1開始,到9結(jié)束,循環(huán)的步長(zhǎng)是2。使用表達(dá)式語言輸出當(dāng)前元素,i表示當(dāng)前元素。
如果循環(huán)遍歷的是集合對(duì)象,則需要使用items屬性指出循環(huán)的集合對(duì)象。集合對(duì)象可以是數(shù)組、java.util.Collection、java.util.Map、java.util.Iterator、java.util.Enumeration對(duì)象,也可以是使用逗號(hào)分隔的特殊字符串。
在前面設(shè)計(jì)功能的時(shí)候,把所有用戶信息存儲(chǔ)在request中,名字是userlist,用戶信息本身是ArrayList對(duì)象,是一個(gè)集合,可以使用<c:forEach>標(biāo)簽進(jìn)行遍歷:
<c:forEachitems="${userlist}"var="user">
循環(huán)體
</c:forEach>
在這個(gè)循環(huán)中,items指出的是循環(huán)的集合userlist,var表示循環(huán)時(shí)候集合中的一個(gè)元素,此處表示某個(gè)具體的用戶。循環(huán)體可以對(duì)這個(gè)元素進(jìn)行操作,例如輸出這個(gè)元素的各種屬性。
7.4.3使用標(biāo)準(zhǔn)標(biāo)簽庫(kù)中的SQL標(biāo)簽
1.設(shè)置數(shù)據(jù)源
在使用JDBC連接數(shù)據(jù)庫(kù)的時(shí)候,需要先得到數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序以及數(shù)據(jù)庫(kù)的相關(guān)信息。在使用SQL標(biāo)記庫(kù)的時(shí)候同樣需要這些信息,這些信息通過標(biāo)記庫(kù)中的<sql:setDataSoruce>標(biāo)記完成。該標(biāo)記可以完成數(shù)據(jù)源的設(shè)定,設(shè)定之后其他的標(biāo)記就可以使用這個(gè)數(shù)據(jù)源了。
<sql:setDataSource>標(biāo)記的語法格式有兩種:
格式一:
<sql:setDataSourceurl="數(shù)據(jù)源描述信息"
driver="驅(qū)動(dòng)程序名字"
user="用戶名"
password="口令"
var="創(chuàng)建的數(shù)據(jù)源的名字"
scope="{page|request|session|application}"
/>
格式二:
<sql:setDataSourcedataSource="數(shù)據(jù)源的名字"
var="創(chuàng)建的數(shù)據(jù)源的名字"
scope="{page|request|session|application}"
/>如果在服務(wù)器上配置了數(shù)據(jù)源(連接池),在server.xml中進(jìn)行配置時(shí)可以使用格式二。如果沒有配置數(shù)據(jù)源,可以使用格式一。
其中,dataSource屬性指出已經(jīng)配置的數(shù)據(jù)源的名字,url屬性指出數(shù)據(jù)庫(kù)的位置信息,driver屬性指出JDBC驅(qū)動(dòng)程序的名字,user指出連接數(shù)據(jù)庫(kù)使用的用戶名,password指出該用戶名對(duì)應(yīng)的口令,scope屬性指出設(shè)定的數(shù)據(jù)源的作用范圍。這些信息的含義與我們?cè)谑褂肑DBC連接數(shù)據(jù)庫(kù)時(shí)所使用的信息的含義是相同的。這些信息保存在var所指定的變量中。
要連接前面創(chuàng)建的數(shù)據(jù)庫(kù),可以使用下面的代碼:
<sql:setDataSourceurl="jdbc:mysql://localhost:3306/bookstore"
driver="com.mysql.jdbc.Driver"
user="root"
password="root"
var="ds"
/>
2.執(zhí)行查詢
要執(zhí)行查詢語句可以使用<sql:query>標(biāo)簽,該標(biāo)簽的語法格式如下:
<sql:querysql="要執(zhí)行的SQL語句"
var="查詢的結(jié)果集"
[scope="page|request|session|application"]
[dataSource="所使用的數(shù)據(jù)源"]
[maxRows="最大記錄數(shù)"]
[startRow="開始記錄"]
/>
其中,sql屬性指出要執(zhí)行的SQL語句,dataSource屬性指出要使用的數(shù)據(jù)源,這個(gè)數(shù)據(jù)源是前面通過<sql:setDataSource>標(biāo)記創(chuàng)建的,var指定的變量用于保存查詢的結(jié)果,scope屬性指出查詢的結(jié)果保存在什么地方,maxRows屬性和startRow屬性限定查詢結(jié)果,即查詢多少條記錄,從哪條記錄開始。
要查詢所有用戶信息,可以使用下面的代碼:
<sql:querysql="selectuserid,username,type,birthday,degree,localfromusertable"
var="userlist"
dataSource="${ds}"
/>
使用連接池技術(shù),代碼如下:
<sql:queryvar="userlist"dataSource="jdbc/TestDB">
select*fromusertable
</sql:query>
3.顯示查詢結(jié)果
經(jīng)<sql:query>標(biāo)簽查詢之后,查詢的結(jié)果存儲(chǔ)在var指定的變量中,這個(gè)結(jié)果對(duì)象是javax.servlet.jsp.jstl.sql.Result的對(duì)象。Result類提供了多個(gè)訪問結(jié)果集中數(shù)據(jù)的方法:
(1)
getRows:得到一個(gè)SortedMap對(duì)象數(shù)組,每個(gè)元素是一個(gè)SortedMap對(duì)象,表示一個(gè)記錄,鍵是列名,值是該列對(duì)應(yīng)的值,訪問的時(shí)候按照列名訪問。
(2)?getRowsByIndex:得到一個(gè)對(duì)象數(shù)組,每個(gè)數(shù)組元素又是一個(gè)對(duì)象數(shù)組,表示一個(gè)記錄,數(shù)組中的每個(gè)元素是記錄的對(duì)應(yīng)列的值,訪問的時(shí)候按照索引訪問。
(3)?getColumnNames:得到列名數(shù)組。
(4)?getRowCount:得到記錄數(shù)。
(5)?isLimitedByMaxRows:判斷結(jié)果集是否受最大行數(shù)的限制。
要訪問上面得到的結(jié)果集,可以使用下面的代碼:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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)業(yè)推廣策略》課件
- 中醫(yī)基礎(chǔ)理論習(xí)題及答案
- 【教育】浙江省高校教師高等教育法規(guī)基礎(chǔ)試題及答案
- 第一周幼兒園營(yíng)養(yǎng)食譜
- 施工單位技術(shù)負(fù)責(zé)人述職報(bào)告
- 高考新課標(biāo)語文模擬試卷系列之65
- 《特拉華州公司法》課件
- 交通運(yùn)輸行業(yè)安全意識(shí)培訓(xùn)總結(jié)
- 互聯(lián)網(wǎng)行業(yè)客服工作總結(jié)
- 物流行業(yè)安全工作總結(jié)
- 2024年中國(guó)陶瓷碗盆市場(chǎng)調(diào)查研究報(bào)告
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之22:“8運(yùn)行-8.1運(yùn)行策劃和控制”(雷澤佳編制-2025B0)
- 2024-2030年中國(guó)硅肥行業(yè)規(guī)模分析及投資前景研究報(bào)告
- 電網(wǎng)行業(yè)工作匯報(bào)模板22
- 2024年度跨境電商平臺(tái)承包經(jīng)營(yíng)合同3篇
- 2025年上半年人民日?qǐng)?bào)社招聘應(yīng)屆高校畢業(yè)生85人筆試重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解
- 2024-2025學(xué)年一年級(jí)數(shù)學(xué)上冊(cè)期末樂考非紙筆測(cè)試題(二 )(蘇教版2024秋)
- 2024秋期國(guó)家開放大學(xué)??啤陡叩葦?shù)學(xué)基礎(chǔ)》一平臺(tái)在線形考(形考任務(wù)一至四)試題及答案
- HSE應(yīng)急預(yù)案(完整版)
- 《小學(xué)五年級(jí)期末家長(zhǎng)會(huì)》課件模板(五套)
- 2024-2024年江蘇省普通高中學(xué)業(yè)水平測(cè)試物理試卷(含答案)
評(píng)論
0/150
提交評(píng)論