欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java如何判斷ResultSet結果集是否為空

 更新時間:2023年02月10日 08:43:38   作者:奧怪的小棧  
ResultSet 表示 select 語句的查詢結果集。這篇文章主要為大家詳細介紹了Java如何判斷ResultSet結果集是否為空,感興趣的可以了解一下

問題描述

ResultSet 表示 select 語句的查詢結果集。ResultSet 對象具有指向其當前數(shù)據(jù)行的指針, 最初,指針被置于第一行記錄之前,通過 next() 方法可以將指針移動到下一行記錄。

next() 方法在 ResultSet 對象沒有一行記錄時返回 false ,因此可以在 while 循環(huán)中使用它來遍歷結果集,也可以利用該方法判斷結果集是否為空。

示例代碼如下:

//此處省略連接數(shù)據(jù)庫的代碼...

Statement stmt =conn.createStatement();  
ResultSet ?rs ? ? =stmr.executeQuery("select ?* ?from ?Test");

if(rs.next()){  
System.out.println("結果集不為空!");  
}

else{  
System.out.println("結果集為空!");  
}

此時出現(xiàn)第一個坑:Java 的 ResultSet 對象,默認是不可更新的,僅有一個向前移動的指針。

因此,只能遍歷它一次,并且只能按從第一行到最后一行的順序進行。

當你使用了 rs.next() 進行判斷后,會出現(xiàn)第一行數(shù)據(jù)丟失的情況。

這也是我一開始遇到的問題。

深究問題

ResultSet 的 Type 屬性

遇到問題后我第一想法是在搜索引擎上搜索相關解決辦法,但看了一圈具體有以下“解法”:

調用 rs.last() 方法,以獲取 ResultSet中 記錄的總數(shù),然后調用 rs.beforeFirst() 方法將光標移回到第一條記錄前面

這種方法看上去可行,但當我實際修改后運行,卻出現(xiàn)報錯

Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY.

這又是什么原因呢?

出現(xiàn)這個報錯的主要原因是:

ResultSet.TYPE_FORWARD_ONLY 類型的 ResultSet 只允許向前遍歷,不支持訪問先前的記錄或確定其大小。因此,使用 last() 和 getRow() 等方法都是不可行。

而 ResultSet 的 Type 屬性有如下幾種:

參數(shù)類型說明
ResultSet.TYPE_FORWORD_ONLY結果集的游標只能向下滾動
ResultSet.TYPE_SCROLL_INSENSITIVE結果集的游標可以上下移動,當數(shù)據(jù)庫變化時,當前結果集不變
ResultSet.TYPE_SCROLL_SENSITIVE返回可滾動的結果集,當數(shù)據(jù)庫變化時,當前結果集同步改變

當 Statement stmt = conn.createStatement(); 中 的 createStatement() 缺省時等價于: createStatement(ResultSet.TYPE_FORWORD_ONLY,ResultSet.CONCUR_READ_ONLY);

也就是結果集的游標只能向下滾動

所以才會出現(xiàn) Operation not allowed for a result set of type ResultSet.TYPE_FORWARD_ONLY. 的報錯

也就是 ResultSet 默認情況下,只能使用 next() 方法向前逐行移動游標,而不支持 last()、first() 以及 absolute() 等方法,如果要使用 last()、absolute() 等方法,必須在由 Connection 生成 Statement 時指定相應的參數(shù),格式如下:

Statement stmt =conn.ctrateStatement(游標類型,記錄更新權限);

解決辦法

1.手動指定游標類型

Statement stmt =conn.createStatement(ResultSet.TYPE_SCOLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

2.將 ResultSet 的內(nèi)容復制到一個 List 中,然后檢查 List 是否為空

List<Object[]> results = new ArrayList<>();
while (rs.next()) {
    int columnCount = rs.getMetaData().getColumnCount();
    Object[] row = new Object[columnCount];
    for (int i = 1; i <= columnCount; i++) {
        row[i - 1] = rs.getObject(i);
    }
    results.add(row);
}

if (!results.isEmpty()) {
    // ResultSet不為空,可以執(zhí)行讀取操作
} else {
    // ResultSet為空,不執(zhí)行讀取操作
}

請注意,在實際生產(chǎn)環(huán)境中,請考慮數(shù)據(jù)量和內(nèi)存使用情況,因為將所有記錄復制到List中可能對內(nèi)存產(chǎn)生很大影響。

3.定義 一個計數(shù)變量 i ,每次 next() 則 ++i ,在 while() 循環(huán)結束后判斷 i 是否小于等于 0

int i = 0;
while (resultSet.next()){
    System.out.println(...);
    ++i;
}
if(i<=0)
    System.out.println(...);

到此這篇關于詳解Java如何判斷ResultSet結果集是否為空的文章就介紹到這了,更多相關Java判斷ResultSet是否為空內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java使用Scanner類獲取用戶輸入實例詳解

    Java使用Scanner類獲取用戶輸入實例詳解

    在本篇文章里小編給大家整理了關于Java使用Scanner類獲取用戶輸入實例內(nèi)容,有興趣的朋友們學習下。
    2019-11-11
  • java8新特性-Stream入門學習心得

    java8新特性-Stream入門學習心得

    這篇文章主要介紹了java8新特性-Stream入門學習心得,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 淺談java中Math.random()與java.util.random()的區(qū)別

    淺談java中Math.random()與java.util.random()的區(qū)別

    下面小編就為大家?guī)硪黄獪\談java中Math.random()與java.util.random()的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • springboot-dubbo cannot be cast to問題及解決

    springboot-dubbo cannot be cast to問題及解決

    這篇文章主要介紹了springboot-dubbo cannot be cast to問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • MyBatis入門程序

    MyBatis入門程序

    MyBatis是支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。接下來本文給大家?guī)砹薓yBatis入門程序,感興趣的朋友一起學習吧
    2016-08-08
  • 淺析Java虛擬機詳解之概述、對象生存法則

    淺析Java虛擬機詳解之概述、對象生存法則

    這篇文章主要介紹了Java虛擬機詳解之概述、對象生存法則,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • java連接SQL Server數(shù)據(jù)庫的方法

    java連接SQL Server數(shù)據(jù)庫的方法

    這篇文章主要為大家詳細介紹了java連接SQL Server數(shù)據(jù)庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Java通過調用FFMPEG獲取視頻時長

    Java通過調用FFMPEG獲取視頻時長

    這篇文章主要為大家詳細介紹了Java通過調用FFMPEG獲取視頻時長,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • SpringBoot從0到1整合銀聯(lián)無跳轉支付功能附源碼

    SpringBoot從0到1整合銀聯(lián)無跳轉支付功能附源碼

    這篇文章主要介紹了SpringBoot從0到1整合銀聯(lián)無跳轉功能支付附源碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • CommonMark 使用教程:將 Markdown 語法轉成 Html

    CommonMark 使用教程:將 Markdown 語法轉成 Html

    這篇文章主要介紹了CommonMark 使用教程:將 Markdown 語法轉成 Html,這個技巧我們做任何網(wǎng)站都可以用到,而且非常好用。,需要的朋友可以參考下
    2019-06-06

最新評論