jsp程序設(shè)計(jì)入門-沈澤剛、秦玉平-主編的java-web-第二版-第07章-JDBC數(shù)據(jù)庫(kù)訪問(wèn)_第1頁(yè)
jsp程序設(shè)計(jì)入門-沈澤剛、秦玉平-主編的java-web-第二版-第07章-JDBC數(shù)據(jù)庫(kù)訪問(wèn)_第2頁(yè)
jsp程序設(shè)計(jì)入門-沈澤剛、秦玉平-主編的java-web-第二版-第07章-JDBC數(shù)據(jù)庫(kù)訪問(wèn)_第3頁(yè)
jsp程序設(shè)計(jì)入門-沈澤剛、秦玉平-主編的java-web-第二版-第07章-JDBC數(shù)據(jù)庫(kù)訪問(wèn)_第4頁(yè)
jsp程序設(shè)計(jì)入門-沈澤剛、秦玉平-主編的java-web-第二版-第07章-JDBC數(shù)據(jù)庫(kù)訪問(wèn)_第5頁(yè)
已閱讀5頁(yè),還剩100頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章

JDBC數(shù)據(jù)庫(kù)訪問(wèn)此文檔下載自官網(wǎng),除本頁(yè),其余未修改,可直接刪除本頁(yè)本章內(nèi)容7.1JDBC技術(shù)概述7.2傳統(tǒng)的數(shù)據(jù)庫(kù)連接方法7.3JDBCAPI介紹7.4預(yù)處理語(yǔ)句7.5連接池與數(shù)據(jù)源7.6DAO設(shè)計(jì)模式本章內(nèi)容許多Web應(yīng)用程序都需要訪問(wèn)數(shù)據(jù)庫(kù)。在Java應(yīng)用程序中是通過(guò)JDBC訪問(wèn)數(shù)據(jù)庫(kù)的,JDBC是Sun公司開(kāi)發(fā)的數(shù)據(jù)庫(kù)訪問(wèn)API。本章首先介紹了傳統(tǒng)的數(shù)據(jù)庫(kù)連接方法,然后介紹了常用的JDBCAPI,接下來(lái)介紹了使用數(shù)據(jù)源連接數(shù)據(jù)庫(kù)的方法,最后討論了DAO設(shè)計(jì)模式。7.1JDBC技術(shù)概述JDBC是Java程序訪問(wèn)數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn),它是由一組Java語(yǔ)言編寫的類和接口組成,這些類和接口稱為JDBCAPI,它為Java程序提供一種通用的數(shù)據(jù)訪問(wèn)接口。使用JDBCAPI可以訪問(wèn)任何的數(shù)據(jù)源,從關(guān)系數(shù)據(jù)庫(kù)到電子表格甚至平面文件,它使開(kāi)發(fā)人員可以用純Java語(yǔ)言編寫完整的數(shù)據(jù)庫(kù)應(yīng)用程序。JDBC的根本功能包括:建立與數(shù)據(jù)庫(kù)的連接;發(fā)送SQL語(yǔ)句;處理數(shù)據(jù)庫(kù)操作結(jié)果。7.1.1數(shù)據(jù)庫(kù)訪問(wèn)的兩層和三層模型兩層模型〔圖7-1〕即客戶機(jī)/數(shù)據(jù)庫(kù)效勞器結(jié)構(gòu),也就是通常所說(shuō)的C/S結(jié)構(gòu)。在兩層模型中,Java應(yīng)用程序通過(guò)JDBCAPI直接和數(shù)據(jù)源交互。用戶的SQL命令被傳送給數(shù)據(jù)庫(kù)或其他數(shù)據(jù)源,SQL語(yǔ)句的執(zhí)行結(jié)果返回給用戶。數(shù)據(jù)源可以位于網(wǎng)絡(luò)的其他機(jī)器上。這被稱為是客戶效勞器配置,用戶機(jī)器為客戶,存放數(shù)據(jù)源的機(jī)器為效勞器。網(wǎng)絡(luò)可以是企業(yè)內(nèi)部網(wǎng),也可以是Internet。7.1.1數(shù)據(jù)庫(kù)訪問(wèn)的兩層和三層模型

三層模型〔圖7-2〕是指客戶機(jī)/應(yīng)用效勞器/數(shù)據(jù)庫(kù)效勞器結(jié)構(gòu),也就是通常所說(shuō)的B/S結(jié)構(gòu)。在三層模型中,客戶機(jī)通過(guò)Java小程序或?yàn)g覽器發(fā)出SQL請(qǐng)求,該請(qǐng)求首先傳送到應(yīng)用效勞器,應(yīng)用效勞器再通過(guò)JDBC與數(shù)據(jù)庫(kù)效勞器進(jìn)行連接,由數(shù)據(jù)庫(kù)效勞器處理SQL語(yǔ)句,然后將結(jié)果返回給應(yīng)用效勞器,再由應(yīng)用效勞器將結(jié)果發(fā)送給客戶機(jī)。這里應(yīng)用效勞器一般是Web效勞器,它是一個(gè)“中間層”。7.1.1數(shù)據(jù)庫(kù)訪問(wèn)的兩層和三層模型7.1.2JDBC驅(qū)動(dòng)程序Java應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)的一般過(guò)程如圖7-3所示。應(yīng)用程序通過(guò)JDBC驅(qū)動(dòng)程序管理器加載相應(yīng)的驅(qū)動(dòng)程序,通過(guò)驅(qū)動(dòng)程序與具體的數(shù)據(jù)庫(kù)連接,然后訪問(wèn)數(shù)據(jù)庫(kù)。7.1.2JDBC驅(qū)動(dòng)程序7.1.2JDBC驅(qū)動(dòng)程序目前有多種類型的數(shù)據(jù)庫(kù),每種數(shù)據(jù)庫(kù)都定義了一套API,這些API一般是用C/C++語(yǔ)言實(shí)現(xiàn)的,因此需要有在程序收到JDBC請(qǐng)求后,將其轉(zhuǎn)換成適合于數(shù)據(jù)庫(kù)系統(tǒng)的方法調(diào)用。把完成這類轉(zhuǎn)換工作的程序叫做數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。在Java程序中可以使用的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序主要有4種類型,常用的有下面兩種:

1.JDBC-ODBC橋驅(qū)動(dòng)程序。

