ResultSet接口表示在数据库的数据表中查询的结果集,ResultSet
对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。
Java没有提供直接返回ResultSet行数的函数(或方法)。如果想知道ResultSet的行数,有以下三个办法可以解决:
1. 用sql语句中的count函数,然后从ResultSet里获取第一行的数字:
try {
ResultSet resultSet = ("select count(1) as
nRrow from tableName");//使用sql的count函数
();//移动到第一行
int rowCount = ("rowCount");//获取行数值
} catch (Exception e) {
();
}
这种方法不用遍历整个数据集,节省了运算时间,但是,此方法只能用于获取数据表的行数,不能获取表中的具体数据。所以如果只是想知道数据表的行数,此方法非常适合。
2. 遍历Resultset,用一个变量累加记录行数。代码如下:
int nRow = 0;
try {
ResultSet resultSet = ("select * from
tableName");//使用select语句查询数据表
while(()){//遍历
nRow++;
}
} catch (SQLException e1) {
();
}
next 函数将指针移动到下一行;因为该方法在 ResultSet 对象中没有下一行时返回
false,所以可以在 while 循环中使用它来迭代结果集。
这种方法需要遍历整个结果集,在遍历过程中可以获取数据;但是在遍历完之后,不能再使用结果集了,因为这时候指针已经移动到结果集的外面了,不能返回到结果集的初始处。
3. 在创建Statement时加入参数
知道了第二种方法中问题的原因,我们就知道如何更好地解决这个问题了。第二种方法的问题在于返回的结果集中的指针不能*移动,幸好java为
我们提供了选择,可以让我们创建指针可以*移动的结果集,所需要做的只有一件事,就是在创建Statement的时候,加上两个参数:在创建Statement对象的时候加入参数,可以使ResultSet能够随意滚动和更新,语句如下:
Statement stmt = (type, concurrency);
其中,type表示ResuleSet的类型,取值和含义如下:
ResultSet.TYPE_FORWARD_ONLY :结果集不能滚动,这是默认值;
ResultSet.TYPE_SCROLL_INSENSITIVE:结果集可以滚动,但ResuleSet对数据库中发送的数据改变不敏感;
ResultSet.TYPE_SCROLL_SENSITIVE :结果集可以滚动,并且ResuleSet对数据库中发生的改变敏感
当使用TYPE_SCROLL_INSENSITIVE或者TYPE_SCROLL_SENSITIVE来创建Statement对象时,可以使用ResultSet 的first()、last()、beforeFirst()、afterLast()、relative()和absolute()等方法,以便在结果集中随意前后移动。
concurrency表示是否可以使用ResuleSet来更新数据库,取值和含义如下:
ResultSet.CONCUR_READ_ONLY :只读结果集,不能用于更新数据库;
ResultSet.CONCUR_UPDATABLE :可更新结果集,可以用于更新数据库。
注意:如果结果集来自于合并查询,即查询结果来自多个数据表,即使使用了CONCUR_UPDATABLE参数创建Statement,得到的结果集也不一定是可更新的。可以使用ResuleSet类的getConcurrency()函数来确定是否为可更新的的结果集。
如果结果集是可更新的,那么可使用ResultSet的
updateRow()、insertRow()、moveToCurrentRow()、deleteRow()和cancelRowUpdates() 等函数对数据库进行更新。
加入参数后代码如下:
try {
//Statement statement = ();
Statement statement =
(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet resultSet = ("select * from " +
tableName);
} catch (Exception e) {
();
}
这样获得的结果集,指针就可以在其中*移动。然后,就可以用如下方法获取结果集的行数:
int nRow = 0;
try {
();
nRow = ();
} catch (Exception e) {
();
}
其中()就是将指针移动到结果集的最后一条记录;然后用()获取指针当前所在的行号。
如果接下来你还要使用结果集,不要忘记将指针移到第一行:
();
可以通过
().getColumnCount()获取结果集的列数。