JSP調(diào)用JDBC API訪問(wèn)數(shù)據(jù)庫(kù)管理系統(tǒng)是通過(guò)以下五個(gè)步驟來(lái)實(shí)現(xiàn)的:
(1)加載特定的JDBC驅(qū)動(dòng)程序
為了與特定的數(shù)據(jù)源連接,JDBC必須加載相應(yīng)的驅(qū)動(dòng)程序。這些驅(qū)動(dòng)程序都是通過(guò)語(yǔ)句:Class.forName("Driver Name"); 來(lái)加載的。這里面有一個(gè)小技巧,我們可以在”Driver Name”出填入一系列的驅(qū)動(dòng)程序名稱,例如:“Class.forName("sun.jdbc.odbc.JdbcOdbcDriver:oracle.jdbc.driver.OracleDriver”); 中間用冒號(hào)隔開(kāi)。JSP將按照列表順序搜索驅(qū)動(dòng)程序,并且加載第一個(gè)能與給定的URL相連的驅(qū)動(dòng)程序。在搜索驅(qū)動(dòng)程序列表時(shí),JSP將跳過(guò)包含不可信任代碼的驅(qū)動(dòng)程序,除非他與要打開(kāi)的數(shù)據(jù)庫(kù)管理系統(tǒng)是來(lái)源于同一處.
(2)用已注冊(cè)的驅(qū)動(dòng)程序建立到數(shù)據(jù)庫(kù)管理系統(tǒng)的連接
我們要做的第二步是用已經(jīng)注冊(cè)的驅(qū)動(dòng)程序建立到數(shù)據(jù)庫(kù)管理系統(tǒng)的連接,這要通過(guò)DriverManager類的getConncetion方法來(lái)實(shí)現(xiàn)。這里特別需要注意的是String類型 url 參數(shù)的取值,url代表一個(gè)將要連接的特定的數(shù)據(jù)庫(kù)管理系統(tǒng)的數(shù)據(jù)源。使用不同的數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序,url的取值方式是不同的。例程中加載了“com.mysql.jdbc.Driver”驅(qū)動(dòng),url的取值方式“jdbc:mysql://localhost:3306/ums_db?useUnicode=true&characterEncoding=GB2312”,如果加載“oracle.jdbc.driver.OracleDriver”驅(qū)動(dòng),url的取值方式應(yīng)該是“jdbc:oracle:thin:@host name:port number:service name”。其他驅(qū)動(dòng)程序的url的取值方式,各位自行參閱相應(yīng)的文擋。
例程中的GetConnection()方法只有一個(gè)參數(shù)String url,代表ODBC數(shù)據(jù)源,如果連接大型數(shù)據(jù)庫(kù),則需要三個(gè)參數(shù):String url、Strng user、String password。User和password代表數(shù)據(jù)庫(kù)管理系統(tǒng)的用戶名和口令。一般的大型數(shù)據(jù)庫(kù)如Oracle、MS SQL Server、DB2等用戶名和口令是必須的。而小型的數(shù)據(jù)庫(kù)如ACCESS、Foxpro等并不需要。
如果連接成功,則會(huì)返回一個(gè)Connection類的對(duì)象con。以后對(duì)數(shù)據(jù)庫(kù)的操作都是建立在con對(duì)象的基礎(chǔ)上的。GetConnection()方法是DriverManager類的靜態(tài)方法,使用時(shí)不用生成DriverManager類的對(duì)象,直接使用類名DriverManager就可以調(diào)用。
(3)創(chuàng)建Statement聲明,執(zhí)行SQL語(yǔ)句
在實(shí)例化一個(gè)Connection類的對(duì)象con,成功建立一個(gè)到數(shù)據(jù)庫(kù)管理系統(tǒng)的連接之后。我們要做的第三步是利用該con對(duì)象生成一個(gè)Statement類的對(duì)象stmt。該對(duì)象負(fù)責(zé)將SQL語(yǔ)句傳遞給數(shù)據(jù)庫(kù)管理系統(tǒng)執(zhí)行,如果SQL語(yǔ)句產(chǎn)生結(jié)果集,stmt對(duì)象還會(huì)將結(jié)果集返回給一個(gè)ResultSet類的對(duì)象。
Statement類的主要的方法有三個(gè):
executeUpdate(String sql)
executeQuery(String sql)
execute(String sql)
executeUpdate(String sql)方法用于執(zhí)行DDL類型的SQL語(yǔ)句,這種類型的SQL語(yǔ)句會(huì)對(duì)數(shù)據(jù)庫(kù)管理系統(tǒng)的對(duì)象進(jìn)行創(chuàng)建、修改、刪除操作,一般不會(huì)返回結(jié)果集。
executeQuery(String sql)方法用于執(zhí)行一條查詢數(shù)據(jù)庫(kù)的SELECT語(yǔ)句。如果有符合查詢條件的數(shù)據(jù)存在,該方法將返回一個(gè)包含相應(yīng)數(shù)據(jù)的ResultSet類對(duì)象,否則,該對(duì)象的next()方法將返回false。
execute(String sql)方法用于執(zhí)行一個(gè)可能返回多個(gè)結(jié)果集的存儲(chǔ)過(guò)程(Stored Procedure)或者一條動(dòng)態(tài)生成的不知道結(jié)果集個(gè)數(shù)的SQL語(yǔ)句。如果存儲(chǔ)過(guò)程或者SQL語(yǔ)句產(chǎn)生一個(gè)結(jié)果集,該方法返回false.如果產(chǎn)生多個(gè)結(jié)果集,該方法返回true。我們可以綜合運(yùn)用Statement類的getResultSet(), getUpdateCount(), getMoreResults()方法來(lái)檢索不同的結(jié)果集。
服務(wù)器對(duì)JSP程序進(jìn)行編譯時(shí),并不對(duì)將要執(zhí)行的SQL語(yǔ)句作語(yǔ)法檢查,只是將其作為一個(gè)String對(duì)象。只有當(dāng)客戶端發(fā)出HTTP請(qǐng)求,Java虛擬機(jī)對(duì)Servlet進(jìn)行解釋執(zhí)行,將SQL語(yǔ)句傳遞給數(shù)據(jù)庫(kù)管理系統(tǒng)時(shí),才能知道他是否正確。對(duì)于錯(cuò)誤的SQL語(yǔ)句,在執(zhí)行時(shí)會(huì)產(chǎn)生SQLExcepion。其實(shí),所有與JDBC操作的JSP語(yǔ)句都與數(shù)據(jù)庫(kù)管理系統(tǒng)及相應(yīng)的驅(qū)動(dòng)程序有關(guān),是超出JSP的控制范圍的。這些語(yǔ)句只有在實(shí)際的解釋執(zhí)行中才能檢驗(yàn)出是否能順利執(zhí)行,因此一定要聲明并捕獲例外:
try{
….
}catch(SQLException e)
{
Sytem.err.println(“SQLException:”+e.getMessage());
}
否則,JSP程序無(wú)法被編譯成Servlet。
(4)關(guān)閉Statement對(duì)象
一個(gè)Statement對(duì)象在打開(kāi)后可以多次調(diào)用executeQuery(String sql)、executeUpdate(String sql)、execute(String sql)方法來(lái)執(zhí)行SQL語(yǔ)句,與數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)行交互。但一個(gè)Statement對(duì)象在同一時(shí)間只能打開(kāi)一個(gè)結(jié)果集,對(duì)第二個(gè)結(jié)果集的打開(kāi)隱含著對(duì)第一個(gè)結(jié)果集的關(guān)閉。如果想對(duì)多個(gè)結(jié)果集同時(shí)進(jìn)行操作,必須創(chuàng)建多個(gè)Statement對(duì)象,在每個(gè)Statement對(duì)象上執(zhí)行SQL語(yǔ)句獲得相應(yīng)的結(jié)果集。
(5)關(guān)閉Connection對(duì)象
在處理完對(duì)數(shù)據(jù)庫(kù)的操作后,一定要將Connection對(duì)象關(guān)閉,以釋放JDBC占用的系統(tǒng)資源。在不關(guān)閉Connection對(duì)象的前提下再次用DriverManager靜態(tài)類初始化新的Connection對(duì)象會(huì)產(chǎn)生系統(tǒng)錯(cuò)誤。而一個(gè)已經(jīng)建立連接的Connection對(duì)象可以同時(shí)初始化多個(gè)Statement對(duì)象。對(duì)應(yīng)不同的數(shù)據(jù)庫(kù)管理系統(tǒng)的Connection對(duì)象可以初始化Statement對(duì)象的個(gè)數(shù)是不同的。在Oracle中是50個(gè)。