正文

都市供求信息網(wǎng)(8)

JSP項(xiàng)目開(kāi)發(fā)案例全程實(shí)錄(第2版) 作者:明日科技


其中pstm為PreparedStatement類對(duì)象,整數(shù)1表示SQL語(yǔ)句中第1個(gè)“?”占位符,yxq為賦予該占位符的值。若name字段類型為整型,則應(yīng)使用setInt()方法來(lái)賦值。

還可以使用setObject()方法,在無(wú)法判斷字段類型的情況下進(jìn)行賦值。doPstm()方法就應(yīng)用了該setObject()方法進(jìn)行賦值,代碼如下。

例程05 代碼位置:光盤(pán)\TM\01\src\com\yxq\dao\DB.java

public void doPstm(String sql,Object[] params){

if(sql!=null&&!sql.equals("")){

if(params==null)params=new Object[0];

getCon(); //調(diào)用getCon()方法獲取數(shù)據(jù)庫(kù)連接

if(con!=null){

try{

pstm=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY);

for(int i=0;i<params.length;i++){

pstm.setObject(i+1,params[i]);

}

pstm.execute(); //執(zhí)行SQL語(yǔ)句

}catch(SQLException e){

System.out.println("doPstm()方法出錯(cuò)!");

e.printStackTrace(); //輸出錯(cuò)誤信息

}

}

}

}

代碼貼士

調(diào)用Connection對(duì)象的prepareStatement()方法獲取PreparedStatement類對(duì)象pstm。參數(shù)sql為要執(zhí)行的SQL語(yǔ)句;通過(guò)設(shè)置ResultSet.TYPE_SCROLL_INSENSITIVE與ResultSet.CONCUR_READ_ONLY兩個(gè)參數(shù),在查詢數(shù)據(jù)庫(kù)后,可獲得可滾動(dòng)的結(jié)果集。

調(diào)用PreparedStatement類對(duì)象的execute()方法執(zhí)行SQL語(yǔ)句。該方法可執(zhí)行任何類型的SQL語(yǔ)句,如查詢、添加等。execute()方法返回的是boolean型值,若為true,則表示執(zhí)行SQL語(yǔ)句后的結(jié)果中第一個(gè)結(jié)果為ResultSet對(duì)象;若為false,則表示第一個(gè)結(jié)果為更新數(shù)據(jù)庫(kù)所影響的記錄數(shù)或表示不存在任何結(jié)果。若第一個(gè)結(jié)果為ResultSet對(duì)象,可通過(guò)PreparedStatement類對(duì)象的getResultSet()方法返回;若第一個(gè)結(jié)果為更新數(shù)據(jù)庫(kù)后所影響的記錄數(shù),可通過(guò)PreparedStatement類對(duì)象的getUpdateCount()方法返回。通過(guò)PreparedStatement類對(duì)象的getMoreResults()方法可指向下一個(gè)結(jié)果,若該結(jié)果為ResultSet對(duì)象,則返回true;否則,若該結(jié)果為更新數(shù)據(jù)庫(kù)后所影響的記錄數(shù)或不再有結(jié)果存在,則返回false。執(zhí)行g(shù)etMoreResults()方法后,會(huì)自動(dòng)關(guān)閉之前通過(guò)getResultSet()方法獲得的ResultSet對(duì)象。

(6)執(zhí)行查詢的SQL語(yǔ)句后,返回的結(jié)果是ResultSet結(jié)果集對(duì)象;執(zhí)行更新的SQL語(yǔ)句,則返回影響的記錄數(shù)。DB類中的doPstm()方法用來(lái)操作數(shù)據(jù)庫(kù),但其并沒(méi)有返回值,那么在執(zhí)行了上述兩種SQL語(yǔ)句后,如何返回結(jié)果,可通過(guò)創(chuàng)建以下方法來(lái)實(shí)現(xiàn)。

創(chuàng)建返回ResultSet結(jié)果集對(duì)象的方法的代碼如下:

例程06 代碼位置:光盤(pán)\TM\01\src\com\yxq\dao\DB.java

public ResultSet getRs() throws SQLException{

return pstm.getResultSet(); //調(diào)用PreparedStatement類對(duì)象的getResultSet()方法返回ResultSet對(duì)象

}

創(chuàng)建返回執(zhí)行更新的SQL語(yǔ)句后所影響的記錄數(shù)的方法的代碼如下:

例程07 代碼位置:光盤(pán)\TM\01\src\com\yxq\dao\DB.java

public int getCount() throws SQLException{

return pstm.getUpdateCount(); //調(diào)用PreparedStatement類對(duì)象的getUpdateCount()方法返回影響的記錄數(shù)

}

這樣,在執(zhí)行doPstm()方法操作數(shù)據(jù)庫(kù)后,就可調(diào)用其中一個(gè)方法返回需要的值。例如:

mydb.doPstm(sql, null); //操作數(shù)據(jù)庫(kù)

ResultSet rs=mydb.getRs(); //獲取結(jié)果集對(duì)象

其中mydb為DB類的實(shí)例,sql為查詢SQL語(yǔ)句。

1.5.2 業(yè)務(wù)處理類

OpDB類實(shí)現(xiàn)了處理本系統(tǒng)中由用戶請(qǐng)求提出的所有業(yè)務(wù)的操作,如信息顯示、信息發(fā)布、管理員登錄、信息審核、信息刪除等。幾乎每一個(gè)用戶請(qǐng)求的業(yè)務(wù),在OpDB類中都對(duì)應(yīng)著一個(gè)方法,具有相同性質(zhì)的業(yè)務(wù)可在一個(gè)方法中實(shí)現(xiàn)。在這些方法中,通過(guò)調(diào)用DB類中的doPstm()方法來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。