2.專為某種數(shù)據(jù)庫(kù)而編寫的驅(qū)動(dòng)程序。1.JDBC-ODBC橋驅(qū)動(dòng)程序JDBC-ODBC橋驅(qū)動(dòng)程序是為了與Microsoft的ODBC連接而設(shè)計(jì)的。ODBC〔OpenDataBaseConnectivity〕稱為開(kāi)放數(shù)據(jù)庫(kù)連接,它是Windows系統(tǒng)與各種數(shù)據(jù)庫(kù)進(jìn)行通信的軟件。通過(guò)該驅(qū)動(dòng)程序與ODBC進(jìn)行通信,就可以與各種數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行通信了。但是不推薦使用這種方法與數(shù)據(jù)庫(kù)連接,只是在不能獲得數(shù)據(jù)庫(kù)專用的JDBC驅(qū)動(dòng)程序或在開(kāi)發(fā)階段使用這種方法。2.專為某種數(shù)據(jù)庫(kù)而編寫的驅(qū)動(dòng)程序由于ODBC具有一定的缺陷,因此許多數(shù)據(jù)庫(kù)廠商專門開(kāi)發(fā)了針對(duì)JDBC的驅(qū)動(dòng)程序,這類驅(qū)動(dòng)程序大多是用純Java語(yǔ)言編寫的,因此推薦使用數(shù)據(jù)庫(kù)廠商為JDBC開(kāi)發(fā)的專門的驅(qū)動(dòng)程序。7.1.3安裝JDBC驅(qū)動(dòng)程序使用JDBC-ODBC橋驅(qū)動(dòng)程序連接數(shù)據(jù)庫(kù),不需要安裝驅(qū)動(dòng)程序,因?yàn)樵贘avaAPI中已經(jīng)包含了該驅(qū)動(dòng)程序。使用專用驅(qū)動(dòng)程序連接數(shù)據(jù)庫(kù),必須安裝驅(qū)動(dòng)程序。不同的數(shù)據(jù)庫(kù)系統(tǒng)提供了不同的JDBC驅(qū)動(dòng)程序,可以到相關(guān)網(wǎng)站下載。7.1.3安裝JDBC驅(qū)動(dòng)程序例如,如果使用PostgreSQL數(shù)據(jù)庫(kù),可以到/下載,下載后是一個(gè)打包文件〔如〕。在開(kāi)發(fā)Web應(yīng)用程序中,需要將驅(qū)動(dòng)程序打包文件復(fù)制到Tomcat安裝目錄的lib目錄中或Web應(yīng)用程序的WEB-INF\lib目錄中。7.2傳統(tǒng)的數(shù)據(jù)庫(kù)連接方法JDBCAPI是在java.sql包和javax.sql包中定義的,其中包括JDBCAPI用到的所有類和接口。下面是主要的類和接口:

DriverManager類Driver接口Connection接口Statement接口PreparedStatement接口ResultSet接口CallableStatement接口SQLException類7.2.1加載驅(qū)動(dòng)程序要使應(yīng)用程序能夠訪問(wèn)數(shù)據(jù)庫(kù),首先必須加載驅(qū)動(dòng)程序。驅(qū)動(dòng)程序是實(shí)現(xiàn)了Driver接口的類,它一般由數(shù)據(jù)庫(kù)廠商提供。加載JDBC驅(qū)動(dòng)程序最常用的方法是使用Class類的forName()靜態(tài)方法,該方法的聲明格式為:publicstaticClass<?>forName(StringclassName)throwsClassNotFoundException

參數(shù)className為一字符串表示的完整的驅(qū)動(dòng)程序類的名稱。如果找不到驅(qū)動(dòng)程序?qū)伋鯟lassNotFoundException異常。該方法返回一個(gè)Class類的對(duì)象。對(duì)于不同的數(shù)據(jù)庫(kù),驅(qū)動(dòng)程序的類名是不同的。如果使用JDBC-ODBC橋驅(qū)動(dòng)程序連接數(shù)據(jù)庫(kù),那么使用JDK自帶的驅(qū)動(dòng)程序,名稱為“”,要加載該驅(qū)動(dòng)程序,可使用下面的語(yǔ)句:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

7.2.1加載驅(qū)動(dòng)程序如果要加載數(shù)據(jù)庫(kù)廠商提供的專門的驅(qū)動(dòng)程序,應(yīng)該給出專門的驅(qū)動(dòng)程序名。例如,要加載PostgreSQL數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序應(yīng)使用以下語(yǔ)句:Class.forName("org.postgresql.Driver");這里,org.postgresql.Driver為PostgreSQL的驅(qū)動(dòng)程序類名。7.2.1加載驅(qū)動(dòng)程序7.2.2建立連接對(duì)象驅(qū)動(dòng)程序加載成功后應(yīng)使用DriverManager類的getConnection()建立數(shù)據(jù)庫(kù)連接對(duì)象。DriverManager類維護(hù)一個(gè)注冊(cè)的Driver類的列表。

1.DriverManager類建立數(shù)據(jù)庫(kù)連接的方法是調(diào)用DriverManager類的靜態(tài)方法getConnection(),該方法的聲明格式為:

publicstaticConnection

getConnection(Stringdburl)

publicstaticConnectiongetConnection(Stringdburl,

Stringuser,Stringpassword)

這里字符串參數(shù)dburl表示JDBCURL,user表示數(shù)據(jù)庫(kù)用戶名,password表示口令。調(diào)用該方法,DriverManager類試圖從注冊(cè)的驅(qū)動(dòng)程序中選擇一個(gè)適宜的驅(qū)動(dòng)程序,然后建立到給定的JDBCURL的連接。如果不能建立連接將拋出SQLException異常。1.DriverManager類2.JDBCURLJDBCURL與一般的URL不同,它用來(lái)標(biāo)識(shí)數(shù)據(jù)源,這樣驅(qū)動(dòng)程序就可以與它建立一個(gè)連接。下面是JDBCURL的標(biāo)準(zhǔn)語(yǔ)法,它包括三個(gè)局部,中間用冒號(hào)分隔:jdbc:<subprotocol>:<subname>其中,jdbc表示協(xié)議,JDBCURL的協(xié)議總是jdbc。subprotocol表示子協(xié)議。subname為子名稱,它表示數(shù)據(jù)庫(kù)標(biāo)識(shí)符,該局部?jī)?nèi)容隨數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序的不同而不同。如果通過(guò)JDBC-ODBC橋驅(qū)動(dòng)程序連接數(shù)據(jù)庫(kù),URL的形式為:jdbc:odbc:DataSource上面三個(gè)局部組成一個(gè)整體字符串就是JDBCURL,例如:Stringdburl="jdbc:odbc:sampleDS";2.JDBCURL如果使用數(shù)據(jù)庫(kù)廠商提供的專門的驅(qū)動(dòng)程序連接數(shù)據(jù)庫(kù),JDBCURL可能復(fù)雜一些。例如,要連接PostgreSQL數(shù)據(jù)庫(kù),它的JDBCURL為:jdbc:postgresql://localhost:5432/dbname這里,localhost表示主機(jī)名或IP地址,5432為數(shù)據(jù)庫(kù)效勞器的端口號(hào),dbname為數(shù)據(jù)庫(kù)名。

