java - 存在 - resultset 使い方




Java ResultSet結果があるかどうかをチェックする方法 (14)

ResultSetが空であるかどうかを調べるために、次のメソッドを作成しました。

public static boolean resultSetIsEmpty(ResultSet rs){        
    try {
        // We point the last row
        rs.last();
        int rsRows=rs.getRow(); // get last row number

        if (rsRows == 0) {
            return true;
        }

        // It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
        rs.beforeFirst();
        return false;
    }catch(SQLException ex){            
        return true;
    }
}

次の点を考慮する必要があります。

CallableStatementオブジェクトは、ResultSetオブジェクトが最後に移動し、先頭に戻るように設定する必要があります。

TYPE_SCROLL_SENSITIVE :ResultSetオブジェクトは最後に移動し、先頭に戻ることができます。 さらに最後の変更をキャッチできます。

CONCUR_READ_ONLY :ResultSetオブジェクト・データを読み取ることはできますが、更新はできません。

CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

Resultsetのメソッドがありません。 resultSetに値があるかどうかをチェックしたい

これは正しい方法です

if (!resultSet.next() ) {
    System.out.println("no data");
} 

resultSet.next()を使用すると、結果セットを得ることができます。

ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
 //resultSet contain some values
else
 // empty resultSet

あなたはこのようなことをすることができます

boolean found = false;

while ( resultSet.next() )
{
    found = true;
    resultSet.getString("column_name");
}

if (!found)
    System.out.println("No Data");

あなたは通常次のようなことをします:

while ( resultSet.next() ) { 
   // Read the next item
   resultSet.getString("columnName");
}

空のセットを報告する場合は、読み込んだアイテムを数える変数を追加します。 1つのアイテムだけを読む必要がある場合は、コードが適切です。


これは私が信じる実用的で読みやすい部分です。

        if (res.next()) {
            do {

                // successfully in. do the right things.

            } while (res.next());
        } else {
           // no results back. warn the user.
        }

なぜrs.getRow()を使わないのですか?

int getRow()
           throws SQLException
Retrieves the current row number. The first row is number 1, the second number 2, and so on.
Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY

Returns:
the current row number; 0 if there is no current row
Throws:
SQLException - if a database access error occurs or this method is called on a closed result set
SQLFeatureNotSupportedException - if the JDBC driver does not support this method
Since:
1.2

私にとっては、 "if(rs.getRow()!= 0)"がうまく動作しているように見えます。


カーソルが最初の行の前を指している、新しく返されたResultSetを操作していると仮定すると、これをチェックする簡単な方法はisBeforeFirst()呼び出すことです。 これにより、データを読み取るかどうかを追跡する必要がなくなります。

ドキュメント説明したように、カーソルが最初のレコードの前にない場合、またはResultSetに行が存在しない場合はfalseを返します。

if (!resultSet.isBeforeFirst() ) {    
    System.out.println("No data"); 
} 


データを取得するときに行をスキップするのを避けることができるように、最善のことは最初の行をチェックすることです。 何かが好きです:if(!resultSet.first()){System.out.println( "no data"); }


最初は、結果セットオブジェクト(rs)はBFR(最初のレコードの前)を指しています。 rs.next()を使用すると、カーソルは最初のレコードを指し、rsは "true"を保持します。 whileループを使用すると、テーブルのすべてのレコードを印刷できます。 すべてのレコードが取得されると、カーソルはALR(最後のレコードの後)に移動し、NULLに設定されます。 テーブルに2つのレコードがあると考えてみましょう。

if(rs.next()==false){
    // there are no records found
    }    

while (rs.next()==true){
    // print all the records of the table
    }

簡単に言うと、条件をwhile(rs.next())として書くこともできます。


正しいことですが、最初にnext()への最初の呼び出しがfalseを返し、 ResultSetデータがなかった場合、 ResultSetのカーソルは最初の行の前を指しています。

このメソッドを使用する場合は、直前の最初の行に配置されているため、直ちにbeforeFirst()を呼び出してリセットする必要があります。

しかし、以下のSeiferの答えは、この質問に対するよりエレガントな解決策であることに留意すべきである。


結果セットをチェックする最も簡単な方法は、パッケージorg.apache.commons.collections.CollectionUtilsの下でCollectionUtilsを使用することです

if(CollectionUtils.isNotEmpty(resultList)){
  /**
  * do some stuff
  */
}

これにより、空の結果セット条件だけでなく空の条件もチェックされます。

詳細については、次のドキュメントを参照してください。 CollectionUtils


結果セット内に行があるかどうかを確認したい場合は、これが機能します。

next()常に次の行に移動するので、結果セットを読み込む予定がある場合は、そのことを考慮する必要があります。

ResultSetの通常の使用法(読み込み時のみ):

while (resultSet.next())
{
   ... read from the row here ...
}

結果セットが空であるかどうかをチェックするために一度next()を呼び出すと、明らかに正しく動作しませんので、注意してください。 「バックアップする」方法はありますが、すべてのタイプの結果セットでサポートされるわけではありません。


ResultSet rs = rs.executeQuery();
if(rs.next())
{
  rs = rs.executeQuery();
  while(rs.next())
  {
    //do code part
  }
}
else
{
  //else if no result set
}

ResultSetの最初の行が実行され、 while(rs.next()){....}中で実行されるため、 if(rs.next()){....}を呼び出すとResultSetの最初の行が実行されるため、私たちは次の行から結果を得るでしょう。 だから私は内部のクエリの再実行が良い選択肢だと思う。


if (!resultSet.isAfterLast() ) {    
System.out.println("No data"); 
} 

isAfterLast()は空の結果セットに対してもfalseを返しますが、カーソルが最初の行の前にあるので、このメソッドはより明白です。







jdbc