OpDB類中的方法與方法所處理的業(yè)務(wù)如表1.9所示。

1.OpGetListBox()方法

該方法用來(lái)獲取所有的信息類別,以便實(shí)現(xiàn)前臺(tái)頁(yè)面中的導(dǎo)航菜單項(xiàng)與后臺(tái)的“信息類別”下拉列表框中的選項(xiàng)。方法中首先調(diào)用DB類的doPstm()方法查詢tb_type數(shù)據(jù)表中的所有記錄,然后依次取出每條記錄中的type_sign與type_intro字段內(nèi)容,并分別作為T(mén)reeMap對(duì)象的key值與value值進(jìn)行保存,最后返回該Map對(duì)象。OpGetListBox()方法的代碼如下:

例程08 代碼位置:光盤(pán)\TM\01\src\com\yxq\dao\OpDB.java

public TreeMap OpGetListBox(String sql,Object[] params){

TreeMap typeMap=new TreeMap(); //創(chuàng)建一個(gè)TreeMap對(duì)象

mydb.doPstm(sql, params); //調(diào)用DB類的doPstm()方法查詢數(shù)據(jù)庫(kù)

ResultSet rs=mydb.getRs(); //獲取ResultSet結(jié)果集對(duì)象

if(rs!=null){

while(rs.next()){ //循環(huán)判斷結(jié)果集中是否還存在記錄

Integer sign=Integer.valueOf(rs.getInt("type_sign")); //獲取當(dāng)前記錄中type_sign字段內(nèi)容

String intro=rs.getString("type_intro"); //獲取當(dāng)前記錄中type_intro字段內(nèi)容

typeMap.put(sign,intro); //將獲取的內(nèi)容分別作為Map對(duì)象的key值與value值進(jìn)行保存

}

rs.close(); //關(guān)閉結(jié)果集

} //while循環(huán)結(jié)束

return typeMap;

}

該方法在處理用戶訪問(wèn)前臺(tái)首頁(yè)請(qǐng)求的Action類中被調(diào)用,在該Action類中將返回的TreeMap對(duì)象保存在session范圍內(nèi),在請(qǐng)求返回JSP頁(yè)面后,可通過(guò)Struts 2.0標(biāo)簽獲取該TreeMap對(duì)象,實(shí)現(xiàn)導(dǎo)航菜單或下拉列表。

2.OpListShow()方法

OpListShow()方法用來(lái)實(shí)現(xiàn)具有列表顯示信息功能的業(yè)務(wù),例如搜索信息、查看某類別下的所有信息等。方法中首先調(diào)用DB類的doPstm()方法查詢數(shù)據(jù)庫(kù),接著調(diào)用getRs()方法獲取查詢后的結(jié)果集,然后依次將結(jié)果集中的記錄封裝到InfoSingle類對(duì)象中,并將該對(duì)象保存到List集合中,最后返回該List集合對(duì)象。OpListShow()方法的關(guān)鍵代碼如下:

例程09 代碼位置:光盤(pán)\TM\01\src\com\yxq\dao\OpDB.java

public List OpListShow(String sql,Object[] params){

List onelist=new ArrayList();

mydb.doPstm(sql, params); //調(diào)用DB類的doPstm()方法查詢數(shù)據(jù)庫(kù)

ResultSet rs=mydb.getRs(); //獲取ResultSet結(jié)果集對(duì)象

if(rs!=null){

while(rs.next()){

InfoSingle infoSingle=new InfoSingle(); //創(chuàng)建一個(gè)InfoSingle類對(duì)象

//以下代碼將記錄封裝到infoSingle對(duì)象中

infoSingle.setId(rs.getInt("id"));

infoSingle.setInfoType(rs.getInt("info_type"));

……//省略了其他類似代碼

onelist.add(infoSingle); //將infoSingle對(duì)象保存到List集合對(duì)象中

}

}

return onelist;

}

3.OpSingleShow()方法

該方法實(shí)現(xiàn)了查看信息詳細(xì)內(nèi)容的業(yè)務(wù),如在前臺(tái)查看某信息的詳細(xì)內(nèi)容、在后臺(tái)進(jìn)行信息審核與付費(fèi)設(shè)置時(shí)用來(lái)顯示被操作信息的詳細(xì)內(nèi)容。方法中首先查詢數(shù)據(jù)庫(kù),獲取指定條件的記錄,然后將記錄封裝到InfoSingle類對(duì)象中,最后返回該對(duì)象。OpSingleShow()方法的關(guān)鍵代碼如下:

例程10 代碼位置:光盤(pán)\TM\01\src\com\yxq\dao\OpDB.java

public InfoSingle OpSingleShow(String sql,Object[] params){

InfoSingle infoSingle=null; //聲明一個(gè)InfoSingle類對(duì)象

mydb.doPstm(sql, params); //調(diào)用DB類的doPstm()方法查詢數(shù)據(jù)庫(kù)

ResultSet rs=mydb.getRs(); //獲取ResultSet結(jié)果集對(duì)象

if(rs!=null&&rs.next()){ //如果rs不為null,并且存在記錄

infoSingle=new InfoSingle(); //實(shí)例化InfoSingle對(duì)象

infoSingle.setId(rs.getInt("id"));

infoSingle.setInfoType(rs.getInt("info_type"));

…… //省略了其他類似代碼

rs.close();

}

return infoSingle;

}


上一章目錄下一章

Copyright ? 讀書(shū)網(wǎng) m.ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)