2.JDBCURL下面代碼說(shuō)明了如何以paipaistore用戶連接到PostgreSQL數(shù)據(jù)庫(kù)。這里的數(shù)據(jù)庫(kù)名為paipaistore、用戶名為paipaistore、口令為paipaistore:

Stringdburl=

"jdbc:postgresql://localhost:5432/paipaistore";Connectionconn=

DriverManager.getConnection(dburl,"paipaistore","paipaistore");2.JDBCURL常用的數(shù)據(jù)庫(kù)JDBC連接代碼

7.2.3創(chuàng)立語(yǔ)句對(duì)象通過(guò)Connection對(duì)象,可創(chuàng)立語(yǔ)句對(duì)象。對(duì)于不同的語(yǔ)句對(duì)象,可以使用Connection接口的不同方法創(chuàng)立。例如,要?jiǎng)?chuàng)立一個(gè)簡(jiǎn)單的Statement對(duì)象可以使用createStatement(),創(chuàng)立PreparedStatement對(duì)象應(yīng)該使用prepareStatement(),創(chuàng)立CallableStatement對(duì)象應(yīng)該使用prepareCall()。下面的代碼將創(chuàng)立一個(gè)簡(jiǎn)單的Statement對(duì)象。Statementstmt=conn.createStatement();7.2.4獲得SQL語(yǔ)句的執(zhí)行結(jié)果執(zhí)行SQL語(yǔ)句使用Statement對(duì)象的方法。對(duì)于查詢語(yǔ)句,調(diào)用executeQuery(Stringsql)返回ResultSet。ResultSet對(duì)象保存查詢的結(jié)果集,再調(diào)用ResultSet的方法可以對(duì)查詢結(jié)果的每行進(jìn)行處理。

Stringsql="SELECT*FROMproducts";ResultSetrst=stmt.executeQuery(sql);while(rst.next()){out.print(rst.getString(1)+"\t");}7.2.4獲得SQL語(yǔ)句的執(zhí)行結(jié)果對(duì)于DDL語(yǔ)句如CREATE、ALTER、DROP和DML語(yǔ)句如INSERT、UPDATE、DELETE等須使用語(yǔ)句對(duì)象的executeUpdate(Stringsql)。該方法返回值為整數(shù),用來(lái)指示被影響的行數(shù)。7.2.5關(guān)閉建立的對(duì)象在Connection接口、Statement接口和ResultSet接口中都定義了close()。當(dāng)這些對(duì)象使用完畢后應(yīng)使用close()關(guān)閉。如果使用Java7的try-with-resources語(yǔ)句,那么可以自動(dòng)關(guān)閉這些對(duì)象。7.2.6簡(jiǎn)單的應(yīng)用例如本例如程序可以根據(jù)用戶輸入的商品號(hào)從數(shù)據(jù)庫(kù)中查詢?cè)撋唐沸畔?,或者查詢所有商品信息。本?yīng)用的設(shè)計(jì)遵循了MVC設(shè)計(jì)模式,其中視圖有queryProduct.jsp、displayProduct.jsp、displayAllProduct.jsp和error.jsp幾個(gè)頁(yè)面,Product類實(shí)現(xiàn)模型,QueryProductServlet類實(shí)現(xiàn)控制器。7.2.6簡(jiǎn)單的應(yīng)用例如

該應(yīng)用需要訪問(wèn)數(shù)據(jù)庫(kù)表products中的數(shù)據(jù),該表的定義如下。

CREATETABLEproducts(prod_idcharacter(3)NOTNULL,

pnamecharactervarying(30)

NOTNULL,pricenumeric(8,2),

stockinteger,

CONSTRAINTproduct_pkeyPRIMARYKEY(prod_id)

)根據(jù)表的定義,設(shè)計(jì)下面的JavaBeans存放商品信息,這里表的字段對(duì)應(yīng)Product類的成員變量。

程序7.1Product.java下面是queryProduct.jsp頁(yè)面代碼。

程序7.2queryProduct.jsp

7.2.6簡(jiǎn)單的應(yīng)用例如下面的Servlet連接數(shù)據(jù)庫(kù),當(dāng)用戶在文本框中輸入商品號(hào),單擊“確定”按鈕,將執(zhí)行doPost(),當(dāng)用戶單擊“查詢所有商品”鏈接時(shí),將執(zhí)行doGet()。程序7.3QueryProductServlet.java

該頁(yè)面運(yùn)行結(jié)果如圖7-4所示。7.2.6簡(jiǎn)單的應(yīng)用例如下面的JSP頁(yè)面displayProduct.jsp和displayAllProduct.jsp分別顯示查詢一件商品和所有商品信息。

程序7.4displayProduct.jsp當(dāng)單擊圖7-4中“查詢所有商品”鏈接時(shí),控制將轉(zhuǎn)到displayAllProduct.jsp頁(yè)面,如下所示

