控制游标
结果集的游标的初始位置在结果集第一行的前面,结果集调用next()方法向下(后)移动游标,移动成功返回true,否则返回false。如果需要在结果集中上下(前后)移动、显示结果集中某条记录或随机显示若干条记录,必须返回一个可滚动的结果集。为了得到一个可滚动的结果集,需使用下述方法获得一个Statement对象:
Statement stmt = con.createStatement(int type, int concurrency);然后,根据参数type、concurrency的取值情况,stmt返回相应类型的结果集:
ResultSet re= stmt.executeQuery(SQL语句);type的取值决定滚动方式,取值如下。
ResultSet.TYPE_FORWORD_ONLY:结果集的游标只能向下滚动。
ResultSet.TYPE_SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集不变。
ResultSet.TYPE_SCROLL_SENSITIVE:返回可滚动的结果集,当数据库变化时,当前结果集同步改变。
Concurrency取值决定是否可以用结果集更新数据库,Concurrency取值如下。
ResultSet.CONCUR_READ_ONLY:不能用结果集更新数据库中的表。
ResultSet.CONCUR_UPDATABLE:能用结果集更新数据库中的表。
滚动查询经常用到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 isFirst():判断游标是否指向结果集的第一行。
public boolean isLast():判断游标是否指向结果集的最后一行。
public int getRow():得到当前游标所指向的行号,行号从1开始,如果结果集没有行,返回0。
public boolean absolute (int row):将游标移到参数 row指定的行。注:如果row取负值,就是倒数的行数,absolute(-1)表示移到最后一行,absolute(-2)表示移到倒数第二行,当移动到第一行前面或最后一行的后面时,该方法返回false。
例子2将数据库连接的代码单独封装到一个GetDatabaseConnection类中。例子2随机查询students数据库中mess表的两条记录(见前面建立的数据库),首先将游标移动到最后一行,然后再获取最后一行的行号,以便获得表中的记录数目。本例子用到了第8章中的GetRandomNumber类,该类的static方法:
public static int [] getRandomNumber (int max, int amount)返回1-max之间的amount个不同的随机数。程序代码如下所示:
import java.sql.*;public class GetDBConnection { public static Connection connectDB(String DBName, String id, String p) { Connection con = null; String uri = "jdbc:mysql://localhost:3306/"+DBName+"?useSSL=true&characterEncoding=utf-8"; try { Class.forName("com.mysql.jdbc.Driver"); //加载JDBC-MySQL驱动 } catch (Exception e) {} try { con = DriverManager.getConnection(uri,id,p); //连接代码 } catch (SQLException e) {} return con; }}import java.sql.*;public class Example2 { public static void main(String[] args) { Connection con; Statement sql; ResultSet rs; con = GetDBConnection.connectDB("students","root",""); if(con == null) return; try { sql=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = sql.executeQuery ("SELECT * FROM mess "); rs.last(); int max = rs.getRow(); System.out.println("表共有"+max+"条记录,随机抽取2条记录:"); int [] a = GetRandomNumber.getrandomNumber(max, 2); for(int i: a) { //i依次取数组每个单元的值 rs.absolute(i); //游标移动到第i行 String number = rs.getString(1); String name = rs.getString(2); Date date = rs.getDate(3); float h = rs.getFloat(4); System.out.printf("%s\t",number); System.out.printf("%s\t",name); System.out.printf("%s\t",date); System.out.printf("%.2f\n",h); } con.close(); } catch (SQLException e) { System.out.println(e); } }}程序运行效果如图所示:

















