內(nèi)工大web程序設(shè)計(jì)第6章 JSP中使用數(shù)據(jù)庫(kù)(第2版)_第1頁(yè)
內(nèi)工大web程序設(shè)計(jì)第6章 JSP中使用數(shù)據(jù)庫(kù)(第2版)_第2頁(yè)
內(nèi)工大web程序設(shè)計(jì)第6章 JSP中使用數(shù)據(jù)庫(kù)(第2版)_第3頁(yè)
內(nèi)工大web程序設(shè)計(jì)第6章 JSP中使用數(shù)據(jù)庫(kù)(第2版)_第4頁(yè)
內(nèi)工大web程序設(shè)計(jì)第6章 JSP中使用數(shù)據(jù)庫(kù)(第2版)_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第6章

JSP中使用數(shù)據(jù)庫(kù)

2主要內(nèi)容

MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)

JDBC

連接MySQL數(shù)據(jù)庫(kù)查詢(xún)/更新/刪除記錄用結(jié)果集更新數(shù)據(jù)庫(kù)預(yù)處理事務(wù)常見(jiàn)數(shù)據(jù)庫(kù)連接難點(diǎn)用結(jié)果集更新數(shù)據(jù)庫(kù)預(yù)處理事務(wù)第6章導(dǎo)讀3

本章講解如何在JSP中使用JDBC提供的API和數(shù)據(jù)庫(kù)進(jìn)行交互信息。4§6.1.MySQL數(shù)據(jù)庫(kù)管理系統(tǒng)MySQL數(shù)據(jù)庫(kù)管理系統(tǒng),簡(jiǎn)稱(chēng)MySQL,是世界上最流行的開(kāi)源數(shù)據(jù)庫(kù)管理系統(tǒng),其社區(qū)版(MySQLCommunityEdition)是世界上最流行的免費(fèi)下載的開(kāi)源數(shù)據(jù)庫(kù)管理系統(tǒng)。56.1.1下載、安裝與啟動(dòng)MySQL下載

登錄選擇導(dǎo)航條上的products,在出現(xiàn)的頁(yè)面的左側(cè)選擇“MySQLCommunityEdition”或在出現(xiàn)的頁(yè)面的右側(cè)選擇“下載MySQL社區(qū)版”。6

安裝

將下載的mysql-5.6.16-win32.zip解壓縮到本地計(jì)算機(jī)即可,比如解壓縮到D:\。本教材將下載的mysql-5.6.16-win32.zip解壓縮到D:\,形成的安裝目錄結(jié)構(gòu)如圖6.3。7

啟動(dòng)為了啟動(dòng)MySQL數(shù)據(jù)庫(kù)服務(wù)器,需要執(zhí)行MySQL安裝目錄的bin子目錄中的mysqld.exe文件。需要打開(kāi)MS-DOS命令行窗口,并使用MS-DOS命令進(jìn)入到bin目錄中,例如:

cdD:\mysql-5.6.16-win32\bin然后在命令行鍵入:mysqld

或mysqld-nt啟動(dòng)MySQL數(shù)據(jù)庫(kù)服務(wù)器。86.1.2建立數(shù)據(jù)庫(kù)1.使用MySQL管理工具啟動(dòng)MySQL數(shù)據(jù)庫(kù)服務(wù)器后,就可以建立數(shù)據(jù)庫(kù),并在數(shù)據(jù)庫(kù)中創(chuàng)建表。本教材使用的是Navicat

MySQL管理工具,讀者可以登錄http:///download下載試用版或購(gòu)買(mǎi)商業(yè)版。下載navicat9_mysql_cs.exe后,安裝即可。91)建立連接