程序7.5displayAllProduct.jsp7.2.6簡(jiǎn)單的應(yīng)用例如當(dāng)查詢的商品不存在時(shí),顯示下面的頁(yè)面。程序7.6error.jsp在圖7-4的頁(yè)面中輸入商品號(hào),單擊“確定”按鈕,那么顯示如圖7-5所示頁(yè)面。在圖7-4中單擊“查詢所有商品”鏈接,那么顯示如圖7-6所示頁(yè)面。7.2.6簡(jiǎn)單的應(yīng)用例如7.3JDBCAPI介紹JDBCAPI是Java語(yǔ)言的標(biāo)準(zhǔn)API,目前的最新版本是JDBC4.0。在JDK7.0中,它是通過(guò)兩個(gè)包提供的:java.sql包javax.sql包7.3JDBCAPI介紹java.sql包提供了根本的數(shù)據(jù)庫(kù)編程的類和接口,如驅(qū)動(dòng)程序管理類DriverManager、創(chuàng)立數(shù)據(jù)庫(kù)連接Connection接口、執(zhí)行SQL語(yǔ)句以及處理查詢結(jié)果的類和接口等。javax.sql包主要提供了效勞器端訪問(wèn)和處理數(shù)據(jù)源的類和接口,如DataSource、RowSet、RowSetMetaData、PooledConnection接口等,它們可以實(shí)現(xiàn)數(shù)據(jù)源管理、行集管理以及連接池管理等。7.3.1Connection接口調(diào)用DriverManager類的靜態(tài)方法getConnection()或數(shù)據(jù)源〔DataSource〕對(duì)象的getConnection()都可以得到連接〔Connection〕對(duì)象,得到連接對(duì)象后就可以調(diào)用它的createStatement()創(chuàng)立SQL語(yǔ)句〔Statement〕對(duì)象以及在連接對(duì)象上完成各種操作,下面是Connection接口創(chuàng)立Statement對(duì)象的方法。publicStatementcreateStatement():創(chuàng)立一個(gè)Statement對(duì)象。如果這個(gè)Statement對(duì)象用于查詢,那么調(diào)用它的executeQuery()返回的ResultSet是一個(gè)不可滾動(dòng)、不可更新的ResultSet。7.3.1Connection接口publicStatementcreateStatement(intresultType,intconcurrency):創(chuàng)立一個(gè)Statement對(duì)象。如果這個(gè)Statement對(duì)象用于查詢,那么這兩個(gè)參數(shù)決定executeQuery()返回的ResultSet是否是一個(gè)可滾動(dòng)、可更新的ResultSet。7.3.1Connection接口publicStatementcreateStatement(intresultType,intconcurrency,intholdability):創(chuàng)立一個(gè)Statement對(duì)象。如果這個(gè)Statement對(duì)象用于查詢,那么前兩個(gè)參數(shù)決定executeQuery()返回的ResultSet是否是一個(gè)可滾動(dòng)、可更新的ResultSet,第三個(gè)參數(shù)決定可保持性〔holdability〕。7.3.1Connection接口7.3.2Statement接口一旦創(chuàng)立了Statement對(duì)象,就可以用它來(lái)向數(shù)據(jù)庫(kù)發(fā)送SQL語(yǔ)句,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的查詢和更新操作等。

1.執(zhí)行查詢語(yǔ)句可以使用Statement接口的以下方法向數(shù)據(jù)庫(kù)發(fā)送SQL查詢語(yǔ)句。publicResultSetexecuteQuery(Stringsql)該方法用來(lái)執(zhí)行SQL查詢語(yǔ)句。參數(shù)sql為用字符串表示的SQL查詢語(yǔ)句。查詢結(jié)果以ResultSet對(duì)象返回,一般稱為結(jié)果集對(duì)象。在ResultSet對(duì)象上可以逐行逐列地讀取數(shù)據(jù)。2.執(zhí)行非查詢語(yǔ)句可以使用Statement接口的以下方法向數(shù)據(jù)庫(kù)發(fā)送非SQL查詢語(yǔ)句。publicintexecuteUpdate(Stringsql)該方法執(zhí)行由字符串sql指定的SQL語(yǔ)句,該語(yǔ)句可以是INSERT、DELETE、UPDATE語(yǔ)句或者無(wú)返回值的SQL語(yǔ)句,如SQLDDL語(yǔ)句CREATETABLE。返回值是更新的行數(shù),如果語(yǔ)句沒(méi)有返回那么返回值為0。2.執(zhí)行非查詢語(yǔ)句publicbooleanexecute(Stringsql):執(zhí)行可能有多個(gè)結(jié)果集的SQL語(yǔ)句,sql為任何的SQL語(yǔ)句。如果語(yǔ)句執(zhí)行的第一個(gè)結(jié)果為ResultSet對(duì)象,該方法返回true,否那么返回false。publicint[]executeBatch():用于在一個(gè)操作中發(fā)送多條SQL語(yǔ)句。

與Connection對(duì)象一樣,Statement對(duì)象使用完畢應(yīng)該用close()將其關(guān)閉,釋放其占用的資源。但這并不是說(shuō)在執(zhí)行了一條SQL語(yǔ)句后就立即釋放這個(gè)Statement對(duì)象,可以用同一個(gè)Statement對(duì)象執(zhí)行多個(gè)SQL語(yǔ)句。3.釋放Statement7.3.3ResultSet接口ResultSet對(duì)象表示SELECT語(yǔ)句查詢得到的記錄集合,結(jié)果集一般是一個(gè)記錄表,其中包含多個(gè)記錄行和列標(biāo)題,記錄行從1開(kāi)始,一個(gè)Statement對(duì)象一個(gè)時(shí)刻只能翻開(kāi)一個(gè)ResultSet對(duì)象。如果需要對(duì)結(jié)果集的每行進(jìn)行處理,需要移動(dòng)結(jié)果集的游標(biāo)。所謂游標(biāo)〔cursor〕是結(jié)果集的一個(gè)標(biāo)志或指針。對(duì)新產(chǎn)生的ResultSet對(duì)象,游標(biāo)指向第一行的前面,可以調(diào)用ResultSet的next(),使游標(biāo)定位到下一條記錄。next()的格式如下。publicbooleannext()throwsSQLException將游標(biāo)從當(dāng)前位置向下移動(dòng)一行。第一次調(diào)用next()將使第一行成為當(dāng)前行,以后調(diào)用游標(biāo)依次向后移動(dòng)。如果該方法返回true,說(shuō)明新行是有效的行,假設(shè)返回false,說(shuō)明已無(wú)記錄。7.3.3ResultSet接口1.檢索字段值ResultSet接口提供了檢索行的字段值的方法,由于結(jié)果集列的數(shù)據(jù)類型不同,所以應(yīng)該使用不同的getXxx()獲得列值,例如假設(shè)列值為字符型數(shù)據(jù),可以使用以下方法檢索列值:

