明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

用JDBC訪問(wèn)一個(gè)數(shù)據(jù)庫(kù)

[摘要]發(fā)布者:flyfox 在這個(gè)練習(xí)里你將學(xué)習(xí)使用JDBC訪問(wèn)數(shù)據(jù)庫(kù)和插入一個(gè)記錄到數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)。 在這個(gè)練習(xí)里,你將寫RegistrationServlet類的register方法。這個(gè)類和你在Servlet1A練習(xí)里用的一樣。在這個(gè)練習(xí)里,你將使用數(shù)據(jù)庫(kù)的功能。這個(gè)練習(xí)將展示實(shí)現(xiàn)用戶需求的步驟...
發(fā)布者:flyfox

在這個(gè)練習(xí)里你將學(xué)習(xí)使用JDBC訪問(wèn)數(shù)據(jù)庫(kù)和插入一個(gè)記錄到數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí)。

在這個(gè)練習(xí)里,你將寫RegistrationServlet類的register方法。這個(gè)類和你在Servlet1A練習(xí)里用的一樣。在這個(gè)練習(xí)里,你將使用數(shù)據(jù)庫(kù)的功能。這個(gè)練習(xí)將展示實(shí)現(xiàn)用戶需求的步驟。

第一部分:理解regsiter()方法在RegistrationServlet中的工作原理

在這個(gè)練習(xí)里,你將在com.ibm.waslab.JDBC包上工作。擴(kuò)展RegistrationServlet類,理解register()。這個(gè)方法拋一個(gè)SQLException。完整的方法聲明是:

public synchronized void register(Properties formInput)

throws SQLException{



}

register()方法在servlet取得控制時(shí)從doPost()方法里被調(diào)用。register()方法實(shí)際上寫一個(gè)新的記錄到數(shù)據(jù)庫(kù)。我們將在第二部分寫register()方法。同時(shí),我們需要確信一些設(shè)置步驟已經(jīng)完成。

1.打開(kāi)init()方法,在super.init()的調(diào)用后面輸入以下的代碼:

//Load JDBC driver for DB2

try

{

Class.forName(JKToysDBInfo.gerDriver());

}

catch (ClassNotFoundException e)

{

erroLog(“JDBC Driver not found”+e);

}



保存init()方法。記住,在驅(qū)動(dòng)器管理可以得到一個(gè)連接以前,一個(gè)正確的數(shù)據(jù)庫(kù)驅(qū)動(dòng)器必須被servlet裝載。每一個(gè)servlet只在servlet的init()方法里作一次。這個(gè)方法并不真地建立一個(gè)連接,它只是允許連接被建立。



注意:在這個(gè)情況下,我們裝載DB2 app驅(qū)動(dòng)器。這個(gè)驅(qū)動(dòng)器是在數(shù)據(jù)庫(kù)裝在servlet將要運(yùn)行的同一臺(tái)機(jī)器上時(shí)使用的。如果你在訪問(wèn)另一臺(tái)機(jī)器上的數(shù)據(jù)庫(kù),你要使用net驅(qū)動(dòng)器:

COM.ibm.db2.jdbc.net.DB2Driver

當(dāng)用net驅(qū)動(dòng)器得到一個(gè)連接,你需要在getConnection()里使用的URL里提供更多的信息。數(shù)據(jù)庫(kù)所在的機(jī)器名或URL,和DB2 Java Gateway偵聽(tīng)的端口號(hào)。一個(gè)有效的URL參數(shù)看上去是這樣的:

jdbc:db2://servrid:8888/databasename

第二部分

1.現(xiàn)在,回去,重新打開(kāi)register()方法。代碼的第一行創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)連接:

Connection conn=DriverManager.getConnection(URL,USER,PASSWORD);

你用驅(qū)動(dòng)器管理器的靜態(tài)方法getConnection(),把數(shù)據(jù)庫(kù)的URL,一個(gè)有效的用戶ID和口令傳遞給它。url,userid和password在類被裝載時(shí)從一個(gè)屬性文件里得到(看靜態(tài)變量聲明)。

2.現(xiàn)在到了有挑戰(zhàn)性的部分了。我們要作的第一件事是找到已經(jīng)被分配掉的最后一個(gè)客戶號(hào)碼,這樣我們可以分配給正在注冊(cè)的新客戶一個(gè)新的客戶號(hào)碼(比以前的最高的還要高)。我們要存儲(chǔ)這個(gè)新的客戶號(hào)碼在一個(gè)int變量名為nextId。為了做到這個(gè),你會(huì)需要確信使用Statement類和ResultSet類。以下的SQL;

“SELECT MAX(CUSTNO) FORM”+DBOWNER+”.CUSTOMER”

將允許你獲得當(dāng)前最高的客戶號(hào)。試試自己寫這個(gè)代碼,基于課程筆記的例子。如果你需要幫助,看答案頁(yè)。