啟動(dòng)navicatforMySQL出現(xiàn)如圖6.5所示界面,單擊圖6.5所示界面上的連接,出現(xiàn)如圖6.6所示意的界面。在圖6.6所示的界面輸入如下信息:1.主機(jī)名2.端口:3.用戶(hù)名與密碼:102)建立數(shù)據(jù)庫(kù)113)創(chuàng)建表啟動(dòng)navicatforMySQL管理器,用鼠標(biāo)單擊曾建立的gengxiangyi連接打開(kāi)該連接。創(chuàng)建表的步驟如下:①打開(kāi)數(shù)據(jù)庫(kù)②建立表③管理表122.使用MySQL監(jiān)視器MySQL提供的監(jiān)視器(MySQLmonitor),允許用戶(hù)使用命令行方式管理數(shù)據(jù)庫(kù)。為了啟動(dòng)MySQL監(jiān)視器,需要執(zhí)行MySQL安裝目錄的bin子目錄中的mysql.exe文件,執(zhí)行格式為:mysql-u用戶(hù)名密碼或mysql-hlocalhost-uroot-p然后按要求輸入密碼即可。需要再打開(kāi)一個(gè)MS-DOS命令行窗口,并使用MS-DOS命令進(jìn)入到bin目錄中,然后使用默認(rèn)的root用戶(hù)啟動(dòng)MySQL監(jiān)視器。命令如下:mysql–uroot成功啟動(dòng)MySQL監(jiān)視器后,MS-DOS窗口出現(xiàn)“mysql>”字樣效果,如圖6.10所示。如果想關(guān)閉MySQL監(jiān)視器,鍵入exit即可。131)建立數(shù)據(jù)庫(kù)在MS-DOS命令行窗口輸入SQL語(yǔ)句需要用“;”號(hào)結(jié)束,在編輯SQL語(yǔ)句的過(guò)程中可以使用\c終止當(dāng)前SQL語(yǔ)句的編輯。下面使用MySQLl監(jiān)視器創(chuàng)建一個(gè)名字為Book的數(shù)據(jù)庫(kù),在當(dāng)前MySQL監(jiān)視器占用的命令行窗口輸入創(chuàng)建數(shù)據(jù)庫(kù)的SQL語(yǔ)句(如圖6.11所示):createdatabaseBook;142)為數(shù)據(jù)庫(kù)建表CREATETABLEbookList(ISBNvarchar(100)notnull,namevarchar(100)CHARACTERSETgb2312,pricefloat,PRIMARYKEY(ISBN));◆進(jìn)入數(shù)據(jù)庫(kù)“user數(shù)據(jù)庫(kù)名;”或“user數(shù)據(jù)庫(kù)名”。例:useBook

圖6.12所示.◆在數(shù)據(jù)庫(kù)Book建立一個(gè)名字為bookForm表,該表的字段為ISBN(varchar)name(varchar)price(float)創(chuàng)建bookForm表的SQL語(yǔ)句,如圖6.13所示.152)為數(shù)據(jù)庫(kù)建表◆添加、更新和查詢(xún)操作。插入記錄的SQL語(yǔ)句:如圖6.14(a)所示。insertintobookListvalues('7-302-01465-5','高等數(shù)學(xué)',28.67);insertintobooklistvalues('7-352-01465-8','大學(xué)英語(yǔ)',58.5);◆查詢(xún)記錄的SQL語(yǔ)句select*frombookList;如圖6.14(b)所示。163)導(dǎo)入.sql文件中的SQL語(yǔ)句當(dāng)前MySQL監(jiān)視器占用的命令行窗口鍵入如下命令:

sourced:/1000/group.sql導(dǎo)入SQL語(yǔ)句??梢韵葘⑿枰腟QL語(yǔ)句保存在一個(gè)擴(kuò)展名是.sql的文本文件中,然后使用在MySQL監(jiān)視器占用的命令行窗口使用source命令導(dǎo)入.sql的文本文件中的SQL語(yǔ)句。group.sql文本文件的內(nèi)容:173)導(dǎo)入.sql文件中的SQL語(yǔ)句droptablecarList;createtablecarList(numberchar(60)CHARACTERSETgb2312notnull,namechar(50)CHARACTERSETgb2312,pricefloat,yeardate,PRIMARYKEY(number));insertintocarListvalues('加A89CQ8','奔馳','820000','2015-12-26');insertintocarListvalues('洲C12456','寶馬','620000','2015-10-10');select*fromcarList;184)刪除數(shù)據(jù)庫(kù)或表刪除數(shù)據(jù)庫(kù)的命令:dropdatabase<數(shù)據(jù)庫(kù)名>,例如:刪除名為tiger的數(shù)據(jù)庫(kù):

dropdatabasetiger;刪除表的命令:droptable<表名>,例如,使用book數(shù)據(jù)庫(kù)后,執(zhí)行

droptablebooklist;將刪除book數(shù)據(jù)庫(kù)中的bookList表19§6.2JDBC

JDBC(JavaDataBaseConnectivity)提供了訪問(wèn)數(shù)據(jù)庫(kù)的API,即由一些Java類(lèi)和接口組成,是Java運(yùn)行平臺(tái)的核心類(lèi)庫(kù)中的一部分。

我們經(jīng)常使用JDBC進(jìn)行如下的操作:與一個(gè)數(shù)據(jù)庫(kù)建立連接。向已連接的數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句。處理SQL語(yǔ)句返回的結(jié)果。20§6.3連接MySQL數(shù)據(jù)庫(kù)