StringgetString(intcolumnIndex)

StringgetString(StringcolumnName)

返回結(jié)果集中當(dāng)前行指定的列號(hào)或列名的列值,結(jié)果作為字符串返回。columnIndex

為列在結(jié)果行中的序號(hào),序號(hào)從1開(kāi)始,columnName為結(jié)果行中的列名。下面列出了返回其他數(shù)據(jù)類型的方法,這些方法都可以使用這兩種形式的參數(shù):

1.檢索字段值publicbooleangetBoolean(intcolumnIndex):返回指定列的boolean值。publicDategetDate(intcolumnIndex):返回指定列的Date對(duì)象值。publicObjectgetObject(intcolumnIndex):返回指定列的Object對(duì)象值。publicBlobgetBlob(intcolumnIndex):返回指定列的Blob對(duì)象值。publicClobgetClob(intcolumnIndex):返回指定列的Clob對(duì)象值。1.檢索字段值2.數(shù)據(jù)類型轉(zhuǎn)換在ResultSet對(duì)象中的數(shù)據(jù)為從數(shù)據(jù)庫(kù)中查詢出的數(shù)據(jù),調(diào)用ResultSet對(duì)象的getXxx()方法返回的是Java語(yǔ)言的數(shù)據(jù)類型,因此這里就有數(shù)據(jù)類型轉(zhuǎn)換的問(wèn)題。實(shí)際上調(diào)用getXxx()方法就是把SQL數(shù)據(jù)類型轉(zhuǎn)換為Java語(yǔ)言數(shù)據(jù)類型,表7-2列出了SQL數(shù)據(jù)類型與Java數(shù)據(jù)類型的轉(zhuǎn)換。2.數(shù)據(jù)類型轉(zhuǎn)換7.3.4可滾動(dòng)與可更新的ResultSet可滾動(dòng)的ResultSet是指在結(jié)果集對(duì)象上可以前后移動(dòng)指針訪問(wèn)結(jié)果集中的記錄??筛碌腞esultSet是指不但可以訪問(wèn)結(jié)果集中的記錄,還可以通過(guò)結(jié)果集對(duì)象更新數(shù)據(jù)庫(kù)。1.可滾動(dòng)的ResultSet要使用可滾動(dòng)的ResultSet對(duì)象,必須使用Connection對(duì)象的帶參數(shù)的createStatement()創(chuàng)立的Statement,然后該對(duì)象的結(jié)果集才是可滾動(dòng)的,該方法的格式為:publicStatementcreateStatement(intresultType,intconcurrency)如果這個(gè)Statement對(duì)象用于查詢,那么這兩個(gè)參數(shù)決定executeQuery()返回的ResultSet是否是一個(gè)可滾動(dòng)、可更新的ResultSet。參數(shù)resultType的取值應(yīng)為ResultSet接口中定義的下面常量。ResultSet.TYPE_SCROLL_SENSITIVEResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_FORWARD_ONLY前兩個(gè)常量用于創(chuàng)立可滾動(dòng)的ResultSet。使用TYPE_SCROLL_SENSITIVE常量,當(dāng)數(shù)據(jù)庫(kù)發(fā)生改變時(shí),這些變化對(duì)結(jié)果集可見(jiàn)。使用TYPE_SCROLL_INSENSITIVE常量,當(dāng)數(shù)據(jù)庫(kù)發(fā)生改變時(shí),這些變化對(duì)結(jié)果集不可見(jiàn)。使用TYPE_FORWARD_ONLY常量創(chuàng)立不可滾動(dòng)的結(jié)果集。1.可滾動(dòng)的ResultSet對(duì)于可滾動(dòng)的結(jié)果集,ResultSet接口提供了下面的移動(dòng)結(jié)果集游標(biāo)的方法。publicbooleanprevious()throwsSQLException:游標(biāo)向前移動(dòng)一行,如果存在合法的行返回true,否那么返回false。publicbooleanfirst()throwsSQLException:移動(dòng)游標(biāo)使其指向第一行。publicbooleanlast()throwsSQLException:移動(dòng)游標(biāo)使其指向最后一行。publicbooleanabsolute(introws)throwsSQLException:移動(dòng)游標(biāo)使其指向指定的行。1.可滾動(dòng)的ResultSetpublicbooleanrelative(introws)throwsSQLException:以當(dāng)前行為基準(zhǔn)相對(duì)移動(dòng)游標(biāo)的指針,rows為向后或向前移動(dòng)的行數(shù)。rows假設(shè)為正值是向前移動(dòng),假設(shè)為負(fù)值是向后移動(dòng)。publicbooleanisFirst()throwsSQLException:返回游標(biāo)是否指向第一行。publicbooleanisLast()throwsSQLException:返回游標(biāo)是否指向最后一行。publicintgetRow():返回游標(biāo)所在當(dāng)前行的行號(hào)。1.可滾動(dòng)的ResultSet2.可更新的ResultSet在JDBC2.0之前,ResultSet對(duì)象只可用于查詢數(shù)據(jù)、向前移動(dòng)游標(biāo)和讀取每列數(shù)據(jù)值。為了更新數(shù)據(jù),需要通過(guò)Statement對(duì)象執(zhí)行另外的SQL語(yǔ)句。JDBC2.0提供了直接通過(guò)ResultSet對(duì)象更新數(shù)據(jù)庫(kù)表中數(shù)據(jù)的能力。要實(shí)現(xiàn)該功能,應(yīng)該創(chuàng)立一個(gè)可更新的ResultSet對(duì)象。首先在使用Connection的createStatement(intresultType,intconcurrency)創(chuàng)立Statement對(duì)象時(shí),通過(guò)指定第二個(gè)參數(shù)的值決定是否創(chuàng)立可更新的結(jié)果集,該參數(shù)也使用ResultSet接口中定義的常量,如下所示。ResultSet.CONCUR_READ_ONLYResultSet.CONCUR_UPDATABLE使用第一個(gè)常量創(chuàng)立一個(gè)只讀的ResultSet對(duì)象,不能通過(guò)它更新表。使用第二個(gè)常量那么創(chuàng)立一個(gè)可更新的ResultSet對(duì)象。2.可更新的ResultSet得到可更新的ResultSet對(duì)象后,就可以調(diào)用適當(dāng)?shù)膗pdateXxx()更新指定的列值。對(duì)于每種數(shù)據(jù)類型,ResultSet都定義了相應(yīng)的updateXxx(),例如:publicvoidupdateInt(intcolumnIndex,intx):用指定的整數(shù)x的值更新當(dāng)前行指定的列的值,其中columnIndex為列的序號(hào)。publicvoidupdateInt(StringcolumnName,intx):用指定的整數(shù)x的值更新當(dāng)前行指定的列的值,其中columnName為列名2.可更新的ResultSetpublicvoidupdateString(intcolumnIndex,Stringx):用指定的字符串x的值更新當(dāng)前行指定的列的值,其中columnIndex為列的序號(hào)。publicvoidupdateString(StringcolumnName,Stringx):用指定的字符串x的值更新當(dāng)前行指定的列的值,其中columnName為列名。2.可更新的ResultSet每個(gè)updateXxx()都有兩個(gè)重載的版本,一個(gè)是第一個(gè)參數(shù)是int類型的,用來(lái)指定更新的列號(hào),另一個(gè)是第一個(gè)參數(shù)是String類型的,指定更新的列名。第二個(gè)參數(shù)的類型與要更新的列的類型一致。有關(guān)其他方法請(qǐng)參考API文檔。2.可更新的ResultSet下面是通過(guò)可更新的ResultSet對(duì)象實(shí)現(xiàn)對(duì)表的插入、刪除和修改。voidmoveToInsertRow()throwsSQLException:將游標(biāo)移到插入行。要插入一行數(shù)據(jù)首先應(yīng)該使用該方法將游標(biāo)移到插入行。插入行是與可更新結(jié)果集相關(guān)的特殊行。它實(shí)際上是一個(gè)在將行插入到結(jié)果集之前構(gòu)建的新行的緩沖區(qū)。當(dāng)游標(biāo)處于插入行時(shí),調(diào)用updateXxx()用相應(yīng)的數(shù)據(jù)修改每列的值。完成新行數(shù)據(jù)修改之后,調(diào)用insertRow()將新行插入結(jié)果集。。2.可更新的ResultSetvoidinsertRow()throwsSQLException:插入一行數(shù)據(jù)。在調(diào)用該方法之前,插入行所有的列都必須給定一個(gè)值。調(diào)用insertRow()之后,這個(gè)ResultSet仍然位于插入行。這時(shí),可以插入另外一行數(shù)據(jù),或者移回到剛剛ResultSet記住的位置〔當(dāng)前行位置〕。voidmoveToCurrentRow()throwsSQLException:返回到當(dāng)前行。也可以在調(diào)用insertRow()之前通過(guò)調(diào)用moveToCurrentRow()取消插入。2.可更新的ResultSetvoiddeleteRow()throwsSQLException:從結(jié)果集中刪除當(dāng)前行,同時(shí)從數(shù)據(jù)庫(kù)中將該行刪除。voidupdateRow()throwsSQLException:執(zhí)行該方法,將用當(dāng)前行的新內(nèi)容更新結(jié)果集,同時(shí)更新數(shù)據(jù)庫(kù)。當(dāng)使用updateXxx()更新了需要更新的所有列之后,調(diào)用該方法把更新寫入表中。在調(diào)用updateRow()之前,如果斷定不想更新這行數(shù)據(jù),可以調(diào)用cancelRowUpdate()取消更新。2.可更新的ResultSet下面代碼說(shuō)明了如何在products表中修改一件商品的名稱。Stringsql="SELECTprod_id,pnameFROMproductsWHEREprod_id='P2'";ResultSetrset=stmt.executeQuery(sql);rset.next();//修改當(dāng)前行的字段值rset.updateString(2,"iPhone5");rset.updateRow();//更新當(dāng)前行2.可更新的ResultSet7.4預(yù)處理語(yǔ)句Statement對(duì)象在每次執(zhí)行SQL語(yǔ)句時(shí)都將語(yǔ)句傳給數(shù)據(jù)庫(kù),這樣在屢次執(zhí)行同一個(gè)語(yǔ)句時(shí)效率較低,這時(shí)可以使用PreparedStatement對(duì)象。如果數(shù)據(jù)庫(kù)支持預(yù)編譯,它可以將SQL語(yǔ)句傳給數(shù)據(jù)庫(kù)作預(yù)編譯,以后每次執(zhí)行這個(gè)SQL語(yǔ)句時(shí),速度就可以提高很多。PreparedStatement接口繼承了Statement接口,因此它可以使用Statement接口中定義的方法。PreparedStatement對(duì)象還可以創(chuàng)立帶參數(shù)的SQL語(yǔ)句,在SQL語(yǔ)句中指出接收哪些參數(shù),然后進(jìn)行預(yù)編譯。7.4.1創(chuàng)立PreparedStatement對(duì)象創(chuàng)立PreparedStatement對(duì)象與創(chuàng)立Statement對(duì)象類似,唯一不同的是需要給創(chuàng)立的PreparedStatement對(duì)象傳遞一個(gè)SQL命令,即需要將執(zhí)行的SQL命令傳遞給其構(gòu)造方法而不是execute()。用Connection的以下方法創(chuàng)立PreparedStatement對(duì)象。PreparedStatementprepareStatement(Stringsql):使用給定的SQL命令創(chuàng)立一個(gè)PreparedStatement對(duì)象,在該對(duì)象上返回的ResultSet是只能向前滾動(dòng)的結(jié)果集。7.4.1創(chuàng)立PreparedStatement對(duì)象PreparedStatementprepareStatement(Stringsql,intresultType,intconcurrency)使用給定的SQL命令創(chuàng)立一個(gè)PreparedStatement對(duì)象,在該對(duì)象上返回的ResultSet可以通過(guò)resultType和concurrency參數(shù)指定是否可滾動(dòng)、是否可更新。這些方法的第一個(gè)參數(shù)是SQL字符串。這些SQL字符串可以包含一些參數(shù),這些參數(shù)在SQL中使用問(wèn)號(hào)〔?〕作為占位符,在SQL語(yǔ)句執(zhí)行時(shí)將用實(shí)際數(shù)據(jù)替換。7.4.1創(chuàng)立PreparedStatement對(duì)象7.4.2使用PreparedStatement對(duì)象PreparedStatement對(duì)象通常用來(lái)執(zhí)行動(dòng)態(tài)SQL語(yǔ)句,此時(shí)需要在SQL語(yǔ)句通過(guò)問(wèn)號(hào)指定參數(shù),每個(gè)問(wèn)號(hào)為一個(gè)參數(shù)。例如:

