JAVA中如何判斷一個ResultSet結果集是否為空

来源:https://www.cnblogs.com/aoguai/archive/2023/02/09/17107380.html
-Advertisement-
Play Games

問題描述 ResultSet 表示 select 語句的查詢結果集。ResultSet 對象具有指向其當前數據行的指針, 最初,指針被置於第一行記錄之前,通過 next() 方法可以將指針移動到下一行記錄。 next() 方法在 ResultSet 對象沒有一行記錄時返回 false ,因此可以在 ...


問題描述

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

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

示例代碼如下:

//此處省略連接資料庫的代碼...

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

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

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

此時出現第一個坑:Java 的 ResultSet 對象,預設是不可更新的,僅有一個向前移動的指針。

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

當你使用了 rs.next() 進行判斷後,會出現第一行數據丟失的情況。

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

深究問題

ResultSet 的 Type 屬性

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

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

這種方法看上去可行,但當我實際修改後運行,卻出現報錯

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

這又是什麼原因呢?

出現這個報錯的主要原因是:

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

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

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

Statement stmt = conn.createStatement(); 中 的 createStatement() 預設時等價於: createStatement(ResultSet.TYPE_FORWORD_ONLY,ResultSet.CONCUR_READ_ONLY);

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

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

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

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

解決辦法

  1. 手動指定游標類型

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

  2. 將 ResultSet 的內容複製到一個 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不為空,可以執行讀取操作
    } else {
        // ResultSet為空,不執行讀取操作
    }
    

    請註意,在實際生產環境中,請考慮數據量和記憶體使用情況,因為將所有記錄複製到List中可能對記憶體產生很大影響。

  3. 定義 一個計數變數 i ,每次 next() 則 ++i ,在 while() 迴圈結束後判斷 i 是否小於等於 0

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Web一階段面試題 1.簡述 <!doctype> 的作用? <!DOCTYPE> 聲明叫做文檔類型定義(DTD),聲明的作用是為了告訴瀏覽器該文件的類型。讓瀏覽器解析器知道應該用哪個規範來解析文檔。 五大主流的瀏覽器及其內核? Chrome 內核 Blink Safari 內核 Webkit Op ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 項目效果 我們今天要實現的是一個路徑規劃的功能,有兩個輸入框。輸入起點終點,然後查詢,得到規劃的路徑,效果如下: 我們會用到以下庫: Axios:用於發送請求,請求高德地圖的地理編碼API Jquery:也用於發送請求 Cesium:地圖 ...
  • 上文創建了一堆 utils、component-info,並實現了新組件模塊相關目錄和文件的創建。本文繼續實現後面的內容。 1 組件樣式文件並導入 在 src/service 目錄中創建 init-scss.ts 文件,該文件導出 initScss 函數。 由於 .vue 類型的組件的樣式就直接寫在 ...
  • JavaScript 詞法環境 本文主要講解JS詞法環境,我們將看到什麼是詞法環境,詞法範圍如何工作,函數內部的名稱如何解析,內部屬性,弄清楚詞法環境利於我們理解閉包。讓我們開始吧... 什麼是詞法環境? 在理解閉包時,最大的混淆來源是術語“辭彙環境”,或者只是“辭彙”這個詞。在電腦科學中術語“詞 ...
  • 演示代碼使用 Vue3 + ts + Vite 編寫,但是也會列出適用於 Vue2 的優化技巧,如果某個優化只適用於 Vue3 或者 Vue2,我會在標題中標出來。 代碼優化 v-for 中使用 key 使用 v-for 更新已經渲染的元素列表時,預設用就地復用策略;列表數據修改的時候,他會根據 k ...
  • 一、使用 performance.now() API 在 JavaScript 中,可以使用 performance.now() API 來評測代碼的運行速度。該 API 返回當前頁面的高精度時間戳,您可以在代碼執行前後調用它來計算代碼執行所需的時間。 例如: let t0 = performanc ...
  • 在19年11月的時候買了一個運動手環,然後時不時會用它來記錄睡眠數據;積累到現在已經有40個月了。現在想要調整作息,分析一下這些數據,來制定合理的作息計劃。 圖1 月平均入睡時間 從圖1可以看出,我最經常的入睡時間是(02:00:00~02:10:00)之間; 現在我想要早睡,逐步調整,第一個目標值 ...
  • 一、前言 在上一節,我們新建了工程,做好了準備。本節在工程中加入B站網頁,屏蔽頁面廣告。 二、工程配置 2.1、基礎配置 配置 程式啟動事件,填入以下代碼 載入網頁("https://m.bilibili.com/index.html") -- 載入網頁 為軟體自帶的函數,後面做函數介紹 -- 鏈接 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...