應(yīng)用程序?yàn)榱四芎蛿?shù)據(jù)庫(kù)交互信息,必須首先和數(shù)據(jù)庫(kù)建立連接。目前在開(kāi)發(fā)中常用的連接數(shù)據(jù)庫(kù)的方式是加載JDBC-數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。用Java語(yǔ)言編寫(xiě)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序稱(chēng)作JDBC-數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。JDBC可以調(diào)用本地的JDBC-數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序和相應(yīng)的數(shù)據(jù)庫(kù)建立連接,如圖6.16所示。21§6.3連接MySQL數(shù)據(jù)庫(kù)

使用JDBC-數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序方式和數(shù)據(jù)庫(kù)建立連接需要經(jīng)過(guò)2個(gè)步驟加載JDBC-數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序和指定的數(shù)據(jù)庫(kù)建立連接226.3.1加載JDBC-數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序使用JDBC-數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí),必須要保證連接數(shù)據(jù)庫(kù)的應(yīng)用程序所駐留的計(jì)算機(jī)上安裝有相應(yīng)JDBC-數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。登錄MySQL的官方網(wǎng)站下載JDBC-數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序(JDBCDriverforMySQL)。應(yīng)用程序加載MySQL的JDBC-數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序代碼如下:

try{Class.forName("com.mysql.jdbc.Driver");}catch(Exceptione){}236.3.2建立連接_1Java.sql包中的DriverManager類(lèi)有兩個(gè)用于建立連接的類(lèi)方法:ConnectiongetConnection(java.lang.String,java.lang.String,java.lang.String)ConnectiongetConnection(java.lang.String)數(shù)據(jù)庫(kù)服務(wù)器占用的端口是3306,假設(shè)MySQL數(shù)據(jù)庫(kù)服務(wù)器所駐留的計(jì)算機(jī)的IP地址是。應(yīng)用程序要和warehouse建立連接,用戶(hù)的id和密碼分別是root、99。24

那么使用ConnectiongetConnection(java.lang.String,java.lang.String,java.lang.String)方法建立連接的代碼如下:try{Stringuri="jdbc:mysql://:3306/warehouse";Stringuser="root";Stringpassword="99";con=DriverManager.getConnection(uri,user,password);}catch(SQLExceptione){System.out.println(e);}6.3.2建立連接_1256.3.2建立連接_2◆使用ConnectiongetConnection(java.lang.String)

方法建立連接的代碼如下:try{Stringuri="jdbc:mysql://:3306/warehouse?user=root&password=99";con=DriverManager.getConnection(uri);}catch(SQLExceptione){

System.out.println(e);}交互信息,比如查詢(xún)、修改、更新表中的記錄。266.3.2建立連接_2在某些Web程序中需要避免操作數(shù)據(jù)庫(kù)出現(xiàn)中文亂碼,那么需要使用ConnectiongetConnection(java.lang.String)方法建立連接,連接中的代碼是(假設(shè)用戶(hù)是root,其密碼是99):Stringuri="jdbc:mysql:///warehouse?"+"user=root&password=99&characterEncoding=gb2312";con=DriverManager.getConnection(uri);

應(yīng)用程序一旦和某個(gè)數(shù)據(jù)庫(kù)建立連接,就可以通過(guò)SQL語(yǔ)句和該數(shù)據(jù)庫(kù)中的表交互信息,比如查詢(xún)、修改、更新表中的記錄。276.3.3MySQL亂碼解決方案

用JSP頁(yè)面訪問(wèn)MySQL數(shù)據(jù)庫(kù)時(shí)(更新和插入記錄)可能出現(xiàn)“中文亂碼”問(wèn)題。1.?dāng)?shù)據(jù)庫(kù)和表使用支持中文的字符編碼

如果使用MySQL監(jiān)視器創(chuàng)建數(shù)據(jù)庫(kù),可以在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定數(shù)據(jù)庫(kù)使用的字符編碼:

create數(shù)據(jù)庫(kù)名CHARACTERSET字符編碼例如,創(chuàng)建名字是people的數(shù)據(jù)庫(kù)

createpeopleCHARACTERSETgb2312281.?dāng)?shù)據(jù)庫(kù)和表使用支持中文的字符編碼創(chuàng)建表時(shí),可以指定某個(gè)字段使用的字符編碼(否則是默認(rèn)的字符編碼,不支持中文):

