控制游标
结果集的游标的初始位置在结果集第一行的前面,结果集调用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指定的行。
例子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);
}
}
}
复制
程序运行效果如图所示:



