有时候我们需要在结果集中前后移动、或显示结果集指定的一条记录等等。这时,我们必须要返回一个可滚动的结果集。为了得到一个可滚动的结果集,我们必须使用下述方法先获得一个Statement对象:
Statement st=con.createStatement(ResultSet.TYPE_FORWORD_ONLY ,int concurrency);
然后,根据参数的type、concurrency的取值情况,st返回相应类型的结果集:
ResultSet re=st.executeQuery(SQL语句);
type的取值决定滚动方式,取值可以是:
ResultSet.TYPE_FORWORD_ONLY :结果集的游标只能向下滚动。
ResultSet.TYPE_SCROLL_INSENSITIVE :结果集的游标可以上下移动,当数据库变化时,当前结果集不变。
ResultSet.TYPE_SCROLL_SENSITIVE :返回可滚动的结果集,当数据库变化时,当前结果集同步改变。
Concurrency 取值决定是否可以用结果集更新数据库,Concurrency取值:
ResultSet.CONCUR_READ_ONLY:不能用结果集更新数据库中的表。
ResultSet.CONCUR_UPDATETABLE:能用结果集更新数据库中的表。
滚动查询经常用到ResultSet的下述方法:
public boolean previous():将游标向上移动,该方法返回boolean型数据,当移到结果集第一行之前时返回false.
public void beforeFirst:将游标移动到结果集的初始位置,即在第一行之前。
public void afterLast():将游标移到结果集最后一行之后。
public void first():将游标移到结果集的第一行。
public void last():将游标移到结果集的最后一行。
public boolean isAfterLast():判断游标是否在最后一行之后。
public boolean isBeforeFirst():判断游标是否在第一行之前。
public boolean ifFirst():判断游标是否指向结果集的第一行。
public boolean isLast():判断游标是否指向结果集的最后一行。
public int getRow():得到当前游标所指行的行号,行号从1开始,如果结果集没有行,返回0
public boolean absolute(int row):将游标移到参数row指定的行号。
注意,如果row取负值,就是倒数的行数,absolute(-1)表示移到最后一行,absolute(-2)表示移到倒数第2行。当移动到第一行前面或最后一行的后面时,该方法返回false。
在下面的例子中,首先将游标移动到最后一行,然后再获取行号,这样就获得表中的记录数目。然后我们根据偶数行倒序输出结果集中的记录。
本程序实现数据库中数据偶数行逆序输出:
文件代码如下:
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<%@ page import="java.sql.*"%>
<html>
<head>
<title>偶数行逆序输出</title>
</head>
<body>
<body bgcolor="AliceBlue">
<%
Connection con = null;
Statement st = null;
ResultSet rs = null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
con=java.sql.DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=Teach","sa","数据库密码");
st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//返回可滚动的结果集:
rs = st.executeQuery("SELECT * FROM KC");
//将游标移动到最后一行:
rs.last();
//获取最后一行的行号:
int lownumber = rs.getRow();
out.print("该表共有" + lownumber + "条记录");
//out.print("<br>现在按顺序输出记录:");
out.print("<br>现在逆序输出记录:");
out.print("<Table border=1>");
out.print("<tr>");
out.print("<th>课程号</th>");
out.print("<th>课程名称</th>");
out.print("<th>教师姓名</th>");
out.print("<th>开课学期</th>");
out.print("<th>课程学时</th>");
out.print("<th>课程学分</th>");
out.print("</tr>");
//为了逆序输出记录,需将游标移动到最后一行之后:
rs.afterLast();
while (rs.previous()) {
int i = rs.getRow();
if(i%2==0){
out.print("<tr>");
out.print("<td>"+rs.getString(1)+"</td>");
out.print("<td>"+rs.getString(2)+"</td>");
out.print("<td>"+rs.getString(3)+"</td>");
out.print("<td>"+rs.getString(4)+"</td>");
out.print("<td>"+rs.getString(5)+"</td>");
out.print("<td>"+rs.getString(6)+"</td>");
out.print("</tr>");
}
}
out.print("</Table");
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
%>
</body>
</html>
页面运行效果: