我使用了一个返回一定行数的ResultSet
。我的代码是这样的:
ResultSet res = getData();
if(!res.next())
{
System.out.println("No Data Found");
}
while(res.next())
{
// code to display the data in the table.
}
有什么方法可以检查ResultSet
返回的行数吗? 还是我必须自己写?
首先,您应该创建可以通过命令移动光标的Statement
:
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
然后检索ResultSet
,如下所示:
ResultSet rs = stmt.executeQuery(...);
将光标移动到最新行并获取它:
if (rs.last()) {
int rows = rs.getRow();
// Move to beginning
rs.beforeFirst();
...
}
然后行变量将包含 sql 返回的行数
您可以使用 do ... while
循环而不是 while
循环,以便在执行循环后调用rs.next()
,如下所示:
if (!rs.next()) { //if rs.next() returns false
//then there are no rows.
System.out.println("No records found");
}
else {
do {
// Get data from the current row and use it
} while (rs.next());
}
或者在获取行时自己计算行数:
int count = 0;
while (rs.next()) {
++count;
// Get data from the current row and use it
}
if (count == 0) {
System.out.println("No records found");
}
一个简单的getRowCount
方法可以如下所示:
private int getRowCount(ResultSet resultSet) {
if (resultSet == null) {
return 0;
}
try {
resultSet.last();
return resultSet.getRow();
} catch (SQLException exp) {
exp.printStackTrace();
} finally {
try {
resultSet.beforeFirst();
} catch (SQLException exp) {
exp.printStackTrace();
}
}
return 0;
}
请注意,此方法将需要 滚动敏感resultSet
,因此在创建连接时,您必须指定滚动选项。默认值为 FORWARD,使用此方法将引发异常。
另一种区分 0 行或 ResultSet 中的某些行的方法:
ResultSet res = getData();
if(!res.isBeforeFirst()){ //res.isBeforeFirst() is true if the cursor
//is before the first row. If res contains
//no rows, rs.isBeforeFirst() is false.
System.out.println("0 rows");
}
else{
while(res.next()){
// code to display the rows in the table.
}
}
如果您必须知道给定 ResultSet 的行数,下面是获取它的方法:
public int getRows(ResultSet res){
int totalRows = 0;
try {
res.last();
totalRows = res.getRow();
res.beforeFirst();
}
catch(Exception ex) {
return 0;
}
return totalRows ;
}
res.next()
方法会将指针指向下一行。 在您的代码中,您将使用它两次,第一次用于 if 条件(光标移动到第一行(,然后用于 while 条件(光标移动到第二行(。
因此,当您访问结果时,它会从第二行开始。因此在结果中显示少了一行。
你可以试试这个:
if(!res.next()){
System.out.println("No Data Found");
}
else{
do{
//your code
}
while(res.next());
}
rs.last();
int rows = rs.getRow();
rs.beforeFirst();
您可以使用 sql 计数并从结果集中检索答案,如下所示:
Statment stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet ct = stmt.executeQuery("SELECT COUNT(*) FROM [table_name]");
if(ct.next()){
td.setTotalNumRows(ct.getInt(1));
}
在这里,我正在计算所有内容,但您可以轻松地修改SQL以根据条件进行计数。
你可能认为JDBC是一个丰富的API,ResultSet有很多方法,那么为什么不只使用getCount((方法呢?好吧,对于许多数据库,例如Oracle,MySQL和SQL Server,ResultSet是一个流API,这意味着它不会从数据库服务器加载(甚至可能获取(所有行。 通过迭代到结果集的末尾,在某些情况下,可能会大大增加执行所需的时间。
顺便说一句,如果你必须有几种方法可以做到这一点,例如通过使用ResultSet.last((和ResultSet.getRow((方法,这不是最好的方法,但如果你绝对需要它,它可以工作。
不过,在 Java 中,从 ResultSet 获取列计数很容易。JDBC API 提供了一个 ResultSetMetaData 类,该类包含返回查询返回的列数和 ResultSet 保存的方法。
您可以将 ResultSet 加载到 TableModel 中,然后创建一个使用该 TableModel 的 JTable,然后使用 table.getRowCount(( 方法。如果要显示查询结果,无论如何都必须这样做。
ResultSet resultSet;
resultSet = doQuery(something, somethingelse);
KiransTableModel myTableModel = new KiransTableModel(resultSet);
JTable table = new JTable(KiransTableModel);
int rowCount;
rowCount = table.getRowCount;
Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=st.executeQuery("select * from emp where deptno=31");
rs.last();
System.out.println("NoOfRows: "+rs.getRow());
第一行代码说我们可以移动到结果集中的任何地方(无论是第一行还是最后一行或第一行之前,而无需从第一行开始逐行遍历,这需要时间(.第二行代码获取与此处查询匹配的记录我假设(25 条记录(, 第三行代码将光标移动到最后一行,最后一行代码获取当前行号,在我的情况下为 25。如果没有记录,rs.last 返回 0,getrow 将光标移动到第一行之前,因此返回负值表示 db
这是我的解决方案
ResultSet rs=Statement.executeQuery("query");
int rowCount=0;
if (!rs.isBeforeFirst())
{
System.out.println("No DATA" );
} else {
while (rs.next()) {
rowCount++;
System.out.println("data1,data2,data3...etc..");
}
System.out.println(rowCount);
rowCount=0;
rs.close();
Statement.close();
}
如果您的查询是这样的SELECT Count(*) FROM tranbook
,则执行此rs.next(); System.out.println(rs.getInt("Count(*)"));
就我而言,我需要从结果集中获取总行数,如果总行数未达到 XLS 文件的限制,还需要访问 ResultSet 值。
为此,我必须对代码进行两项调整:
1( 对象结构的变化 准备声明
默认的结果集对象具有仅向前移动的游标。因此,您只能循环访问一次,并且只能从第一行循环访问到最后一行。可以生成可滚动的结果集对象。下面的代码片段演示如何使结果集可滚动且对其他人的更新不敏感。
PreparedStatement ps = connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
2( 获取总行数。以下代码片段演示了如何:
ResultSet rs = ps.executeQuery();
rs.last();
int totalRowsResult = rs.getRow();
PS:如果查询结果的记录数太大,可能会通过出现异常来耗尽Java服务器上的内存:java.lang.OutOfMemoryError:Java堆空间。执行 rs.last (( 方法时将发生此异常
3( 再次访问结果集,您不会收到消息:扩展结果集。因此,vou 需要使用 rs.first(( 或 rs.absolute(1( 将结果集重置到顶部。以下代码片段演示了如何:
rs.first();
System.out.println(rs.getString(1));
您可以按如下方式使用res.previous()
:
ResulerSet res = getDate();
if(!res.next()) {
System.out.println("No Data Found.");
} else {
res.previous();
while(res.next()) {
//code to display the data in the table.
}
}