字段名類(lèi)型CHARACTERSET字符編碼例如,建立名字是myList的表,并讓其中的name字段使用gb2312編碼:createtablemyList(id`intNOTNULLauto_increment,namevarchar(100)CHARACTERSETgb2312,PRIMARYKEY(id));292.連接數(shù)據(jù)庫(kù)支持中文編碼JSP中連接MySQL數(shù)據(jù)庫(kù)時(shí),需要使用

ConnectiongetConnection(java.lang.String)方法建立連接,向方法參數(shù)傳遞的字符串的基本格式為:"jdbc:mysql://地址/數(shù)據(jù)庫(kù)?user=用戶(hù)&password=密碼&characterEncoding=gb2312";

例如,假設(shè)數(shù)據(jù)名是book,用戶(hù)是root,密碼為99。那么連接方式是:Connectioncon;Stringuri="jdbc:mysql:///book?user=root&password=99&characterEncoding=gb2312";con=DriverManager.getConnection(uri);30例子1

例子1是一個(gè)簡(jiǎn)單的JSP頁(yè)面,該頁(yè)面中的Java程序片代碼負(fù)責(zé)加載JDBC-驅(qū)動(dòng)程序,并連接到數(shù)據(jù)庫(kù)warehouse,查詢(xún)product表中price字段值大于3000的全部記錄(見(jiàn)6.1節(jié)曾建立的warehouse數(shù)據(jù)庫(kù)),頁(yè)面運(yùn)行效果如圖6.17。31§6.4查詢(xún)記錄

JDBC和數(shù)據(jù)庫(kù)表進(jìn)行交互的主要方式是使用SQL語(yǔ)句(其他方式見(jiàn)6.8節(jié)),JDBC提供的API可以將標(biāo)準(zhǔn)的SQL語(yǔ)句發(fā)送給數(shù)據(jù)庫(kù),實(shí)現(xiàn)和數(shù)據(jù)庫(kù)的交互。對(duì)一個(gè)數(shù)據(jù)庫(kù)中表進(jìn)行查詢(xún)操作的具體步驟如下:1.向數(shù)據(jù)庫(kù)發(fā)送SQL查詢(xún)語(yǔ)句

Statement聲明一個(gè)SQL語(yǔ)句對(duì)象,然后讓已創(chuàng)建的連接對(duì)象con調(diào)用方法createStatement()創(chuàng)建這個(gè)SQL語(yǔ)句對(duì)象。try{Statementsql=con.createStatement();}catch(SQLExceptione){System.out.println(e);

}32§6.4查詢(xún)記錄2.處理查詢(xún)結(jié)果

有了SQL語(yǔ)句對(duì)象后,這個(gè)對(duì)象就可以調(diào)用相應(yīng)的方法查詢(xún)數(shù)據(jù)庫(kù)中表,并將查詢(xún)結(jié)果存放在一個(gè)ResultSet對(duì)象中。ResultSetrs=sql.executeQuery("SELECT*FROMproduct");ResultSetrs=sql.executeQuery("SELECTname,priceFROMproduct");33表6.1ResultSet類(lèi)的若干方法346.4.1順序查詢(xún)

如何知道一個(gè)表中有哪些字段?1.與數(shù)據(jù)庫(kù)建立的連接對(duì)象con調(diào)方法getMetaData返回一個(gè)DatabaseMetaData對(duì)象.

DatabaseMetaDatametadata=con.getMetaData();2.Metadata對(duì)象再調(diào)用getColumns()方法可以將表的字段信息以行列的形式存儲(chǔ)在一個(gè)ResultSet對(duì)象中。ResultSettableMessage=metadata.getColumns(null,null,"product",null);表的字段信息以行列的形式存儲(chǔ)在tableMessage對(duì)象中.如果product表有n個(gè)字段,tableMessage就剛好有n行、每行4列。每行分別含有和相應(yīng)字段有關(guān)的信息,信息的次序?yàn)椋骸皵?shù)據(jù)庫(kù)名”、“數(shù)據(jù)庫(kù)擴(kuò)展名”、“表名”,“字段名”。356.4.1順序查詢(xún)

3.

tableMessage對(duì)象調(diào)用next方法使游標(biāo)向下移動(dòng)一行,然后tableMessage調(diào)用getXXX方法可以查看該行中列的信息,其中最重要的信息是第4列,該列上的信息為字段的名字。36例子2example6_2.jsp提交數(shù)據(jù)源和表名inquire.jsp調(diào)用tag查詢(xún)數(shù)據(jù)庫(kù)QueryTag.tag

查詢(xún)數(shù)據(jù)庫(kù)并返回結(jié)果

376.4.2隨機(jī)查詢(xún)

為了在結(jié)果集中可以前后移動(dòng),隨機(jī)顯示若干記錄,必須要返回一個(gè)可滾動(dòng)的結(jié)果集。

Statementstmt=con.createStatement(inttype,intconcurrency);ResultSetre=stmt.executeQuery(SQL語(yǔ)句);

inttype,intconcurrency取值情況及ResultSet常用方法如下:type的取值決定滾動(dòng)方式,取值可以是:◆ResultSet.TYPE_FORWORD_ONLY:結(jié)果集的游標(biāo)只能向下滾動(dòng)。386.4.2隨機(jī)查詢(xún)◆ResultSet.TYPE_SCROLL_INSENSITIVE:結(jié)果集的游標(biāo)可以上下移動(dòng),當(dāng)數(shù)據(jù)庫(kù)變化時(shí),當(dāng)前結(jié)果集不變。Concurrency取值決定是否可以用結(jié)果集更新數(shù)據(jù)庫(kù),Concurrency取值:◆ResultSet.CONCUR_READ_ONLY不能用結(jié)果集更新數(shù)據(jù)庫(kù)中的表。◆ResultSet.CONCUR_UPDATABLE能用結(jié)果集更新數(shù)據(jù)庫(kù)中的表。39例子3406.4.3條件查詢(xún)

在JSP頁(yè)面中輸入查詢(xún)條件,Tag文件可以根據(jù)JSP提交的條件進(jìn)行查詢(xún)。例子4416.4.4排序查詢(xún)

可以在SQL語(yǔ)句中使用ORDERBY子語(yǔ)句,對(duì)記錄排序。在JSP頁(yè)面中輸入排序方式,Tag文件可以根據(jù)JSP提交的數(shù)據(jù)進(jìn)行排序查詢(xún)。

例如,按price排序查詢(xún)的SQL語(yǔ)句:

SELECT*FROMproductORDERBYprice。42例子5436.4.5模糊查詢(xún)

可以用SQL語(yǔ)句操作符LIKE進(jìn)行模式般配,使用“%”表示零個(gè)或多個(gè)字符,用一個(gè)下劃線“_”表示任意一個(gè)字符。比如,下述語(yǔ)句查詢(xún)產(chǎn)品名稱(chēng)中含有“戴”的記錄:rs=sql.executeQuery(“SELECT*FROMproductWHEREnameLIKE

‘%戴%'");44例子6為了避免出現(xiàn)中文亂碼(比較字段值中可能有中文),例子中數(shù)據(jù)庫(kù)的連接方式采用(見(jiàn)6.3.3):"jdbc:mysql://地址/數(shù)據(jù)庫(kù)?user=用戶(hù)&password=密碼&characterEncoding=gb2312";§6.5更新記錄45

可以使用SQL語(yǔ)句更新記錄中字段的值。

Statement對(duì)象調(diào)用方法:

publicintexecuteUpdate(StringsqlStatement);

通過(guò)參數(shù)sqlStatement指定的方式實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表中記錄的字段值更新。例如:executeUpdate("UPDATEproductSETprice=6866WHEREname='海爾電視機(jī)'");46

例子7(example6_7.jsp)更新數(shù)據(jù)庫(kù)warehouse中的product表。例子7根據(jù)number字段,更新product表中記錄的name、madeTime、price字段的值。為了避免出現(xiàn)中文亂碼,例子中數(shù)據(jù)庫(kù)的連接方式采用:"jdbc:mysql://地址/數(shù)據(jù)庫(kù)?user=用戶(hù)&password=密碼&characterEncoding=gb2312";

47§6.6添加記錄

可以使用SQL語(yǔ)句添加新的記錄。

Statement對(duì)象調(diào)用方法:

publicintexecuteUpdate(StringsqlStatement);

通過(guò)參數(shù)sqlStatement指定的方式實(shí)現(xiàn)向數(shù)據(jù)庫(kù)表中添加新的記錄。例如:executeUpdate("INSERTINTOstudentsVALUES('012','神通手機(jī)’,'2010-2-26',2687)");48例子8(example6_8.jsp)向數(shù)據(jù)庫(kù)warehouse中的product表添加新的記錄(見(jiàn)6.1.2創(chuàng)建的數(shù)據(jù)庫(kù))。example6_8.jsp頁(yè)面提交新的記錄到newDatabase.jsp頁(yè)面,該頁(yè)面調(diào)用Tag文件AddRecord.tag添加新記錄到product表。為了避免出現(xiàn)中文亂碼,例子中數(shù)據(jù)庫(kù)的連接方式采用(見(jiàn)6.3.3):"jdbc:mysql://地址/數(shù)據(jù)庫(kù)?user=用戶(hù)&password=密碼&characterEncoding=gb2312";49§6.7刪除記錄

可以使用SQL語(yǔ)句刪除記錄。

Statement對(duì)象調(diào)用方法:

publicintexecuteUpdate(StringsqlStatement);

刪除數(shù)據(jù)庫(kù)表中的記錄。例如:executeUpdate("DELETEFROMproductWHEREnumber='888'");50例子9(example6_9.jsp)刪除數(shù)據(jù)庫(kù)warehouse中的product表的某項(xiàng)記錄(見(jiàn)6.1.2創(chuàng)建的數(shù)據(jù)庫(kù))。example6_9.jsp頁(yè)面提交被刪除的記錄的number字段的值到delete.jsp頁(yè)面,delete.jsp頁(yè)面調(diào)用Tag文件DelRecord.tag刪除相應(yīng)的記錄。51§6.8用結(jié)果集操作數(shù)據(jù)庫(kù)中的表

盡管可以用SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)中表進(jìn)行更新、插入操作,但也可以使用內(nèi)存中ResultSet對(duì)象對(duì)底層數(shù)據(jù)庫(kù)表進(jìn)行更新和插入操作,優(yōu)點(diǎn)是不必熟悉有關(guān)更新、插入的SQL語(yǔ)句,而且方便編寫(xiě)代碼,缺點(diǎn)是,必須要事先返回結(jié)果集。為了避免出現(xiàn)中文亂碼,數(shù)據(jù)庫(kù)的連接方式采用:

"jdbc:mysql://地址/數(shù)據(jù)庫(kù)?user=用戶(hù)&password=密碼&characterEncoding=gb2312“;52§6.8用結(jié)果集操作數(shù)據(jù)庫(kù)中的表首先,必須得到一個(gè)可滾動(dòng)的ResultSet對(duì)象,例如:Stringuri="jdbc:mysql:///warehouse?"+"user=root&password=&characterEncoding=gb2312";con=DriverManager.getConnection(uri);Statementsql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSetrs=sql.executeQuery("SELECT*FROMproduct");536.8.1更新記錄中的列值

使用結(jié)果集更新數(shù)據(jù)庫(kù)表中第n行記錄中某列的值的步驟是:1.結(jié)果集rs的游標(biāo)移動(dòng)到第n行讓結(jié)果集調(diào)用absolute()方法將游標(biāo)移到第n行:rs.absolute(n);2.結(jié)果集將第n行的p列的列值更新

結(jié)果集可以使用下列方法更新列值(部分):updateInt(StringcolumnName,intx),updateInt(intcolumnIndexintx)updateLong(StringcolumnName,longx),updateLong(intcolumnIndex,longx)546.8.1更新記錄中的列值3.更新數(shù)據(jù)庫(kù)中的表最后,結(jié)果集調(diào)用updateRow()方法,用結(jié)果集中的第n行更新數(shù)據(jù)庫(kù)表中的第n行記錄。以下代碼片段更新product表中的第3行記錄的name列(字段)的值。

rs.absolute(3);

rs.updateString(2,"IBMPC");//也可以寫(xiě)成rs.updateString("name","IBMPC");

s.updateRow();556.8.2插入記錄使用結(jié)果集向數(shù)據(jù)庫(kù)表中插入一行記錄步驟是:1.結(jié)果集rs的游標(biāo)移動(dòng)到插入行結(jié)果集中有一個(gè)特殊區(qū)域,用作構(gòu)建要插入的行的暫存區(qū)域(stagingarea),習(xí)慣上將該區(qū)域位置稱(chēng)做結(jié)果集的插入行。為了向數(shù)據(jù)庫(kù)表中插入一行新的記錄,必須首先將結(jié)果集的游標(biāo)移動(dòng)到插入行,代碼如下:

rs.moveToInsertRow();566.8.2插入記錄2.更新插入行的列值結(jié)果集可以用updateXXX()方法更新插入行的列值,例如:rs.updateString(1,"c002");rs.updateString(2,"IBMiPad");rs.updateDate(3,Date());rs.updateDouble(4,5356);3.插入記錄最后,結(jié)果集調(diào)用insertRow()方法用結(jié)果集中的插入行向數(shù)據(jù)庫(kù)表中插入一行新記錄。57

例子10(

example6_10.jsp)向數(shù)據(jù)庫(kù)warehouse中的product表插入記錄(見(jiàn)6.1.2創(chuàng)建的數(shù)據(jù)庫(kù))。example6_10.jsp提交新的記錄到newRecord.jsp頁(yè)面,該頁(yè)面調(diào)用Tag文件InsertRecord.tag插入新記錄到product表。58§6.9預(yù)處理語(yǔ)句

Java提供了更高效率的數(shù)據(jù)庫(kù)操作機(jī)制,就是PreparedStatement對(duì)象,該對(duì)象被習(xí)慣地稱(chēng)作預(yù)處理語(yǔ)句對(duì)象。本節(jié)學(xué)習(xí)怎樣使用預(yù)處理語(yǔ)句對(duì)象操作數(shù)據(jù)庫(kù)中的表。596.9.1預(yù)處理語(yǔ)句優(yōu)點(diǎn)

當(dāng)向數(shù)據(jù)庫(kù)發(fā)送一個(gè)SQL語(yǔ)句,如“Select*Fromproduct”,數(shù)據(jù)庫(kù)庫(kù)中的SQL解釋器負(fù)責(zé)將把SQL語(yǔ)句生成底層的內(nèi)部命令,然后執(zhí)行該命令,完成有關(guān)的數(shù)據(jù)操作。如果不斷地向數(shù)據(jù)庫(kù)提交SQL語(yǔ)句勢(shì)必增加數(shù)據(jù)庫(kù)中SQL解釋器的負(fù)擔(dān),影響執(zhí)行的速度。如果應(yīng)用程序能針對(duì)連接的數(shù)據(jù)庫(kù),事先就將SQL語(yǔ)句解釋為數(shù)據(jù)庫(kù)底層的內(nèi)部命令,然后直接讓數(shù)據(jù)庫(kù)去執(zhí)行這個(gè)命令,顯然不僅減輕了數(shù)據(jù)庫(kù)的負(fù)擔(dān),而且也提高了訪問(wèn)數(shù)據(jù)庫(kù)的速度。60Connection連接對(duì)象con調(diào)用prepareStatement(Stringsql)方法:PreparedStatementpre=con.prepareStatement(Stringsql);對(duì)參數(shù)sql指定的SQL語(yǔ)句進(jìn)行預(yù)編譯處理,生成該數(shù)據(jù)庫(kù)底層的內(nèi)部命令,并將該命令封裝在PreparedStatement對(duì)象pre中,那么該對(duì)象調(diào)用下列方法都可以使得該底層內(nèi)部命令被數(shù)據(jù)庫(kù)執(zhí)行:ResultSetexecuteQuery()booleanexecute()intexecuteUpdate()

只要編譯好了PreparedStatement對(duì)象pre,那么pre可以隨時(shí)地執(zhí)行上述方法,顯然提高了訪問(wèn)數(shù)據(jù)庫(kù)的速度。61例子11

例子11使用預(yù)處理語(yǔ)句來(lái)查詢(xún)warehouse數(shù)據(jù)庫(kù)中product表的全部記錄。626.9.2使用統(tǒng)配符

在對(duì)SQL進(jìn)行預(yù)處理時(shí)可以使用統(tǒng)配符“?”來(lái)代替字段的值,只要在預(yù)處理語(yǔ)句執(zhí)行之前再設(shè)置統(tǒng)配符所表示的具體值即可。例如:prepareStatementpre=con.prepareStatement("SELECT*FROMproductWHEREprice<?");那么在sql對(duì)象執(zhí)行之前,必須調(diào)用相應(yīng)的方法設(shè)置統(tǒng)配符“?”代表的具體值。比如:pre.setDouble(1,6565);指定上述預(yù)處理語(yǔ)句pre中統(tǒng)配符“?”代表的值是6565。63通配符按著它們?cè)陬A(yù)處理的“SQL語(yǔ)句”中從左至右依次出現(xiàn)的順序分別被稱(chēng)做第1個(gè)、第2個(gè)…第m個(gè)統(tǒng)配符。如方法voidsetDouble(intparameterIndex,intx);用來(lái)設(shè)置通配符的值,其中參數(shù)parameterIndex用來(lái)表示SQL語(yǔ)句中從左到右的第parameterIndex個(gè)統(tǒng)配符號(hào),x是該統(tǒng)配符所代表的具體值。64盡管pre=con.prepareStatement("SELECT*FROMproductWHEREprice<?");pre.setDouble(1,6565);的功能等同于pre=con.prepareStatement("SELECT*FROMmessageWHEREprice<6565");但是,使用統(tǒng)配符可以使得應(yīng)用程序更容易動(dòng)態(tài)地改變SQL語(yǔ)句中關(guān)于字段值的條件。預(yù)處理語(yǔ)句設(shè)置統(tǒng)配符“?”的值的常用方法有:voidsetDate(intparameterIndex,Datex)等。65例子12

例子12中,example6_12.jsp提交新的記錄到insertRecord.jsp頁(yè)面,該頁(yè)面調(diào)用Tag文件PrepareInsert.tag添加新記錄到product表(有關(guān)product表見(jiàn)6.1.2節(jié))。另外例子12中還用到了例子11中的PrepareTag.tag文件,該文件負(fù)責(zé)查詢(xún)product表中的記錄。66§6.10事務(wù)

事務(wù)由一組SQL語(yǔ)句組成,所謂“事務(wù)處理”是指:應(yīng)用程序保證事務(wù)中的SQL語(yǔ)句要么全部都執(zhí)行,要么一個(gè)都不執(zhí)行。事務(wù)是保證數(shù)據(jù)庫(kù)中數(shù)據(jù)完整性與一致性的重要機(jī)制。JDBC事務(wù)處理步驟如下:1setAutoCommit(booleanautoCommit)方法

為了能進(jìn)行事務(wù)處理,必須關(guān)閉連接對(duì)象

con的默認(rèn)設(shè)置。

con.setAutoCommit(false);67§6.10事務(wù)

2.commit()方法

連接對(duì)象con調(diào)用commit()方法就是讓事務(wù)中的SQL語(yǔ)句全部生效。

mit();3.rollback()方法

連接對(duì)象con調(diào)用rollback()方法,撤消事務(wù)中成功執(zhí)行過(guò)的SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)所做的更新、插入或刪除操作,即撤消引起數(shù)據(jù)發(fā)生變化的SQL語(yǔ)句操作,將數(shù)據(jù)庫(kù)中的數(shù)據(jù)恢復(fù)到commi()方法執(zhí)行之前的狀態(tài)。

con.rollback();68例子1369§6.11常見(jiàn)數(shù)據(jù)庫(kù)連接6.11.1連接MicrosoftSQLServer數(shù)據(jù)庫(kù)登錄/zh-cn/download/default.aspx(微軟的下載中心),然后在熱門(mén)下載里選擇選項(xiàng):服務(wù)器,然后選擇下在MicrosoftSQLServer2012Express以及相應(yīng)的管理工具:MicrosoftSQLServer2008ManagementStudioExpress或MicrosoftSQLServerManagementStudioExpress。1.MicrosoftSQLServer2012702.建立數(shù)據(jù)庫(kù)

打開(kāi)SSMS提供的“對(duì)象資源管理器”,將出現(xiàn)相應(yīng)的操作界面,如圖6.29所示界面。

圖6.29所示的界面上的“數(shù)據(jù)庫(kù)”目錄下是已有的數(shù)據(jù)庫(kù)的名稱(chēng),在“數(shù)據(jù)庫(kù)”目錄上單擊鼠標(biāo)右鍵可以建立新的數(shù)據(jù)庫(kù),比如建立名稱(chēng)是warehouse的數(shù)據(jù)庫(kù)。創(chuàng)建好數(shù)據(jù)庫(kù)后,就可以在該中建立若干個(gè)表。如果準(zhǔn)備在warehouse數(shù)據(jù)庫(kù)中創(chuàng)建名字為product的表,那么可以用鼠標(biāo)單擊“數(shù)據(jù)庫(kù)”下的warehouse數(shù)據(jù)庫(kù),在warehouse管理的“表”的選項(xiàng)上單擊右鍵,選擇“新建表”,將出現(xiàn)相應(yīng)的建表界面。713.加載針對(duì)SQLServer的JDBC數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序

登錄下載MicrosoftJDBCDriver4.0forSQLServer即下載sqljdbc_1.1.1501.101_enu.exe。應(yīng)用程序加載SQLServer驅(qū)動(dòng)程序代碼如下:try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");}catch(Exceptione){}724.建立連接建立連接的代碼如下:try{Stringuri="jdbc:sqlserver://:1433;DatabaseName=warehouse";Stringuser="sa";Stringpassword="dog123456“;con=DriverManager.getConnection(uri,user,password);}catch(SQLExceptione){System.out.println(e);}736.11.2連接Oracle數(shù)據(jù)庫(kù)1.加載驅(qū)動(dòng)程序

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();2.建立連接Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@主機(jī):端口號(hào):數(shù)據(jù)庫(kù)名","用戶(hù)名","密碼");例如:Stringuser="scott";Stringpassword="tiger";con=DriverManager.getConnection(“jdbc:o

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論