JSP | 使用滚动结果集进行游动查询

      有时候我们需要在结果集中前后移动、或显示结果集指定的一条记录等等。这时,我们必须要返回一个可滚动的结果集。为了得到一个可滚动的结果集,我们必须使用下述方法先获得一个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> 

页面运行效果:


猜你喜欢

转载自blog.csdn.net/ZYZMZM_/article/details/80255104