设计描述:我想在从数据库中的一张表中读取记录。并且在每条记录前增加一个复选框,以求能够被选择(逻辑删除)的效果。如图:在JavaBean中使用for循环。在每条记录的最前方一个单元格(<td></td>)里输出一个复选框。使用if判断语句rowSet.next()布尔类型。问题也就出在这里:如果用next()方法,游标就会从表中的第二条记录读起,造成输出的记录少了第一条。请问这个问题怎样解决?表test结构:mysql> desc test;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| del | enum('N','Y') | YES | | N | |
| id | int(10) | NO | PRI | 0 | |
| cname | varchar(20) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)JavaBean文件部分内容:
ShowRecordByPage.java
...
.....
.......
CachedRowSetImpl rowSet; //用于存储ResultSet对象.
.......
....
..
for(int i=1;i<=pageSize;i++)
{ str.append("<tr>");
if(rowSet.next()){
str.append("<td><input type='checkbox' name='checkbox' value='checkbox'>");
str.append("</td>");
for(int k=1;k<=fieldnum;k++)
{
str.append("<td>"+rowSet.getString(k)+"</td>");
}
str.append("</tr>");}
}
............
.....
..JSP页面部分代码:
showByPages.jsp.....
<Table border=1>
<tr>
<th><input type='checkbox' name='checkbox' value='checkbox'></th><th>默认状态</th><th>客户ID</th><th>客户名</th> //这里的这个复选框也就是表格里最左上角那个单元格里的复选框,没有用for循环控制输出.将来用JS脚本控制全选/不选
<jsp:getProperty name= "look" property="presentPageResult"/> //获取表中记录。
</tr>
</Table>
......
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| del | enum('N','Y') | YES | | N | |
| id | int(10) | NO | PRI | 0 | |
| cname | varchar(20) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)JavaBean文件部分内容:
ShowRecordByPage.java
...
.....
.......
CachedRowSetImpl rowSet; //用于存储ResultSet对象.
.......
....
..
for(int i=1;i<=pageSize;i++)
{ str.append("<tr>");
if(rowSet.next()){
str.append("<td><input type='checkbox' name='checkbox' value='checkbox'>");
str.append("</td>");
for(int k=1;k<=fieldnum;k++)
{
str.append("<td>"+rowSet.getString(k)+"</td>");
}
str.append("</tr>");}
}
............
.....
..JSP页面部分代码:
showByPages.jsp.....
<Table border=1>
<tr>
<th><input type='checkbox' name='checkbox' value='checkbox'></th><th>默认状态</th><th>客户ID</th><th>客户名</th> //这里的这个复选框也就是表格里最左上角那个单元格里的复选框,没有用for循环控制输出.将来用JS脚本控制全选/不选
<jsp:getProperty name= "look" property="presentPageResult"/> //获取表中记录。
</tr>
</Table>
......
{
if(rowSet.next()){
str.append(" <tr>");
str.append(" <td> <input type='checkbox' name='checkbox' value='checkbox'>");
str.append(" </td>");
for(int k=1;k <=fieldnum;k++)
{
str.append(" <td>"+rowSet.getString(k)+" </td>");
}
str.append(" </tr>");}
} 如果不行就用可滚动纪录集吧
解决方案1:请lz仔细检查程序,rs游标默认应该是在表的第一行之前,如果rs.next();肯定会走到第一条,由于lz说他走到了第2条,证明lz之前已经有个语句让游标向下移动了一个位置了,请仔细减产,我原先就是犯了这个错误.
解决方案2:调用这个方法:rs.relative(-1),让游标向前走一行,这样就ok了
同意楼上说法,不是rs的问题记得用rs.next();判断的话好像是会前进一条,建议直接用while(rs.next();)循环
rowSet.next()从第二条记录开始输出,一直到最后的那条记录。结果少了一条(第一条)记录。离线结果集类CachedRowSetImpl继承了滚动记录集类ResultSet里的所有方法!~
[rs游标默认应该是在表的第一行之前,如果rs.next();肯定会走到第一条,由于lz说他走到了第2条,证明lz之前已经有个语句让游标向下移动了一个位置了]
楼主贴出全部代码来看看
人回答你的问题。package database.operation;
import java.sql.*;
import com.sun.rowset.CachedRowSetImpl;
public class ShowRecordByPage
{ int pageSize=0; //每页显示的记录数
int pageAllCount=0; //分页后的总页数
int showPage=1 ; //当前显示页
StringBuffer presentPageResult; //显示当前页内容
CachedRowSetImpl rowSet; //用于存储ResultSet对象
String databaseName=""; //数据库名称
String tableName=""; //表的名字
String user="" ; //用户
String password="" ; //密码
String field[]=new String[100] ; //field字段
int fieldnum=0;
public ShowRecordByPage()
{ presentPageResult=new StringBuffer();
try{ Class.forName("com.mysql.jdbc.Driver").newInstance();
}
catch(Exception e){
System.out.println("加载驱动失败!~"+e);}
}
public void setPageSize(int size)
{ pageSize=size;
fieldnum=0;
String uri="jdbc:mysql://localhost:3306/deltest?useUnicode=true&characterEncoding=EUC_CN";
try{ Connection con=DriverManager.getConnection(uri,user,password);
DatabaseMetaData metadata=con.getMetaData();
ResultSet rs1=metadata.getColumns(null,null,tableName,null);
int k=0;
while(rs1.next())
{ fieldnum++;
field[k]=rs1.getString(4); //获取字段的名字
k++;
}
Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs=sql.executeQuery("SELECT * FROM test");
rowSet=new CachedRowSetImpl(); //创建行集对象
rowSet.populate(rs);
con.close(); //关闭连接
rowSet.last();
int m=rowSet.getRow(); //总行数
int n=pageSize;
pageAllCount=((m%n)==0)?(m/n):(m/n+1);
}
catch(Exception exp){}
}
public int getPageSize()
{ return pageSize;
}
public int getPageAllCount()
{ return pageAllCount;
}
public void setShowPage(int n)
{ showPage=n;
}
public int getShowPage()
{ return showPage;
}
public StringBuffer getPresentPageResult()
{ if(showPage>pageAllCount)
showPage=1;
if(showPage<=0)
showPage=pageAllCount;
presentPageResult=show(showPage);
return presentPageResult;
}
public StringBuffer show(int page)
{ StringBuffer str=new StringBuffer(); try{ rowSet.absolute((page-1)*pageSize+1);
for(int i=1;i<=pageSize;i++)
{ str.append("<tr>");
if(rowSet.next()){
str.append("<td><input type='checkbox' name='checkbox' value='checkbox'>");
str.append("</td>");
for(int k=1;k<=fieldnum;k++)
{
str.append("<td>"+rowSet.getString(k)+"</td>");
}
str.append("</tr>");}
}
}
catch(SQLException exp){}
return str;
}
public void setDatabaseName(String s)
{ databaseName=s.trim();
}
public String getDatabaseName()
{ return databaseName;
}
public void setTableName(String s)
{ tableName=s.trim();
}
public String getTableName()
{ return tableName;
}
public void setPassword(String s)
{ password=s.trim();;
}
public void setUser(String s)
{ user=s.trim();
}
public String getUser()
{ return user;
}
}
{ StringBuffer str=new StringBuffer(); try{ rowSet.absolute((page-1)*pageSize+1);
for(int i=1;i<=pageSize;i++)
{ str.append("<tr>");
if(!rowSet.isAfterLast()){
str.append("<td><input type='checkbox' name='checkbox' value='checkbox'>");
str.append("</td>");
for(int k=1;k<=fieldnum;k++)
{
str.append("<td>"+rowSet.getString(k)+"</td>");
}
str.append("</tr>");} rowSet.next();
}
}
catch(SQLException exp){}
return str;
}试试
{ StringBuffer str=new StringBuffer(); try{ rowSet.absolute((page-1)*pageSize+1);
for(int i=1;i<=pageSize;i++)
{ str.append("<tr>");
if(!rowSet.isAfterLast()){
str.append("<td><input type='checkbox' name='checkbox' value='checkbox'>");
str.append("</td>");
for(int k=1;k<=fieldnum;k++)
{
str.append("<td>"+rowSet.getString(k)+"</td>");
}
str.append("</tr>");
rowSet.next();
}
}
}
catch(SQLException exp){}
return str;
}
如果传进来的page=1,游标定位到第一行,敢问在用rowSet.next()的时候是第几行?是不是应该在这句的后面加上一句让游标向上移动一行
public StringBuffer show(int page){
StringBuffer str=new StringBuffer();
try{
rowSet.absolute((page-1)*pageSize+1);
rowSet.relative(-1);
......
..