最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java如何判斷ResultSet結(jié)果集是否為空

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

問題描述

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

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

示例代碼如下:

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

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

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

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

此時(shí)出現(xiàn)第一個(gè)坑:Java 的 ResultSet 對(duì)象,默認(rèn)是不可更新的,僅有一個(gè)向前移動(dòng)的指針。

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

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

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

深究問題

ResultSet 的 Type 屬性

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

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

這種方法看上去可行,但當(dāng)我實(shí)際修改后運(yùn)行,卻出現(xiàn)報(bào)錯(cuò)

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

這又是什么原因呢?

出現(xiàn)這個(gè)報(bào)錯(cuò)的主要原因是:

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

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

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

當(dāng) Statement stmt = conn.createStatement(); 中 的 createStatement() 缺省時(shí)等價(jià)于: createStatement(ResultSet.TYPE_FORWORD_ONLY,ResultSet.CONCUR_READ_ONLY);

也就是結(jié)果集的游標(biāo)只能向下滾動(dòng)

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

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

Statement stmt =conn.ctrateStatement(游標(biāo)類型,記錄更新權(quán)限);

解決辦法

1.手動(dòng)指定游標(biāo)類型

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

2.將 ResultSet 的內(nèi)容復(fù)制到一個(gè) 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í)行讀取操作
}

請(qǐng)注意,在實(shí)際生產(chǎn)環(huán)境中,請(qǐng)考慮數(shù)據(jù)量和內(nèi)存使用情況,因?yàn)閷⑺杏涗洀?fù)制到List中可能對(duì)內(nèi)存產(chǎn)生很大影響。

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

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

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

相關(guān)文章

  • Java如何將BigDecimal類型的值轉(zhuǎn)成double類型

    Java如何將BigDecimal類型的值轉(zhuǎn)成double類型

    這篇文章主要給大家介紹了關(guān)于Java如何將BigDecimal類型的值轉(zhuǎn)成double類型的相關(guān)資料,需要注意精度損失和范圍限制,使用doubleValue方法進(jìn)行轉(zhuǎn)換,并在高精度計(jì)算時(shí)格外小心,需要的朋友可以參考下
    2024-12-12
  • Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理(總結(jié))

    Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理(總結(jié))

    這篇文章主要介紹了Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-05-05
  • Redis在springboot中的使用教程

    Redis在springboot中的使用教程

    這篇文章主要介紹了Redis在springboot中的使用教程,本文實(shí)例代碼相結(jié)合的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-06-06
  • 詳解HDFS多文件Join操作的實(shí)例

    詳解HDFS多文件Join操作的實(shí)例

    這篇文章主要介紹了詳解HDFS多文件Join操作的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • 最詳細(xì)的文件上傳下載實(shí)例詳解(推薦)

    最詳細(xì)的文件上傳下載實(shí)例詳解(推薦)

    在Web應(yīng)用系統(tǒng)開發(fā)中,文件上傳和下載功能是非常常用的功能,今天來講一下JavaWeb中的文件上傳和下載功能的實(shí)現(xiàn)。非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-07-07
  • java學(xué)生管理系統(tǒng)界面簡(jiǎn)單實(shí)現(xiàn)(全)

    java學(xué)生管理系統(tǒng)界面簡(jiǎn)單實(shí)現(xiàn)(全)

    這篇文章主要為大家詳細(xì)介紹了java學(xué)生管理系統(tǒng)界面的簡(jiǎn)單實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • SpringMVC實(shí)現(xiàn)獲取請(qǐng)求參數(shù)方法詳解

    SpringMVC實(shí)現(xiàn)獲取請(qǐng)求參數(shù)方法詳解

    Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì),這篇文章主要介紹了SpringMVC實(shí)現(xiàn)獲取請(qǐng)求參數(shù)方法
    2022-09-09
  • SpringBoot多環(huán)境配置及日志記錄器詳解

    SpringBoot多環(huán)境配置及日志記錄器詳解

    這篇文章主要介紹了SpringBoot多環(huán)境配置及日志記錄器詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • 詳解Nacos配置中心的實(shí)現(xiàn)

    詳解Nacos配置中心的實(shí)現(xiàn)

    Spring Cloud Alibaba 是阿里巴巴提供的一站式微服務(wù)開發(fā)解決方案。而 Nacos 作為 Spring Cloud Alibaba 的核心組件之一,提供了兩個(gè)非常重要的功能:注冊(cè)中心和配置中心,我們今天來了解和實(shí)現(xiàn)一下二者
    2022-08-08
  • Java線程池ThreadPoolExecutor源碼深入分析

    Java線程池ThreadPoolExecutor源碼深入分析

    ThreadPoolExecutor作為java.util.concurrent包對(duì)外提供基礎(chǔ)實(shí)現(xiàn),以內(nèi)部線程池的形式對(duì)外提供管理任務(wù)執(zhí)行,線程調(diào)度,線程池管理等等服務(wù)
    2022-08-08

最新評(píng)論

达尔| 肥乡县| 岐山县| 平舆县| 建水县| 无锡市| 淮阳县| 蒙阴县| 确山县| 扬中市| 乌拉特前旗| 丰都县| 衡山县| 阜新| 从化市| 怀宁县| 顺平县| 万山特区| 华坪县| 威远县| 大宁县| 中江县| 任丘市| 临沭县| 县级市| 增城市| 加查县| 孝义市| 营口市| 萍乡市| 长寿区| 德格县| 疏勒县| 鄂托克旗| 烟台市| 叶城县| 陕西省| 锡林浩特市| 衡东县| 阳东县| 若尔盖县|