답변:
맞습니다. 처음에 ResultSet
커서가 첫 번째 행을 가리키고 있습니다. 첫 번째 호출이 next()
반환 되면에 false
데이터가없는 경우 ResultSet
입니다.
이 방법을 사용하면 전화해야 할 수도 있습니다 beforeFirst()
지금 첫 번째 행을 지나서 위치했기 때문에 재설정 후 즉시 .
그러나 아래 Seifer의 답변 은이 질문에 대한보다 우아한 해결책 이라는 점에 유의해야합니다 .
isBeforeFirst()
커서를 진행시키지 않고 리턴 된 행이 있는지 테스트하기 위해 호출 한 다음 정상적으로 진행할 수도 있습니다.
ResultSet
커서가 첫 번째 행 앞을 가리키는 새로 반환 된 것으로 작업한다고 가정하면 더 쉽게 확인할 수 있습니다 isBeforeFirst()
. 이렇게하면 데이터를 읽을 경우 역 추적 할 필요가 없습니다.
문서에서 설명한대로 커서가 첫 번째 레코드 앞에 있지 않거나 ResultSet에 행이없는 경우 false를 리턴합니다 .
if (!resultSet.isBeforeFirst() ) {
System.out.println("No data");
}
이를 위해 do {...} while () 구문과 함께 ResultSet.next ()를 사용하는 것이 가장 좋습니다.
"결과 확인"호출 ResultSet.next ()는 커서를 첫 번째 행으로 이동하므로 do {...} while () 구문을 사용하여 해당 행을 처리하고 루프에서 리턴 된 나머지 행을 계속 처리하십시오.
이렇게하면 결과를 확인하면서 동시에 반환 된 결과를 처리 할 수 있습니다.
if(resultSet.next()) { // Checks for any results and moves cursor to first row,
do { // Use 'do...while' to process the first row, while continuing to process remaining rows
} while (resultSet.next());
}
가장 실용적인 대답에 따르면 "isBeforeFirst ()"를 사용하는 것이 좋습니다. "forward only type"이 없으면 최상의 솔루션이 아닙니다 .
" .first () 라는 메소드가 있습니다. " . 똑같은 결과를 얻는 것은 덜 과잉입니다. "결과"에 무언가가 있는지 확인하고 커서를 움직이지 않습니다.
설명서에는 " 결과 세트에 행 이 없으면 "(...) false "라고 표시되어 있습니다.
if(rs.first()){
//do stuff
}
isBeforeFirst ()를 호출하여 커서를 진행하지 않고 리턴 된 행이 있는지 테스트 한 후 정상적으로 진행할 수 있습니다. – SnakeDoc 9 월 2 일 14시 19:00
그러나 "isBeforeFirst ()"와 "first ()"에는 차이가 있습니다. "forward only"유형의 결과 집합에서 수행 된 경우 먼저 예외를 생성합니다.
두 개의 던지기 섹션을 비교하십시오. http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst () http://docs.oracle.com/javase/7/docs /api/java/sql/ResultSet.html#first ()
기본적으로 이것은 "앞으로 만"유형이있는 한 "isBeforeFirst"를 사용해야한다는 것을 의미합니다. 그렇지 않으면 "first ()"를 사용하는 것이 덜 과도합니다.
결과 세트에 행이 있는지 확인하려는 경우 작동합니다.
참고 next()
다음 행으로 항상 이동, 그래서 당신이 결과에서 어떤 읽는 일을 계획하는 경우에 당신의 계정에 그를 취할 필요가 설정합니다.
ResultSet의 일반적인 사용법 (간단히 읽는 경우)은 다음과 같습니다.
while (resultSet.next())
{
... read from the row here ...
}
next()
결과 세트가 비어 있는지 확인하기 위해 이미 한 번 호출 한 경우 분명히 올바르게 작동하지 않으므로 조심하십시오. "백업"방법이 있지만 모든 유형의 결과 집합에 대해 지원되는 것은 아닙니다.
if(resultSet.first) {
} else {
system.out.println("No raw or resultSet is empty");
}
ResultSet에 raw가 없으면 resultSet.first
false 를 리턴하기 때문입니다.
resultSet.next ()를 사용하면 resultSet에 값이 포함되어 있는지 여부에 관계없이 결과를 쉽게 얻을 수 있습니다.
ResultSet resultSet = preparedStatement.executeQuery();
if(resultSet.next())
//resultSet contain some values
else
// empty resultSet
현재 행을 첫 번째 인덱스 (기본 키 처리)로 설정하려고했습니다. 내가 제안 할게
if(rs.absolute(1)){
System.out.println("We have data");
} else {
System.out.println("No data");
}
ResultSet이 채워지면 첫 번째 행 앞을 가리 킵니다. 첫 번째 행 (로 표시 rs.absolute(1)
)으로 설정하면 행 1에 성공적으로 배치 되었음을 나타내는 true를 반환하거나 행이 없으면 false를 반환합니다. 이것을 외삽 할 수 있습니다
for(int i=1; rs.absolute(i); i++){
//Code
}
현재 행을 위치 i로 설정하고 행이 존재하지 않으면 실패합니다. 이것은 단지 다른 방법입니다
while(rs.next()){
//Code
}
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);
결과 집합을 확인하는 가장 쉬운 방법은 org.apache.commons.collections.CollectionUtils 패키지의 CollectionUtils 를 사용하는 것입니다.
if(CollectionUtils.isNotEmpty(resultList)){
/**
* do some stuff
*/
}
빈 결과 집합 조건뿐만 아니라 null도 검사합니다.
자세한 내용은 다음 문서를 참조하십시오. 컬렉션 유틸리티
왜 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)"을 확인하십시오.
당신은 이런 식으로 할 수 있습니다
boolean found = false;
while ( resultSet.next() )
{
found = true;
resultSet.getString("column_name");
}
if (!found)
System.out.println("No Data");
ResultSet rs = rs.executeQuery();
if(rs.next())
{
rs = rs.executeQuery();
while(rs.next())
{
//do code part
}
}
else
{
//else if no result set
}
if(rs.next()){....}
ResultSet의 첫 번째 행을 호출 하면 실행되고 while(rs.next()){....}
그 다음에 다음 행에서 결과를 얻으 므로 쿼리를 다시 실행하는 것이 좋습니다 . 따라서 쿼리를 다시 실행 if
하는 것이 더 나은 옵션 이라고 생각 합니다.
처음에 결과 집합 개체 (rs)는 BFR (첫 번째 레코드 이전)을 가리 킵니다. rs.next ()를 사용하면 커서가 첫 번째 레코드를 가리키고 rs는 "true"를 유지합니다. while 루프를 사용하면 테이블의 모든 레코드를 인쇄 할 수 있습니다. 모든 레코드가 검색된 후 커서는 ALR (마지막 레코드 후)로 이동하고 널로 설정됩니다. 테이블에 2 개의 레코드가 있다고 생각합시다.
if(rs.next()==false){
// there are no records found
}
while (rs.next()==true){
// print all the records of the table
}
간단히 말해서 조건을 while (rs.next ())와 같이 쓸 수도 있습니다.