其中pstm為PreparedStatement類對象,整數(shù)1表示SQL語句中第1個“?”占位符,yxq為賦予該占位符的值。若name字段類型為整型,則應(yīng)使用setInt()方法來賦值。
還可以使用setObject()方法,在無法判斷字段類型的情況下進(jìn)行賦值。doPstm()方法就應(yīng)用了該setObject()方法進(jìn)行賦值,代碼如下。
例程05 代碼位置:光盤\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ù)庫連接
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語句
}catch(SQLException e){
System.out.println("doPstm()方法出錯!");
e.printStackTrace(); //輸出錯誤信息
}
}
}
}
代碼貼士
調(diào)用Connection對象的prepareStatement()方法獲取PreparedStatement類對象pstm。參數(shù)sql為要執(zhí)行的SQL語句;通過設(shè)置ResultSet.TYPE_SCROLL_INSENSITIVE與ResultSet.CONCUR_READ_ONLY兩個參數(shù),在查詢數(shù)據(jù)庫后,可獲得可滾動的結(jié)果集。
調(diào)用PreparedStatement類對象的execute()方法執(zhí)行SQL語句。該方法可執(zhí)行任何類型的SQL語句,如查詢、添加等。execute()方法返回的是boolean型值,若為true,則表示執(zhí)行SQL語句后的結(jié)果中第一個結(jié)果為ResultSet對象;若為false,則表示第一個結(jié)果為更新數(shù)據(jù)庫所影響的記錄數(shù)或表示不存在任何結(jié)果。若第一個結(jié)果為ResultSet對象,可通過PreparedStatement類對象的getResultSet()方法返回;若第一個結(jié)果為更新數(shù)據(jù)庫后所影響的記錄數(shù),可通過PreparedStatement類對象的getUpdateCount()方法返回。通過PreparedStatement類對象的getMoreResults()方法可指向下一個結(jié)果,若該結(jié)果為ResultSet對象,則返回true;否則,若該結(jié)果為更新數(shù)據(jù)庫后所影響的記錄數(shù)或不再有結(jié)果存在,則返回false。執(zhí)行g(shù)etMoreResults()方法后,會自動關(guān)閉之前通過getResultSet()方法獲得的ResultSet對象。
(6)執(zhí)行查詢的SQL語句后,返回的結(jié)果是ResultSet結(jié)果集對象;執(zhí)行更新的SQL語句,則返回影響的記錄數(shù)。DB類中的doPstm()方法用來操作數(shù)據(jù)庫,但其并沒有返回值,那么在執(zhí)行了上述兩種SQL語句后,如何返回結(jié)果,可通過創(chuàng)建以下方法來實現(xiàn)。
創(chuàng)建返回ResultSet結(jié)果集對象的方法的代碼如下:
例程06 代碼位置:光盤\TM\01\src\com\yxq\dao\DB.java
public ResultSet getRs() throws SQLException{
return pstm.getResultSet(); //調(diào)用PreparedStatement類對象的getResultSet()方法返回ResultSet對象
}
創(chuàng)建返回執(zhí)行更新的SQL語句后所影響的記錄數(shù)的方法的代碼如下:
例程07 代碼位置:光盤\TM\01\src\com\yxq\dao\DB.java
public int getCount() throws SQLException{
return pstm.getUpdateCount(); //調(diào)用PreparedStatement類對象的getUpdateCount()方法返回影響的記錄數(shù)
}
這樣,在執(zhí)行doPstm()方法操作數(shù)據(jù)庫后,就可調(diào)用其中一個方法返回需要的值。例如:
mydb.doPstm(sql, null); //操作數(shù)據(jù)庫
ResultSet rs=mydb.getRs(); //獲取結(jié)果集對象
其中mydb為DB類的實例,sql為查詢SQL語句。
1.5.2 業(yè)務(wù)處理類
OpDB類實現(xiàn)了處理本系統(tǒng)中由用戶請求提出的所有業(yè)務(wù)的操作,如信息顯示、信息發(fā)布、管理員登錄、信息審核、信息刪除等。幾乎每一個用戶請求的業(yè)務(wù),在OpDB類中都對應(yīng)著一個方法,具有相同性質(zhì)的業(yè)務(wù)可在一個方法中實現(xiàn)。在這些方法中,通過調(diào)用DB類中的doPstm()方法來對數(shù)據(jù)庫進(jìn)行操作。
OpDB類中的方法與方法所處理的業(yè)務(wù)如表1.9所示。
1.OpGetListBox()方法
該方法用來獲取所有的信息類別,以便實現(xiàn)前臺頁面中的導(dǎo)航菜單項與后臺的“信息類別”下拉列表框中的選項。方法中首先調(diào)用DB類的doPstm()方法查詢tb_type數(shù)據(jù)表中的所有記錄,然后依次取出每條記錄中的type_sign與type_intro字段內(nèi)容,并分別作為TreeMap對象的key值與value值進(jìn)行保存,最后返回該Map對象。OpGetListBox()方法的代碼如下:
例程08 代碼位置:光盤\TM\01\src\com\yxq\dao\OpDB.java
public TreeMap OpGetListBox(String sql,Object[] params){
TreeMap typeMap=new TreeMap(); //創(chuàng)建一個TreeMap對象
mydb.doPstm(sql, params); //調(diào)用DB類的doPstm()方法查詢數(shù)據(jù)庫
ResultSet rs=mydb.getRs(); //獲取ResultSet結(jié)果集對象
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對象的key值與value值進(jìn)行保存
}
rs.close(); //關(guān)閉結(jié)果集
} //while循環(huán)結(jié)束
return typeMap;
}
該方法在處理用戶訪問前臺首頁請求的Action類中被調(diào)用,在該Action類中將返回的TreeMap對象保存在session范圍內(nèi),在請求返回JSP頁面后,可通過Struts 2.0標(biāo)簽獲取該TreeMap對象,實現(xiàn)導(dǎo)航菜單或下拉列表。
2.OpListShow()方法
OpListShow()方法用來實現(xiàn)具有列表顯示信息功能的業(yè)務(wù),例如搜索信息、查看某類別下的所有信息等。方法中首先調(diào)用DB類的doPstm()方法查詢數(shù)據(jù)庫,接著調(diào)用getRs()方法獲取查詢后的結(jié)果集,然后依次將結(jié)果集中的記錄封裝到InfoSingle類對象中,并將該對象保存到List集合中,最后返回該List集合對象。OpListShow()方法的關(guān)鍵代碼如下:
例程09 代碼位置:光盤\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ù)庫
ResultSet rs=mydb.getRs(); //獲取ResultSet結(jié)果集對象
if(rs!=null){
while(rs.next()){
InfoSingle infoSingle=new InfoSingle(); //創(chuàng)建一個InfoSingle類對象
//以下代碼將記錄封裝到infoSingle對象中
infoSingle.setId(rs.getInt("id"));
infoSingle.setInfoType(rs.getInt("info_type"));
……//省略了其他類似代碼
onelist.add(infoSingle); //將infoSingle對象保存到List集合對象中
}
}
return onelist;
}
3.OpSingleShow()方法
該方法實現(xiàn)了查看信息詳細(xì)內(nèi)容的業(yè)務(wù),如在前臺查看某信息的詳細(xì)內(nèi)容、在后臺進(jìn)行信息審核與付費設(shè)置時用來顯示被操作信息的詳細(xì)內(nèi)容。方法中首先查詢數(shù)據(jù)庫,獲取指定條件的記錄,然后將記錄封裝到InfoSingle類對象中,最后返回該對象。OpSingleShow()方法的關(guān)鍵代碼如下:
例程10 代碼位置:光盤\TM\01\src\com\yxq\dao\OpDB.java
public InfoSingle OpSingleShow(String sql,Object[] params){
InfoSingle infoSingle=null; //聲明一個InfoSingle類對象
mydb.doPstm(sql, params); //調(diào)用DB類的doPstm()方法查詢數(shù)據(jù)庫
ResultSet rs=mydb.getRs(); //獲取ResultSet結(jié)果集對象
if(rs!=null&&rs.next()){ //如果rs不為null,并且存在記錄
infoSingle=new InfoSingle(); //實例化InfoSingle對象
infoSingle.setId(rs.getInt("id"));
infoSingle.setInfoType(rs.getInt("info_type"));
…… //省略了其他類似代碼
rs.close();
}
return infoSingle;
}