控制游标

结果集的游标的初始位置在结果集第一行的前面,结果集调用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);    }  }}

程序运行效果如图所示:



java游标查询 mysql jdbc游标查询_java游标查询 mysql