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

下載本文檔

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

文檔簡介

第6章

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

2主要內(nèi)容

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

JDBC

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

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

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

安裝

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

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

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

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

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

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

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

sourced:/1000/group.sql導(dǎo)入SQL語句??梢韵葘⑿枰腟QL語句保存在一個擴(kuò)展名是.sql的文本文件中,然后使用在MySQL監(jiān)視器占用的命令行窗口使用source命令導(dǎo)入.sql的文本文件中的SQL語句。group.sql文本文件的內(nèi)容:173)導(dǎo)入.sql文件中的SQL語句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ù)庫或表刪除數(shù)據(jù)庫的命令:dropdatabase<數(shù)據(jù)庫名>,例如:刪除名為tiger的數(shù)據(jù)庫:

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

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

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

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

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

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

try{Class.forName("com.mysql.jdbc.Driver");}catch(Exceptione){}236.3.2建立連接_1Java.sql包中的DriverManager類有兩個用于建立連接的類方法:ConnectiongetConnection(java.lang.String,java.lang.String,java.lang.String)ConnectiongetConnection(java.lang.String)數(shù)據(jù)庫服務(wù)器占用的端口是3306,假設(shè)MySQL數(shù)據(jù)庫服務(wù)器所駐留的計算機(jī)的IP地址是。應(yīng)用程序要和warehouse建立連接,用戶的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);}交互信息,比如查詢、修改、更新表中的記錄。266.3.2建立連接_2在某些Web程序中需要避免操作數(shù)據(jù)庫出現(xiàn)中文亂碼,那么需要使用ConnectiongetConnection(java.lang.String)方法建立連接,連接中的代碼是(假設(shè)用戶是root,其密碼是99):Stringuri="jdbc:mysql:///warehouse?"+"user=root&password=99&characterEncoding=gb2312";con=DriverManager.getConnection(uri);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.

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

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

376.4.2隨機(jī)查詢

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

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

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

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

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

例如,按price排序查詢的SQL語句:

SELECT*FROMproductORDERBYprice。42例子5436.4.5模糊查詢

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

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

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

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

publicintexecuteUpdate(StringsqlStatement);

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

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

47§6.6添加記錄

可以使用SQL語句添加新的記錄。

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

publicintexecuteUpdate(StringsqlStatement);

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

可以使用SQL語句刪除記錄。

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

publicintexecuteUpdate(StringsqlStatement);

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

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

"jdbc:mysql://地址/數(shù)據(jù)庫?user=用戶&password=密碼&characterEncoding=gb2312“;52§6.8用結(jié)果集操作數(shù)據(jù)庫中的表首先,必須得到一個可滾動的ResultSet對象,例如: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ù)庫表中第n行記錄中某列的值的步驟是:1.結(jié)果集rs的游標(biāo)移動到第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ù)庫中的表最后,結(jié)果集調(diào)用updateRow()方法,用結(jié)果集中的第n行更新數(shù)據(jù)庫表中的第n行記錄。以下代碼片段更新product表中的第3行記錄的name列(字段)的值。

rs.absolute(3);

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

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

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ù)庫表中插入一行新記錄。57

例子10(

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

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

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

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

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

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

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

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

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

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

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

2.commit()方法

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

mit();3.rollback()方法

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

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

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

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

登錄下載MicrosoftJDBCDriver4.0forSQLServer即下載sqljdbc_1.1.1501.101_enu.exe。應(yīng)用程序加載SQLServer驅(qū)動程序代碼如下: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ù)庫1.加載驅(qū)動程序

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

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論