获取ResultSet在Java中返回的行数
我已经使用了一个返回一定数量的行的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
返回的行数? 还是我必须写我自己的?
您可以使用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"); }
首先,您应该创build可以通过命令移动光标的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(); ... }
那么rowsvariables将包含sql返回的行数
一个简单的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; }
只是要知道,这个方法将需要一个滚动敏感的结果集,所以当创build连接,你必须指定滚动选项。 默认是FORWARD,使用这个方法会抛出exception。
另一种区分ResultSet中的0行或某些行的方法:
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()); }
您可以用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进行计数。
这是我的解决scheme
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(); }
您可以将ResultSet加载到TableModel中,然后创build一个使用该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());
第一行代码表示我们可以在结果集中的任何地方移动(无论是第一行还是最后一行还是第一行之前,而不需要从第一行开始逐行遍历)。第二行代码获取logging匹配查询在这里,我假设(25logging),第三行代码将光标移动到最后一行,最后一行代码获取当前行号,在我的情况是25。 如果没有logging,rs.last返回0,getrow将光标移动到第一行之前,因此返回负值表示db中没有logging
rs.last(); int rows = rs.getRow(); rs.beforeFirst();
你可以使用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. } }