Stringsql="SELECT*FROMproducts

WHEREprod_id=?";Stringsql="INSERTINTOproductsVALUES

(?,?,?,?)";PreparedStatementpstmt=

conn.prepareStatement(sql);SQL命令中的每個(gè)占位符都是通過(guò)它們的序號(hào)被引用,從SQL字符串左邊開(kāi)始,第一個(gè)占位符的序號(hào)為1,依此類推。1.設(shè)置占位符創(chuàng)立PreparedStatement對(duì)象之后,在執(zhí)行該SQL語(yǔ)句之前,必須用數(shù)據(jù)替換每個(gè)占位符??梢酝ㄟ^(guò)PreparedStatement接口中定義的setXxx()為占位符設(shè)置具體的值。例如,下面方法分別為占位符設(shè)置整數(shù)值和字符串值。publicvoidsetInt(intparameterIndex,intx):這里parameterIndex為參數(shù)的序號(hào),x為一個(gè)整數(shù)值。publicvoidsetString(intparameterIndex,Stringx):為占位符設(shè)置一個(gè)字符串值。每個(gè)Java根本類型都有一個(gè)對(duì)應(yīng)的setXxx(),此外,還有許多對(duì)象類型,如Date和BigDecimal都有相應(yīng)的setXxx()。對(duì)于前面的INSERT語(yǔ)句,可以使用下面的方法設(shè)置占位符的值。pstmt.setString(1,"P8");pstmt.setString(2,"iPhone5");pstmt.setDouble(3,1490.00);pstmt.setInt(4,5);1.設(shè)置占位符2.用復(fù)雜數(shù)據(jù)設(shè)置占位符使用PreparedStatement對(duì)象還可以在數(shù)據(jù)庫(kù)中插入和更新復(fù)雜數(shù)據(jù)。例如,如果向表中插入日期或時(shí)間數(shù)據(jù),數(shù)據(jù)庫(kù)對(duì)日期的格式有一定的格式規(guī)定,如果不符合格式的要求,數(shù)據(jù)庫(kù)不允許插入。因此,一般要查看數(shù)據(jù)庫(kù)文檔來(lái)確定使用什么格式,使用預(yù)處理語(yǔ)句就不必這么麻煩。使用預(yù)處理語(yǔ)句對(duì)象可以對(duì)要插入到數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行處理。對(duì)于日期、時(shí)間和時(shí)間戳的數(shù)據(jù),只要簡(jiǎn)單地創(chuàng)立相應(yīng)的或?qū)ο?,然后把它傳給預(yù)處理語(yǔ)句對(duì)象的setDate()或setTime()即可。假設(shè)getSqlDate()返回給定日期的Date對(duì)象,使用下面語(yǔ)句可以設(shè)置日期參數(shù)。Dated=getSqlDate("23-Jul-13");pstmt.setDate(1,d);2.用復(fù)雜數(shù)據(jù)設(shè)置占位符3.執(zhí)行預(yù)處理語(yǔ)句設(shè)置好PreparedStatement對(duì)象的全部參數(shù)后,調(diào)用它的有關(guān)方法執(zhí)行語(yǔ)句。對(duì)查詢語(yǔ)句應(yīng)該調(diào)用executeQuery(),如下所示。

