其中pstm为PreparedStatement类对象,整数1表示SQL语句中第1个“?”占位符,yxq为赋予该占位符的值。若name字段类型为整型,则应使用setInt()方法来赋值。
还可以使用setObject()方法,在无法判断字段类型的情况下进行赋值。doPstm()方法就应用了该setObject()方法进行赋值,代码如下。
例程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(); //调用getCon()方法获取数据库连接
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(); //执行SQL语句
}catch(SQLException e){
System.out.println("doPstm()方法出错!");
e.printStackTrace(); //输出错误信息
}
}
}
}
代码贴士
调用Connection对象的prepareStatement()方法获取PreparedStatement类对象pstm。参数sql为要执行的SQL语句;通过设置ResultSet.TYPE_SCROLL_INSENSITIVE与ResultSet.CONCUR_READ_ONLY两个参数,在查询数据库后,可获得可滚动的结果集。
调用PreparedStatement类对象的execute()方法执行SQL语句。该方法可执行任何类型的SQL语句,如查询、添加等。execute()方法返回的是boolean型值,若为true,则表示执行SQL语句后的结果中第一个结果为ResultSet对象;若为false,则表示第一个结果为更新数据库所影响的记录数或表示不存在任何结果。若第一个结果为ResultSet对象,可通过PreparedStatement类对象的getResultSet()方法返回;若第一个结果为更新数据库后所影响的记录数,可通过PreparedStatement类对象的getUpdateCount()方法返回。通过PreparedStatement类对象的getMoreResults()方法可指向下一个结果,若该结果为ResultSet对象,则返回true;否则,若该结果为更新数据库后所影响的记录数或不再有结果存在,则返回false。执行getMoreResults()方法后,会自动关闭之前通过getResultSet()方法获得的ResultSet对象。
(6)执行查询的SQL语句后,返回的结果是ResultSet结果集对象;执行更新的SQL语句,则返回影响的记录数。DB类中的doPstm()方法用来操作数据库,但其并没有返回值,那么在执行了上述两种SQL语句后,如何返回结果,可通过创建以下方法来实现。
创建返回ResultSet结果集对象的方法的代码如下:
例程06 代码位置:光盘\TM\01\src\com\yxq\dao\DB.java
public ResultSet getRs() throws SQLException{
return pstm.getResultSet(); //调用PreparedStatement类对象的getResultSet()方法返回ResultSet对象
}
创建返回执行更新的SQL语句后所影响的记录数的方法的代码如下:
例程07 代码位置:光盘\TM\01\src\com\yxq\dao\DB.java
public int getCount() throws SQLException{
return pstm.getUpdateCount(); //调用PreparedStatement类对象的getUpdateCount()方法返回影响的记录数
}
这样,在执行doPstm()方法操作数据库后,就可调用其中一个方法返回需要的值。例如:
mydb.doPstm(sql, null); //操作数据库
ResultSet rs=mydb.getRs(); //获取结果集对象
其中mydb为DB类的实例,sql为查询SQL语句。
1.5.2 业务处理类
OpDB类实现了处理本系统中由用户请求提出的所有业务的操作,如信息显示、信息发布、管理员登录、信息审核、信息删除等。几乎每一个用户请求的业务,在OpDB类中都对应着一个方法,具有相同性质的业务可在一个方法中实现。在这些方法中,通过调用DB类中的doPstm()方法来对数据库进行操作。
OpDB类中的方法与方法所处理的业务如表1.9所示。
1.OpGetListBox()方法
该方法用来获取所有的信息类别,以便实现前台页面中的导航菜单项与后台的“信息类别”下拉列表框中的选项。方法中首先调用DB类的doPstm()方法查询tb_type数据表中的所有记录,然后依次取出每条记录中的type_sign与type_intro字段内容,并分别作为TreeMap对象的key值与value值进行保存,最后返回该Map对象。OpGetListBox()方法的代码如下:
例程08 代码位置:光盘\TM\01\src\com\yxq\dao\OpDB.java
public TreeMap OpGetListBox(String sql,Object[] params){
TreeMap typeMap=new TreeMap(); //创建一个TreeMap对象
mydb.doPstm(sql, params); //调用DB类的doPstm()方法查询数据库
ResultSet rs=mydb.getRs(); //获取ResultSet结果集对象
if(rs!=null){
while(rs.next()){ //循环判断结果集中是否还存在记录
Integer sign=Integer.valueOf(rs.getInt("type_sign")); //获取当前记录中type_sign字段内容
String intro=rs.getString("type_intro"); //获取当前记录中type_intro字段内容
typeMap.put(sign,intro); //将获取的内容分别作为Map对象的key值与value值进行保存
}
rs.close(); //关闭结果集
} //while循环结束
return typeMap;
}
该方法在处理用户访问前台首页请求的Action类中被调用,在该Action类中将返回的TreeMap对象保存在session范围内,在请求返回JSP页面后,可通过Struts 2.0标签获取该TreeMap对象,实现导航菜单或下拉列表。
2.OpListShow()方法
OpListShow()方法用来实现具有列表显示信息功能的业务,例如搜索信息、查看某类别下的所有信息等。方法中首先调用DB类的doPstm()方法查询数据库,接着调用getRs()方法获取查询后的结果集,然后依次将结果集中的记录封装到InfoSingle类对象中,并将该对象保存到List集合中,最后返回该List集合对象。OpListShow()方法的关键代码如下:
例程09 代码位置:光盘\TM\01\src\com\yxq\dao\OpDB.java
public List OpListShow(String sql,Object[] params){
List onelist=new ArrayList();
mydb.doPstm(sql, params); //调用DB类的doPstm()方法查询数据库
ResultSet rs=mydb.getRs(); //获取ResultSet结果集对象
if(rs!=null){
while(rs.next()){
InfoSingle infoSingle=new InfoSingle(); //创建一个InfoSingle类对象
//以下代码将记录封装到infoSingle对象中
infoSingle.setId(rs.getInt("id"));
infoSingle.setInfoType(rs.getInt("info_type"));
……//省略了其他类似代码
onelist.add(infoSingle); //将infoSingle对象保存到List集合对象中
}
}
return onelist;
}
3.OpSingleShow()方法
该方法实现了查看信息详细内容的业务,如在前台查看某信息的详细内容、在后台进行信息审核与付费设置时用来显示被操作信息的详细内容。方法中首先查询数据库,获取指定条件的记录,然后将记录封装到InfoSingle类对象中,最后返回该对象。OpSingleShow()方法的关键代码如下:
例程10 代码位置:光盘\TM\01\src\com\yxq\dao\OpDB.java
public InfoSingle OpSingleShow(String sql,Object[] params){
InfoSingle infoSingle=null; //声明一个InfoSingle类对象
mydb.doPstm(sql, params); //调用DB类的doPstm()方法查询数据库
ResultSet rs=mydb.getRs(); //获取ResultSet结果集对象
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;
}