詳解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)文章
java8新特性-Stream入門學(xué)習(xí)心得
這篇文章主要介紹了java8新特性-Stream入門學(xué)習(xí)心得,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03淺談java中Math.random()與java.util.random()的區(qū)別
下面小編就為大家?guī)硪黄獪\談java中Math.random()與java.util.random()的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09springboot-dubbo cannot be cast to問題及解決
這篇文章主要介紹了springboot-dubbo cannot be cast to問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04淺析Java虛擬機(jī)詳解之概述、對(duì)象生存法則
這篇文章主要介紹了Java虛擬機(jī)詳解之概述、對(duì)象生存法則,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04java連接SQL Server數(shù)據(jù)庫的方法
這篇文章主要為大家詳細(xì)介紹了java連接SQL Server數(shù)據(jù)庫的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Java通過調(diào)用FFMPEG獲取視頻時(shí)長
這篇文章主要為大家詳細(xì)介紹了Java通過調(diào)用FFMPEG獲取視頻時(shí)長,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04SpringBoot從0到1整合銀聯(lián)無跳轉(zhuǎn)支付功能附源碼
這篇文章主要介紹了SpringBoot從0到1整合銀聯(lián)無跳轉(zhuǎn)功能支付附源碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11CommonMark 使用教程:將 Markdown 語法轉(zhuǎn)成 Html
這篇文章主要介紹了CommonMark 使用教程:將 Markdown 語法轉(zhuǎn)成 Html,這個(gè)技巧我們做任何網(wǎng)站都可以用到,而且非常好用。,需要的朋友可以參考下2019-06-06