《Java Web程序設(shè)計(jì)基礎(chǔ)教程》課件第7章_第1頁(yè)
《Java Web程序設(shè)計(jì)基礎(chǔ)教程》課件第7章_第2頁(yè)
《Java Web程序設(shè)計(jì)基礎(chǔ)教程》課件第7章_第3頁(yè)
《Java Web程序設(shè)計(jì)基礎(chǔ)教程》課件第7章_第4頁(yè)
《Java Web程序設(shè)計(jì)基礎(chǔ)教程》課件第7章_第5頁(yè)
已閱讀5頁(yè),還剩148頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論