3.接著你將用一個(gè)prepared statement對(duì)象來(lái)把客戶屬性對(duì)象里的信息插入數(shù)據(jù)庫(kù)。輸入以下的行:

//Insert record in the database

PreparedStatement insertStatement=

conn.prepareStatement(“INSERT INTO”+DBOWNER+”.CUSTOMER(FNAME,LNAME,ADDR,CITY,STATE,AGE,ZIP,CUSTNO)”+”VALUES(?,?,?,?,?,?,?,?)”);

上面的行要求連接創(chuàng)建一個(gè)prepared statement對(duì)象叫insertStatement。SQL語(yǔ)句作為參數(shù)被傳遞。數(shù)據(jù)庫(kù)行的每一列的值用問(wèn)號(hào)代表。每一個(gè)問(wèn)號(hào)必須被一個(gè)正確類型的值代替。輸入以下行:

insertStatement.setString(1,formInput.getProperty(“FNAME”));

insertStatement.setString(2,formInput.getProperty(“LNAME”));

insertStatement.setString(3,formInput.getProperty(“ADDR”));

insertStatement.setString(4,formInput.getProperty(“CITY”));

insertStatement.setString(5,formInput.getProperty(“STATE”));

insertStatement.setString(6,formInput.getProperty(“AGE”));

insertStatement.setString(7,formInput.getProperty(“ZIP”));

insertStatement.setInt(8,nextId);

4.insertStatement執(zhí)行對(duì)數(shù)據(jù)庫(kù)的更新。輸入下面兩行:

insertStatement.executeUpdate();

如果有錯(cuò)誤出現(xiàn)在創(chuàng)建連接時(shí),語(yǔ)句或訪問(wèn)數(shù)據(jù)庫(kù),這個(gè)方法會(huì)拋出一個(gè)SQLException。

5.最后你需要存儲(chǔ)客戶號(hào)碼到formInput屬性對(duì)象。輸入下面行:

formInput.put(“CUSTNO”,new Integer(nextId).toString());

6.保存方法。應(yīng)該沒(méi)有錯(cuò)誤。

7.接著你將需要為JKRegister servlet編輯WebSphere配置文件。(編輯”[x:]\IBMVJava\ide\project_resources\IBM WebSphere Test Environment\properties\server\servlet\servletservice\serrvlets.properties”.)

改變看上去這樣的行:

servlet.JKRegister.code=com.ibm.waslab.servlet1.RegistrationServlet

為這樣:

servlet.JKRegister,code=com.ibm.waslab.JDBC.RegistrationServlet

8.如果你的webserver在運(yùn)行,關(guān)掉它。在VAJ,啟動(dòng)SERunner。打開(kāi)你的web瀏覽器,到JK Toys網(wǎng)站的注冊(cè)頁(yè)面。在表格里輸入注冊(cè)信息,按注冊(cè)按鈕。你的新的servlet將被調(diào)用。登錄進(jìn)JKToys站點(diǎn)確信注冊(cè)已經(jīng)發(fā)生。你的新的客戶號(hào)碼應(yīng)該能在數(shù)據(jù)庫(kù)找到。



在這個(gè)練習(xí)你作了什么

在這個(gè)練習(xí),你編寫了Registration Servlet的register方法。這個(gè)方法用JDBC來(lái)創(chuàng)建一個(gè)新的客戶號(hào)碼,注冊(cè)一個(gè)新的客戶到數(shù)據(jù)庫(kù),F(xiàn)在你有了在你的servlets里訪問(wèn)數(shù)據(jù)庫(kù)的基本知識(shí)。



答案

以下的代碼創(chuàng)建一個(gè)SQL語(yǔ)句,執(zhí)行在前一頁(yè)里定義的SQL查詢。



//Get next customer number

Statement sqlStatement=conn.createStatement();

ResultSet result=sqlStatement.executeQuery(“SELECT MAX(CUSTNO) FROM”+DBOWNER+”.CUSTOMER”);

查詢的結(jié)果被放在ResultSet對(duì)象叫result里面。結(jié)果的集合包含一個(gè)游標(biāo),最初指向返回的第一行前面。為了得到查詢的值游標(biāo)必須用next()往前移動(dòng)。用這個(gè)方法,游標(biāo)只能向前移動(dòng)。下面幾行移動(dòng)游標(biāo)到返回的值,增加1。

int nextId=0;

if(result.next()= =true)

{

nextId=result.getInt(1)+1;

}

if檢查確定是否有行被返回。如果沒(méi)有,結(jié)果為false。我們不處理錯(cuò)誤的情況,但是它可以簡(jiǎn)單地用把nextId設(shè)置為1來(lái)處理。我們還可以用ResultSet的方法getInt(String),列的名字為”CUSTNO”,但是因?yàn)槲覀冎乐挥幸涣袝?huì)被返回,我們選擇用getInt(int)..