ResultSetresult=pstmt.executeQuery();對(duì)更新語(yǔ)句,應(yīng)該調(diào)用executeUpdate(),如下所示。

intn=pstmt.executeUpdate();對(duì)其他類型的語(yǔ)句,應(yīng)該調(diào)用execute(),如下所示。

booleanb=pstmt.execute();注意:對(duì)預(yù)處理語(yǔ)句,必須調(diào)用這些方法的無(wú)參數(shù)版本,如executeQuery()等。如果調(diào)用executeQuery(String)、executeUpdate(String)或者execute(String),將拋出SQLException異常。如果在執(zhí)行SQL語(yǔ)句之前沒(méi)有設(shè)置好全部參數(shù),也會(huì)拋出一個(gè)SQLException異常。3.執(zhí)行預(yù)處理語(yǔ)句7.5連接池與數(shù)據(jù)源在設(shè)計(jì)需要訪問(wèn)數(shù)據(jù)庫(kù)的Web應(yīng)用程序時(shí),需要考慮的一個(gè)主要問(wèn)題是如何管理Web應(yīng)用程序與數(shù)據(jù)庫(kù)的通信。一種方法是為每個(gè)HTTP請(qǐng)求創(chuàng)立一個(gè)連接對(duì)象,Servlet建立數(shù)據(jù)庫(kù)連接、執(zhí)行查詢、處理結(jié)果集、請(qǐng)求結(jié)束關(guān)閉連接。建立連接是比較消耗時(shí)間的操作,如果在客戶每次請(qǐng)求時(shí)都要建立連接,這將導(dǎo)致增大請(qǐng)求的響應(yīng)時(shí)間。為了提高數(shù)據(jù)庫(kù)訪問(wèn)效率,從JDBC2.0開(kāi)始提供了一種更好的方法建立數(shù)據(jù)庫(kù)連接對(duì)象,即使用連接池和數(shù)據(jù)源的技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)。7.5.1連接池與數(shù)據(jù)源介紹數(shù)據(jù)源〔DataSource〕的概念是在JDBC2.0中引入的,是目前Web應(yīng)用開(kāi)發(fā)中獲取數(shù)據(jù)庫(kù)連接的首選方法。這種方法是事先建立假設(shè)干連接對(duì)象,將它們存放在數(shù)據(jù)庫(kù)連接池〔connectionpooling〕中供數(shù)據(jù)訪問(wèn)組件共享。使用這種技術(shù),應(yīng)用程序在啟動(dòng)時(shí)只需創(chuàng)立少量的連接對(duì)象即可。這樣就不需要為每個(gè)HTTP請(qǐng)求都創(chuàng)立一個(gè)連接對(duì)象,這會(huì)大大降低請(qǐng)求的響應(yīng)時(shí)間。數(shù)據(jù)源是通過(guò)接口對(duì)象實(shí)現(xiàn)的,通過(guò)它可以獲得數(shù)據(jù)庫(kù)連接,因此它是對(duì)DriverManager工具的一個(gè)替代。通常DataSource對(duì)象是從連接池中獲得連接對(duì)象。連接池預(yù)定義了一些連接,當(dāng)應(yīng)用程序需要連接對(duì)象時(shí)就從連接池中取出一個(gè),當(dāng)連接對(duì)象使用完畢將其放回連接池,從而可以防止在每次請(qǐng)求連接時(shí)都要?jiǎng)?chuàng)立連接對(duì)象。7.5.1連接池與數(shù)據(jù)源介紹通過(guò)數(shù)據(jù)源獲得數(shù)據(jù)庫(kù)連接對(duì)象不能直接在應(yīng)用程序中通過(guò)創(chuàng)立一個(gè)實(shí)例的方法來(lái)生成DataSource對(duì)象,而是需要采用Java命名與目錄接口〔JavaNamingandDirectoryInterface,JNDI〕技術(shù)來(lái)獲得DataSource對(duì)象的引用。7.5.1連接池與數(shù)據(jù)源介紹可以簡(jiǎn)單地把JNDI理解為一種將名字和對(duì)象綁定的技術(shù),首先為要?jiǎng)?chuàng)立的對(duì)象指定一個(gè)唯一的名字,然后由對(duì)象工廠創(chuàng)立對(duì)象,并將該對(duì)象與唯一的名字綁定,外部程序可以通過(guò)名字來(lái)獲得某個(gè)對(duì)象的訪問(wèn)。在javax.naming包中提供了Context接口,該接口提供了將名字和對(duì)象綁定,通過(guò)名字檢索對(duì)象的方法??梢酝ㄟ^(guò)該接口的一個(gè)實(shí)現(xiàn)類InitialContext獲得上下文對(duì)象。7.5.1連接池與數(shù)據(jù)源介紹7.5.2配置數(shù)據(jù)源下面討論在Tomcat中如何配置使用DataSource建立數(shù)據(jù)庫(kù)連接。在Tomcat中可以配置兩種數(shù)據(jù)源:局部數(shù)據(jù)源和全局?jǐn)?shù)據(jù)源。局部數(shù)據(jù)源只能被定義數(shù)據(jù)源的應(yīng)用程序使用,全局?jǐn)?shù)據(jù)源可被所有的應(yīng)用程序使用。注意:在Tomcat中,不管配置哪種數(shù)據(jù)源,都要將JDBC驅(qū)動(dòng)程序復(fù)制到Tomcat安裝目錄的lib目錄中,并且需要重新啟動(dòng)效勞器。1.配置局部數(shù)據(jù)源建立局部數(shù)據(jù)源非常簡(jiǎn)單,首先在Web應(yīng)用程序中建立一個(gè)META-INF目錄,在其中建立一個(gè)context.xml文件,下面代碼配置了連接PostgreSQL數(shù)據(jù)庫(kù)的數(shù)據(jù)源,內(nèi)容如下。程序7.7context.xmlname:數(shù)據(jù)源名,這里是jdbc/sampleDS。driverClassName:使用的JDBC驅(qū)動(dòng)程序的完整類名。url:傳遞給JDBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù)URL。username:數(shù)據(jù)庫(kù)用戶名。password:數(shù)據(jù)庫(kù)用戶口令。type:指定該資源的類型,這里為DataSource類型。maxActive:可同時(shí)為連接池分配的活動(dòng)連接實(shí)例的最大數(shù)。maxIdle:連接池中可空閑的連接的最大數(shù)。maxWait:在沒(méi)有可用連接的情況下,連接池在拋出異常前等待的最大毫秒數(shù)。1.配置局部數(shù)據(jù)源通過(guò)上面的設(shè)置后,不用在Web應(yīng)用程序的web.xml文件中聲明資源的引用就可以直接使用局部數(shù)據(jù)源。注意:在Tomcat中,如果修改了context.xml文件,應(yīng)將Tomcat安裝目錄中的conf/Catalina//localhost/paipaistore.xml文件刪除。1.配置局部數(shù)據(jù)源2.在應(yīng)用程序中使用數(shù)據(jù)源配置了數(shù)據(jù)源后,就可以使用接口的lookup()查找JNDI數(shù)據(jù)源,如下面代碼可以獲得jdbc/sampleDS數(shù)據(jù)源的引用。

