@Override
public int countGname(String gname) {
try {
Connection conn=DButils.getdataSourse();
PreparedStatement ps=conn.prepareStatement("select count(*) from goods where gname like ? ");
ps.setString(1, "%"+gname+"%");
ResultSet rs=ps.executeQuery();
if(rs.next()){
return rs.getInt(1);//1代表第一个问号。
}
// rs.next();
// return rs.getInt(1);//输出个数
return rs.getInt(1);
以上三种方法第三种直接输出是行不通的,其他都可以输出。可以把 ResultSet 理解为 带头结点的单向链表,初始时 指针 指向头结点,next() 方法就是用来将 指针 向后移动一个位置 —— 如果该位置有数据,那么 next() 返回 true,否则返回 false。一般在数据库操作中,我们把这个 “指针” 称作 “游标”。
所以,如果你不写 if (rs.next()),那么第一次使用 rs 也就没有调用 rs 的 next() 方法,那么此时游标就处于 “头结点” 的位置,但是 “头结点” 只是一个标识,是没有数据的,因而抛出了异常。
} catch (PropertyVetoException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public List<Goods> selectLimitGname(String ganme, int page, int prePagRows) {
List<Goods> list=new ArrayList<Goods>();
Goods g=null;
try {
Connection conn=DButils.getdataSourse();
int total=countGname(ganme.trim());//调用上一个方法得到满足条件的行数
int totalPage=(total+prePagRows-1)/prePagRows;//计算页数
//当total能整除时(total+prePagRows-1/prePagRows)取整等于total/prePagRows;
//当total不能整除时(total+prePagRows-1/prePagRows)取整相当于total/prePagRows+1;
System.out.println("根据"+ganme+"模糊查询");
System.out.println("数据量为:"+total);
System.out.println("总页数为:"+totalPage);
System.out.println("当前页为:"+page);
PreparedStatement ps=conn.prepareStatement("select*from goods where gname like ? limit ?,?");
ps.setString(1, "%"+ganme.trim()+"%");
ps.setInt(2, (page-1)*prePagRows);//起始行数 limit 5,5 从第6条开始显示5条数据 第一个参数默认从0开始的。
ps.setInt(3, prePagRows);
ResultSet rs=ps.executeQuery();
while(rs.next()){
g=new Goods();
g.setGid(rs.getInt(1));
g.setGname(rs.getString(2));
g.setPrice(rs.getDouble(3));
g.setQuantity(rs.getInt(4));
g.setStid(rs.getInt(5));
list.add(g);
}
return list;
} catch (PropertyVetoException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}