Contextcontext=newInitialContext();

DataSourceds=(DataSource)context.

lookup("java:comp/env/jdbc/sampleDS");2.在應(yīng)用程序中使用數(shù)據(jù)源查找數(shù)據(jù)源對(duì)象的lookup()的參數(shù)是數(shù)據(jù)源名字符串,但要加上“java:comp/env”前綴,它是JNDI命名空間的一局部。得到了DataSource對(duì)象的引用后,就可以通過(guò)它的getConnection()獲得數(shù)據(jù)庫(kù)連接對(duì)象Connection。對(duì)程序7.3的數(shù)據(jù)庫(kù)連接程序,如果使用數(shù)據(jù)源獲得數(shù)據(jù)庫(kù)連接對(duì)象,修改后的程序如下。程序7.8ProductQueryServlet.java代碼首先通過(guò)InitialContext類創(chuàng)立一個(gè)上下文對(duì)象context,然后通過(guò)它的lookup()查找數(shù)據(jù)源對(duì)象,最后通過(guò)數(shù)據(jù)源對(duì)象從連接池中返回一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象。2.在應(yīng)用程序中使用數(shù)據(jù)源3.配置全局?jǐn)?shù)據(jù)源全局?jǐn)?shù)據(jù)源可被所有應(yīng)用程序使用,它是通過(guò)<tomcat-install>/conf/server.xml文件的<GlobalNamingResources>元素定義的,定義后就可在任何的應(yīng)用程序中使用。假設(shè)要配置一個(gè)名為jdbc/paipaistore的數(shù)據(jù)源,應(yīng)該按以下步驟操作?!?〕首先在server.xml文件的<GlobalNamingResources>元素內(nèi)增加下面代碼。<Resourcename="jdbc/paipaistore"type="javax.sql.DataSource"maxA

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論