MyBatis分頁(yè)查詢與特殊字符處理方式
一、引言
1.1 簡(jiǎn)介Mybatis
MyBatis是一種基于Java的持久層框架,它實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)的操作,并使用Java對(duì)象映射關(guān)系表中的記錄,即將關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)映射到Java對(duì)象中,提供了一種優(yōu)雅的方式來(lái)訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)。
MyBatis最重要的特點(diǎn)是它的SQL映射,使得開(kāi)發(fā)人員可以使用XML或注解的方式將SQL語(yǔ)句與Java代碼進(jìn)行解耦,從而提高了代碼的可維護(hù)性和可讀性,并降低了整個(gè)應(yīng)用程序的復(fù)雜度。MyBatis還支持動(dòng)態(tài)SQL,這意味著你可以在不同的場(chǎng)景下根據(jù)不同的條件來(lái)生成SQL查詢語(yǔ)句。
MyBatis已經(jīng)成為Java開(kāi)發(fā)領(lǐng)域中最受歡迎的持久層框架之一,廣泛應(yīng)用于企業(yè)級(jí)應(yīng)用程序中。
有時(shí)候我們需要從不同的角度來(lái)理解技術(shù)概念,下面我將用類比的方式介紹MyBatis
MyBatis就像一個(gè)翻譯,它將數(shù)據(jù)庫(kù)中的信息轉(zhuǎn)化成為Java對(duì)象,或者將Java對(duì)象的更新操作翻譯成為對(duì)數(shù)據(jù)庫(kù)的更新。這樣,我們就不需要直接去操作數(shù)據(jù)庫(kù),而是通過(guò)MyBatis來(lái)完成交互。MyBatis就像翻譯一樣,幫助我們用更加簡(jiǎn)單、易懂的方式與數(shù)據(jù)庫(kù)進(jìn)行交互。
在MyBatis中,我們可以使用類似于翻譯所用的“語(yǔ)言工具”——SQL映射,來(lái)定義連接數(shù)據(jù)庫(kù)的語(yǔ)句。這就像在翻譯時(shí),使用特定的語(yǔ)言工具來(lái)對(duì)話一樣,我們可以使用SQL映射來(lái)定義與數(shù)據(jù)庫(kù)交互時(shí)的具體步驟。
此外,MyBatis還支持動(dòng)態(tài)SQL,這意味著我們可以根據(jù)不同的需要,動(dòng)態(tài)生成SQL語(yǔ)句。我們可以將其想象成翻譯時(shí)要根據(jù)不同的場(chǎng)景,采用不同的語(yǔ)言表達(dá)。
總的來(lái)說(shuō),MyBatis就是一個(gè)用于數(shù)據(jù)庫(kù)交互的“翻譯”,它通過(guò)SQL映射實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,幫助我們更好地理解和使用數(shù)據(jù)庫(kù)。
1.2分頁(yè)查詢的重要性
- 分頁(yè)查詢是指將查詢結(jié)果按照固定的每頁(yè)大小分割成若干頁(yè),使得客戶端可以分批次獲取數(shù)據(jù),從而避免一次性獲取過(guò)多數(shù)據(jù)導(dǎo)致內(nèi)存溢出或網(wǎng)絡(luò)傳輸延遲過(guò)高等問(wèn)題。在實(shí)際項(xiàng)目中,分頁(yè)查詢有著非常重要的作用。
- 首先,分頁(yè)查詢可以提高系統(tǒng)的性能和效率。如果不進(jìn)行分頁(yè)查詢,在數(shù)據(jù)量比較大的情況下,一次性將所有數(shù)據(jù)都查詢出來(lái),需要占用大量?jī)?nèi)存和計(jì)算資源,導(dǎo)致系統(tǒng)緩慢、響應(yīng)時(shí)間延長(zhǎng)。而通過(guò)分頁(yè)查詢,每次只查詢指定數(shù)量的數(shù)據(jù),大大縮短了查詢時(shí)間,節(jié)省了系統(tǒng)資源。
- 其次,分頁(yè)查詢可以提升用戶體驗(yàn)。在網(wǎng)頁(yè)、移動(dòng)應(yīng)用等場(chǎng)景中,如果用戶需要查看全部數(shù)據(jù),而又需要等待很長(zhǎng)時(shí)間,會(huì)給用戶帶來(lái)極差的體驗(yàn),甚至?xí)?dǎo)致用戶流失。而通過(guò)分頁(yè)查詢,用戶可以逐頁(yè)查看,不需要等待全部數(shù)據(jù)加載完成,提升了用戶的體驗(yàn)。
- 最后,分頁(yè)查詢?cè)跀?shù)據(jù)處理和展示方面也非常有用。在面對(duì)大量數(shù)據(jù)時(shí),分頁(yè)查詢可以按照實(shí)際需要展示數(shù)據(jù),讓用戶更加關(guān)注自己感興趣的數(shù)據(jù),同時(shí)也可以更靈活地控制數(shù)據(jù)的展示方式和數(shù)量。
分頁(yè)查詢就好比我們?cè)陂喿x一本厚厚的書(shū)籍時(shí),為了方便閱讀和理解,我們會(huì)將書(shū)籍按照章節(jié)或者頁(yè)碼進(jìn)行分割,每次只閱讀一頁(yè)或者一段內(nèi)容,而不是一次性將整本書(shū)全部閱讀完畢。
這樣做的好處是,首先可以提高我們閱讀的效率,不需要一次性讀完整本書(shū),而是按需閱讀,可以更快地找到我們感興趣的內(nèi)容。其次,分頁(yè)查詢可以減少我們的記憶負(fù)擔(dān),不需要一次性記住整本書(shū)的內(nèi)容,而是只需要記住當(dāng)前閱讀的部分內(nèi)容即可。此外,分頁(yè)查詢還可以提供快速定位和導(dǎo)航的功能,我們可以根據(jù)需要跳轉(zhuǎn)到指定的頁(yè)碼或者按照特定的條件進(jìn)行查詢。
類似地,分頁(yè)查詢?cè)谲浖_(kāi)發(fā)中也具有類似的作用。當(dāng)我們需要查詢大量的數(shù)據(jù)時(shí),為了提高查詢效率和用戶體驗(yàn),我們可以將數(shù)據(jù)按照一頁(yè)一頁(yè)的方式進(jìn)行分割,每次只查詢一頁(yè)或者一段數(shù)據(jù),而不是一次性將所有數(shù)據(jù)都查詢出來(lái)。這樣可以減少網(wǎng)絡(luò)傳輸量,降低服務(wù)器資源消耗,并且支持快速定位和導(dǎo)航功能,方便用戶快速找到所需的數(shù)據(jù)。
因此,分頁(yè)查詢?cè)趯?shí)際開(kāi)發(fā)中具有重要性,可以提高查詢效率,減少資源消耗,支持快速定位和導(dǎo)航,以及適應(yīng)數(shù)據(jù)量的動(dòng)態(tài)變化。通過(guò)將數(shù)據(jù)分割成一頁(yè)一頁(yè)的方式進(jìn)行查詢,可以更好地滿足用戶的需求,提高系統(tǒng)的性能和用戶體驗(yàn)。
1.3MyBatis特殊字符處理的挑戰(zhàn)
當(dāng)我們?cè)谑褂肕yBatis這個(gè)數(shù)據(jù)庫(kù)操作框架時(shí),有時(shí)會(huì)涉及到特殊字符的處理,這可能會(huì)帶來(lái)一些問(wèn)題。讓我們用更通俗的語(yǔ)言來(lái)解釋一下這個(gè)情況。
挑戰(zhàn)1:SQL注入漏洞
SQL注入是一種常見(jiàn)的攻擊方式,攻擊者可以通過(guò)在用戶輸入中插入惡意SQL代碼來(lái)篡改數(shù)據(jù)庫(kù)查詢。MyBatis中如果沒(méi)有正確處理特殊字符,可能會(huì)導(dǎo)致應(yīng)用程序受到SQL注入攻擊。
想象一下,你在一個(gè)網(wǎng)站上搜索商品,輸入關(guān)鍵詞后網(wǎng)站會(huì)幫你從數(shù)據(jù)庫(kù)中找到相關(guān)商品。但是,如果網(wǎng)站沒(méi)有正確處理你輸入的內(nèi)容,有些聰明的人可能會(huì)在搜索框里輸入一些惡意的代碼,從而讓網(wǎng)站執(zhí)行不正常的操作,甚至可能竊取數(shù)據(jù)。這就好比在搜索框里輸入一些“壞話”,讓網(wǎng)站被欺騙了。
挑戰(zhàn)2:查詢結(jié)果異常
特殊字符可能會(huì)干擾數(shù)據(jù)庫(kù)查詢,導(dǎo)致查詢結(jié)果不符合預(yù)期。例如,如果查詢中包含未經(jīng)處理的特殊字符,可能會(huì)導(dǎo)致查詢條件被解釋錯(cuò)誤,進(jìn)而返回不正確的數(shù)據(jù)。
想象一下,你在圖書(shū)館借書(shū),但是圖書(shū)管理員誤解了你的請(qǐng)求。這可能導(dǎo)致你拿到一本和你想要的完全不同的書(shū)。在數(shù)據(jù)庫(kù)中,特殊字符可能會(huì)讓查詢的時(shí)候出現(xiàn)類似的誤解,導(dǎo)致我們得到錯(cuò)誤的信息。
挑戰(zhàn)3:數(shù)據(jù)完整性問(wèn)題
特殊字符可能會(huì)影響數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性。例如,某些特殊字符可能會(huì)被誤認(rèn)為是SQL關(guān)鍵字或操作符,從而破壞原本的查詢邏輯,甚至影響數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
假設(shè)你是一位餐廳的服務(wù)員,你接受顧客點(diǎn)餐。如果你沒(méi)有聽(tīng)清楚或者誤解了顧客的點(diǎn)餐要求,可能會(huì)讓廚房做出錯(cuò)誤的菜品。在數(shù)據(jù)庫(kù)中,特殊字符可能讓我們誤解用戶的請(qǐng)求,可能導(dǎo)致我們處理錯(cuò)誤的數(shù)據(jù)。
挑戰(zhàn)4:跨平臺(tái)兼容性
不同的數(shù)據(jù)庫(kù)系統(tǒng)對(duì)于特殊字符的處理方式可能會(huì)有所不同。在應(yīng)用程序需要在不同數(shù)據(jù)庫(kù)平臺(tái)之間切換時(shí),特殊字符的處理可能會(huì)變得更加復(fù)雜,需要考慮跨平臺(tái)的兼容性問(wèn)題。
想象一下,你習(xí)慣用母語(yǔ)和朋友交流,但是突然要和外國(guó)朋友用另一種語(yǔ)言交流,可能會(huì)有些困難。在數(shù)據(jù)庫(kù)中,不同的數(shù)據(jù)庫(kù)系統(tǒng)也有自己的語(yǔ)言規(guī)則,特殊字符在這些規(guī)則之間可能會(huì)有不同的解釋,導(dǎo)致我們?cè)谇袚Q數(shù)據(jù)庫(kù)平臺(tái)時(shí)遇到困難。
挑戰(zhàn)5:用戶體驗(yàn)
用戶輸入的特殊字符如果沒(méi)有得到適當(dāng)處理,可能會(huì)導(dǎo)致應(yīng)用程序出現(xiàn)錯(cuò)誤,影響用戶體驗(yàn)。為了確保應(yīng)用的穩(wěn)定性和友好性,特殊字符處理是至關(guān)重要的。
想象一下,你在一個(gè)購(gòu)物網(wǎng)站想買一款商品,但是網(wǎng)站出現(xiàn)了錯(cuò)誤,你無(wú)法完成購(gòu)買。這會(huì)讓你感到很糟糕,不是嗎?特殊字符如果沒(méi)有被正確處理,可能會(huì)導(dǎo)致網(wǎng)站出錯(cuò),影響用戶的使用體驗(yàn)。
為了應(yīng)對(duì)這些挑戰(zhàn),就像我們需要用心傾聽(tīng)朋友的話語(yǔ)一樣,MyBatis在處理特殊字符時(shí)需要小心謹(jǐn)慎。我們可以采取一些方法,比如把特殊字符翻譯成一種安全的語(yǔ)言,就像把外語(yǔ)翻譯成我們能理解的語(yǔ)言一樣?;蛘呶覀兛梢允孪葯z查一下用戶輸入的內(nèi)容,確保它是合法和安全的,就像在點(diǎn)餐前確認(rèn)一下顧客的需求一樣。通過(guò)這些方法,我們可以保護(hù)數(shù)據(jù)庫(kù)的安全,同時(shí)提供良好的用戶體驗(yàn)。
如何應(yīng)對(duì)挑戰(zhàn)
為了有效地應(yīng)對(duì)這些挑戰(zhàn),可以考慮以下策略:
參數(shù)化查詢: 在使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)查詢時(shí),盡量使用參數(shù)化查詢而不是將用戶輸入直接插入SQL語(yǔ)句中。參數(shù)化查詢能夠防止惡意輸入被解釋為代碼。
就好比在餐廳點(diǎn)餐時(shí),我們告訴服務(wù)員我們想要的食物,而不是親自去廚房告訴廚師。在數(shù)據(jù)庫(kù)查詢中,我們可以使用參數(shù)化查詢,將我們需要的信息告訴MyBatis,它會(huì)幫助我們構(gòu)建查詢語(yǔ)句。這樣做可以防止不良的輸入被當(dāng)作“壞代碼”執(zhí)行。
字符轉(zhuǎn)義: MyBatis提供了字符轉(zhuǎn)義的方法,可以將特殊字符轉(zhuǎn)換為安全的形式,避免其被錯(cuò)誤解釋。例如,使用<![CDATA[ ]]>來(lái)包裹包含特殊字符的查詢。
像是在寫(xiě)信時(shí),如果我們想要在信中表達(dá)特殊意義的詞匯,我們會(huì)用特殊的標(biāo)記或符號(hào)來(lái)表示。在MyBatis中,我們可以使用特殊的符號(hào)(例如<![CDATA[ ]]>)來(lái)“包裝”包含特殊字符的查詢語(yǔ)句,這樣可以確保這些字符被正確理解,不會(huì)引發(fā)錯(cuò)誤。
輸入驗(yàn)證: 在接受用戶輸入之前,進(jìn)行必要的輸入驗(yàn)證和過(guò)濾,確保只有合法的輸入被傳遞給數(shù)據(jù)庫(kù)查詢。
就好比在接受朋友的禮物前,我們會(huì)先檢查一下禮物是否合適,是不是有什么問(wèn)題。在數(shù)據(jù)庫(kù)查詢中,我們?cè)谑褂糜脩籼峁┑男畔⑶?,可以進(jìn)行驗(yàn)證和過(guò)濾,確保只有合法、安全的內(nèi)容被傳遞給數(shù)據(jù)庫(kù),就像我們只接受合適的禮物一樣。
使用框架工具: MyBatis有一些第三方的分頁(yè)插件和安全插件,可以幫助處理分頁(yè)和特殊字符問(wèn)題。例如,PageHelper插件可以簡(jiǎn)化分頁(yè)查詢,同時(shí)提供一些防范SQL注入的措施。
有些時(shí)候,我們會(huì)使用一些工具來(lái)幫助我們完成任務(wù),就像在做家務(wù)時(shí)使用掃帚一樣。在MyBatis中,有一些第三方插件可以幫助我們更容易地處理分頁(yè)和特殊字符問(wèn)題。例如,有一個(gè)叫做PageHelper的插件可以簡(jiǎn)化分頁(yè)查詢,同時(shí)幫助我們防范SQL注入等問(wèn)題。
測(cè)試和審查: 在實(shí)施特殊字符處理的策略后,進(jìn)行充分的測(cè)試和代碼審查,確保特殊字符處理能夠在不同場(chǎng)景下正常工作,并且不會(huì)引入新的問(wèn)題。
在采取措施后,我們通常會(huì)檢查一下結(jié)果是否符合預(yù)期,以確保沒(méi)有問(wèn)題出現(xiàn)。在MyBatis中也是一樣,我們可以進(jìn)行充分的測(cè)試,確認(rèn)特殊字符處理在不同情況下都能正常工作。同時(shí),通過(guò)代碼審查,我們可以確保特殊字符處理的策略沒(méi)有引入新的錯(cuò)誤。
總之,MyBatis特殊字符處理的挑戰(zhàn)需要認(rèn)真對(duì)待。通過(guò)采取適當(dāng)?shù)念A(yù)防措施和安全策略,可以有效地減輕這些挑戰(zhàn)帶來(lái)的風(fēng)險(xiǎn),保護(hù)應(yīng)用程序的安全和穩(wěn)定性。
二、Mybatis分頁(yè)查詢
2.1 Mybatis分頁(yè)查詢的原理
MyBatis是一種Java持久層框架,用于簡(jiǎn)化與數(shù)據(jù)庫(kù)的交互操作。在MyBatis中進(jìn)行分頁(yè)查詢是常見(jiàn)的需求,其原理涉及兩個(gè)主要方面:SQL語(yǔ)句的編寫(xiě)和數(shù)據(jù)庫(kù)的分頁(yè)機(jī)制。
以下是MyBatis分頁(yè)查詢的基本原理:
SQL語(yǔ)句編寫(xiě): 在MyBatis中,你需要編寫(xiě)支持分頁(yè)的SQL語(yǔ)句。通常使用LIMIT和OFFSET關(guān)鍵字來(lái)實(shí)現(xiàn)分頁(yè)。LIMIT用于指定每頁(yè)顯示的記錄數(shù),OFFSET表示從查詢結(jié)果中的第幾條記錄開(kāi)始獲取數(shù)據(jù)。示例SQL語(yǔ)句:
sql
SELECT * FROM your_tableLIMIT #{pageSize} OFFSET #{offset}在MyBatis的Mapper XML文件中,你可以通過(guò)參數(shù)化的方式傳遞pageSize和offset的值。
- Java代碼配置: 在Java代碼中,你需要配置分頁(yè)參數(shù)和調(diào)用MyBatis的查詢方法。通常使用一個(gè)包含分頁(yè)信息的Java對(duì)象來(lái)傳遞給Mapper中的方法。這個(gè)Java對(duì)象通常包含當(dāng)前頁(yè)數(shù)、每頁(yè)記錄數(shù)等信息。
- 數(shù)據(jù)庫(kù)分頁(yè)機(jī)制: 不同的數(shù)據(jù)庫(kù)系統(tǒng)有不同的分頁(yè)機(jī)制。例如,MySQL使用
LIMIT和OFFSET來(lái)實(shí)現(xiàn)分頁(yè),而Oracle數(shù)據(jù)庫(kù)使用ROWNUM或ROW_NUMBER()函數(shù)。MyBatis會(huì)根據(jù)不同的數(shù)據(jù)庫(kù)類型生成相應(yīng)的分頁(yè)SQL。 - 執(zhí)行查詢: MyBatis框架會(huì)根據(jù)配置和傳遞的參數(shù)生成分頁(yè)SQL語(yǔ)句,然后執(zhí)行查詢。查詢結(jié)果將被映射到Java對(duì)象中,你可以通過(guò)這些對(duì)象獲取分頁(yè)數(shù)據(jù)。
- 返回結(jié)果: 查詢結(jié)果會(huì)包含所請(qǐng)求頁(yè)的數(shù)據(jù),你可以將這些數(shù)據(jù)返回給調(diào)用方進(jìn)行顯示或處理。
在MyBatis中,分頁(yè)查詢通常涉及到兩個(gè)參數(shù):當(dāng)前頁(yè)碼和每頁(yè)記錄數(shù)。MyBatis會(huì)根據(jù)這些參數(shù)計(jì)算出offset,以及動(dòng)態(tài)生成適合數(shù)據(jù)庫(kù)類型的分頁(yè)SQL語(yǔ)句。以下是一個(gè)簡(jiǎn)單的MyBatis分頁(yè)查詢示例:
java
public interface YourMapper {
List<YourEntity> getRecordsWithPagination(@Param("offset") int offset, @Param("pageSize") int pageSize);
}xml
<!-- Mapper XML -->
<select id="getRecordsWithPagination" resultType="your.package.YourEntity">
SELECT * FROM your_table
LIMIT #{pageSize} OFFSET #{offset}
</select>在調(diào)用MyBatis的查詢方法時(shí),你需要計(jì)算offset的值,這可以通過(guò)(currentPage - 1) * pageSize來(lái)實(shí)現(xiàn),其中currentPage是當(dāng)前頁(yè)碼。
MyBatis的分頁(yè)查詢?cè)砩婕暗絊QL語(yǔ)句的編寫(xiě)、Java代碼的配置和數(shù)據(jù)庫(kù)的分頁(yè)機(jī)制。
通過(guò)合理配置和使用參數(shù),你可以在MyBatis中實(shí)現(xiàn)有效的分頁(yè)查詢功能。
簡(jiǎn)單點(diǎn)來(lái)解釋MyBatis分頁(yè)查詢?cè)頃r(shí),你可以把它想象成在圖書(shū)館找一本厚厚的書(shū):
- 找書(shū)目標(biāo): 假設(shè)你要從圖書(shū)館的書(shū)架上找到一本書(shū),但你不想一次拿太多,想分幾次拿。這本書(shū)的內(nèi)容就相當(dāng)于數(shù)據(jù)庫(kù)中的數(shù)據(jù)。
- 拿書(shū)策略: 你決定每次拿出固定數(shù)量的書(shū),比如每次拿10本,然后你想從書(shū)架的特定位置開(kāi)始拿,不從第一頁(yè)開(kāi)始,因?yàn)檫@樣效率更高。這個(gè)拿書(shū)的策略就相當(dāng)于數(shù)據(jù)庫(kù)的分頁(yè)操作。
- 書(shū)的位置: 你知道你要從書(shū)架的第100本開(kāi)始拿,這是因?yàn)橹耙呀?jīng)拿過(guò)前面的書(shū)。這個(gè)位置就相當(dāng)于數(shù)據(jù)庫(kù)中的偏移量(OFFSET)。
- 每次拿多少: 你決定每次拿10本書(shū),這樣不會(huì)太重。這個(gè)數(shù)量就相當(dāng)于數(shù)據(jù)庫(kù)中每頁(yè)顯示的記錄數(shù)(pageSize)。
- 總共多少本: 你可能還會(huì)翻開(kāi)書(shū)來(lái)看一下總共有多少本,這樣你就知道要拿幾次才能把整本書(shū)拿完。這個(gè)總數(shù)就相當(dāng)于數(shù)據(jù)庫(kù)中總記錄數(shù)。
- 整理書(shū)籍: 每次拿完書(shū)后,你把它們整理在一起,方便后面閱讀。這就相當(dāng)于把數(shù)據(jù)庫(kù)查詢結(jié)果映射到Java對(duì)象中,方便后續(xù)處理。
綜合起來(lái),MyBatis分頁(yè)查詢?cè)砭拖衲阍趫D書(shū)館里找書(shū)一樣,通過(guò)明確的目標(biāo)、選擇合適的策略、計(jì)算書(shū)的位置和數(shù)量,以及整理書(shū)籍,最終從數(shù)據(jù)庫(kù)中獲取所需的分頁(yè)數(shù)據(jù)。
Mybatis 內(nèi)部使用 RowBounds 對(duì)象進(jìn)行分頁(yè),需要注意的是,它是針對(duì) ResultSet 結(jié)果集執(zhí)行的內(nèi)存分頁(yè),而非數(shù)據(jù)庫(kù)分頁(yè)。
所以,生產(chǎn)環(huán)境中,不適合直接使用 MyBatis 原有的 RowBounds 對(duì)象進(jìn)行分頁(yè)。而是使用如下兩種方案:
在 SQL 內(nèi)手動(dòng)書(shū)寫(xiě)數(shù)據(jù)庫(kù)分頁(yè)的參數(shù)來(lái)完成分頁(yè)功能,樣例代碼如下:
select * from t_user limit #{start}, #{pageSize}也可使用開(kāi)源的分頁(yè)插件來(lái)完成數(shù)據(jù)庫(kù)分頁(yè), 如:
Mybatis-PageHelperMyBatis-Plus (): (未來(lái)使用更加廣泛)
注意:由于分頁(yè)插件是自動(dòng)添加limit拼接,往往針對(duì)一些復(fù)雜 SQL, 無(wú)法達(dá)到最大的 SQL 性能,更推薦手寫(xiě)分頁(yè) SQL, 也就是第一種方式。
2.2 使用RowBounds進(jìn)行分頁(yè)查詢
使用RowBounds是在MyBatis中進(jìn)行分頁(yè)查詢的一種方式。
RowBounds允許你在查詢方法中指定起始偏移量(offset)和要返回的最大記錄數(shù)(limit),從而實(shí)現(xiàn)分頁(yè)效果。
以下是如何使用RowBounds進(jìn)行分頁(yè)查詢的步驟:
更新Mapper接口: 首先,在你的Mapper接口中,修改查詢方法的簽名,以便接受RowBounds參數(shù)。例如:
java
public interface YourMapper {
List<YourEntity> getRecordsWithPagination(RowBounds rowBounds);
}編寫(xiě)Mapper XML: 在Mapper XML文件中,編寫(xiě)SQL查詢語(yǔ)句,但不再使用LIMIT和OFFSET關(guān)鍵字來(lái)分頁(yè)。相反,你可以使用RowBounds參數(shù)的信息來(lái)處理分頁(yè)。示例:
xml
<!-- Mapper XML -->
<select id="getRecordsWithPagination" resultType="your.package.YourEntity">
SELECT * FROM your_table
</select>調(diào)用查詢方法: 在Java代碼中,調(diào)用查詢方法時(shí),創(chuàng)建一個(gè)RowBounds對(duì)象并傳遞給查詢方法。你需要設(shè)置起始偏移量和最大記錄數(shù)。例如:
java
RowBounds rowBounds = new RowBounds(offset, pageSize); List<YourEntity> records = yourMapper.getRecordsWithPagination(rowBounds);
其中,offset是計(jì)算得出的偏移量,而pageSize是每頁(yè)顯示的記錄數(shù)。
使用RowBounds的好處是,它更緊密地與MyBatis的核心結(jié)合,但它可能在某些情況下不夠靈活,特別是在一些高級(jí)用例中。如果你需要更多的分頁(yè)控制,你可能需要考慮其他方式,如基于插件的分頁(yè)支持或使用PageHelper等第三方插件。
總之,使用RowBounds進(jìn)行分頁(yè)查詢是MyBatis的一種原生方式,它允許你在查詢方法中直接處理分頁(yè)參數(shù),而不需要在SQL中使用LIMIT和OFFSET關(guān)鍵字。
- 解釋:如何使用
RowBounds進(jìn)行分頁(yè)查詢,你可以將其類比成閱讀一本書(shū),你只想看書(shū)中的某一頁(yè)內(nèi)容,而不是從頭到尾閱讀整本書(shū)。 - 選擇目標(biāo)頁(yè): 假設(shè)你正在閱讀一本書(shū),你想跳到書(shū)中的某一頁(yè)。這個(gè)目標(biāo)頁(yè)就相當(dāng)于數(shù)據(jù)庫(kù)中的某個(gè)分頁(yè)。
- 確定起始位置: 你會(huì)在書(shū)的目錄或章節(jié)列表中查找目標(biāo)頁(yè)的起始位置,這告訴你在哪一頁(yè)開(kāi)始。這個(gè)起始位置就相當(dāng)于數(shù)據(jù)庫(kù)中的偏移量(offset)。
- 閱讀多少頁(yè): 你決定從目標(biāo)頁(yè)開(kāi)始閱讀多少頁(yè),這個(gè)數(shù)量決定了你要閱讀多少內(nèi)容。這個(gè)數(shù)量就相當(dāng)于數(shù)據(jù)庫(kù)中每頁(yè)的記錄數(shù)(pageSize)。
- 獲取內(nèi)容: 你按照上述信息翻到目標(biāo)頁(yè)的起始位置,并開(kāi)始閱讀,只關(guān)注閱讀多少頁(yè)的內(nèi)容。這個(gè)內(nèi)容就相當(dāng)于數(shù)據(jù)庫(kù)中返回的分頁(yè)數(shù)據(jù)。
- 整理信息: 你可以將閱讀到的內(nèi)容記錄下來(lái),以備后續(xù)處理。這就相當(dāng)于將數(shù)據(jù)庫(kù)查詢結(jié)果映射到Java對(duì)象中,方便后續(xù)使用。
綜合來(lái)看,使用RowBounds進(jìn)行分頁(yè)查詢就像你閱讀一本書(shū)的特定頁(yè),你選擇了目標(biāo)頁(yè)、確定了起始位置、閱讀了特定數(shù)量的頁(yè),然后整理了你所讀的內(nèi)容。這種方式讓你只專注于獲取特定頁(yè)的內(nèi)容,而不需要處理過(guò)多的細(xì)節(jié)。
2.3使用插件進(jìn)行分頁(yè)查詢
使用PageHelper插件進(jìn)行分頁(yè)查詢
pom.xml導(dǎo)入PageHelper插件
<!-- ********************** 分頁(yè) Pom依賴 ********************** -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>mybatis.xml配置攔截器
<plugins>
<!-- 配置分頁(yè)插件PageHelper, 4.0.0以后的版本支持自動(dòng)識(shí)別使用的數(shù)據(jù)庫(kù) -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
</plugin>
</plugins>Mapper.xml的配置:
<select id="cx4" resultType="com.liao.model.Book" parameterType="java.util.Map" >
select
<include refid="Base_Column_List" />
from t_mvc_book
where bname like concat('%',#{bname},'%')
</select>導(dǎo)入PageBean工具類
package com.liao.util;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;
public class PageBean implements Serializable {
//頁(yè)碼
private int page=1;
//每頁(yè)顯示記錄數(shù)
private int rows=10;
//總記錄數(shù)
private int total=0;
//是否分頁(yè)
private boolean isPagination=true;
//上一次的請(qǐng)求路徑
private String url;
//獲取所有的請(qǐng)求參數(shù)
private Map<String,String[]> map;
public PageBean() {
super();
}
//設(shè)置請(qǐng)求參數(shù)
public void setRequest(HttpServletRequest req) {
String page=req.getParameter("page");
String rows=req.getParameter("rows");
String pagination=req.getParameter("pagination");
this.setPage(page);
this.setRows(rows);
this.setPagination(pagination);
this.url=req.getContextPath()+req.getServletPath();
this.map=req.getParameterMap();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map<String, String[]> getMap() {
return map;
}
public void setMap(Map<String, String[]> map) {
this.map = map;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public void setPage(String page) {
if(null!=page&&!"".equals(page.trim()))
this.page = Integer.parseInt(page);
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public void setRows(String rows) {
if(null!=rows&&!"".equals(rows.trim()))
this.rows = Integer.parseInt(rows);
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public void setTotal(String total) {
this.total = Integer.parseInt(total);
}
public boolean isPagination() {
return isPagination;
}
public void setPagination(boolean isPagination) {
this.isPagination = isPagination;
}
public void setPagination(String isPagination) {
if(null!=isPagination&&!"".equals(isPagination.trim()))
this.isPagination = Boolean.parseBoolean(isPagination);
}
/**
* 獲取分頁(yè)起始標(biāo)記位置
* @return
*/
public int getStartIndex() {
//(當(dāng)前頁(yè)碼-1)*顯示記錄數(shù)
return (this.getPage()-1)*this.rows;
}
/**
* 末頁(yè)
* @return
*/
public int getMaxPage() {
int totalpage=this.total/this.rows;
if(this.total%this.rows!=0)
totalpage++;
return totalpage;
}
/**
* 下一頁(yè)
* @return
*/
public int getNextPage() {
int nextPage=this.page+1;
if(this.page>=this.getMaxPage())
nextPage=this.getMaxPage();
return nextPage;
}
/**
* 上一頁(yè)
* @return
*/
public int getPreivousPage() {
int previousPage=this.page-1;
if(previousPage<1)
previousPage=1;
return previousPage;
}
@Override
public String toString() {
return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
+ "]";
}
}Mapper類方法:
List<Book> cx4(@Param("bname") String bname);接口方法:
List<Book> cx4(String bname, PageBean pageBean);
實(shí)現(xiàn)接口
@Override
public List<Book> cx4(String bname, PageBean pageBean) {
if(pageBean!=null && pageBean.isPagination()){
PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
}
List<Book> books=bookMapper.cx4("圣墟");
if(pageBean!=null && pageBean.isPagination()){
PageInfo<Book> info = new PageInfo<Book>(books);
System.out.println("當(dāng)前頁(yè):"+ info.getPageNum());
System.out.println("展示記錄數(shù):"+info.getPageSize());
System.out.println("符合查詢條件的總記錄:"+info.getTotal());
pageBean.setTotal((int) info.getTotal());
}
return books;
}測(cè)試:
@Test
public void cx4() {
PageBean pageBean=new PageBean();//實(shí)例化PageBean
pageBean.setPage(2);//第幾頁(yè)
pageBean.setRows(15);//顯示的條目
bookBiz.cx4("圣墟",pageBean).forEach(System.out::println);//模糊查詢
}2.4為什么要重寫(xiě)MyBatis的分頁(yè)?
當(dāng)我們使用MyBatis來(lái)進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),它提供了一個(gè)默認(rèn)的分頁(yè)功能,就好比在一本書(shū)中,每頁(yè)都有固定數(shù)量的字?jǐn)?shù)。但是,有時(shí)候我們的需求可能比較特殊,就像我們希望書(shū)中的一頁(yè)可以容納更多或者更少的字?jǐn)?shù)一樣。這時(shí)候,我們就需要對(duì)MyBatis的分頁(yè)功能進(jìn)行重新設(shè)計(jì),以適應(yīng)我們的特殊需求。
- 特殊需求: 有時(shí)候,我們需要按照特定的規(guī)則進(jìn)行分頁(yè),例如按照不同的條件進(jìn)行排序,或者按照特殊的算法來(lái)分頁(yè)。就像我們希望書(shū)的每一頁(yè)都按照章節(jié)內(nèi)容來(lái)分,而不是簡(jiǎn)單地按照字?jǐn)?shù)。
- 特殊數(shù)據(jù)庫(kù): MyBatis的默認(rèn)分頁(yè)插件可以根據(jù)不同的數(shù)據(jù)庫(kù)類型自動(dòng)選擇適合的分頁(yè)方法。但是,如果我們使用的是非常特殊的數(shù)據(jù)庫(kù),可能需要自己編寫(xiě)分頁(yè)邏輯,就像我們?cè)谝恍┨厥鈭?chǎng)合需要用不同的寫(xiě)作工具一樣。
- 復(fù)雜查詢: 有時(shí)候,我們需要進(jìn)行復(fù)雜的查詢,這些查詢可能無(wú)法通過(guò)默認(rèn)的分頁(yè)插件實(shí)現(xiàn)。就像我們想要在書(shū)中找到特定的關(guān)鍵詞所在的頁(yè)碼一樣,可能需要更加復(fù)雜的處理。
- 與其他工具整合: 如果我們的項(xiàng)目中還使用了其他框架或者服務(wù),可能需要讓這些工具一起協(xié)作來(lái)實(shí)現(xiàn)分頁(yè)需求。就像我們?cè)诙鄠€(gè)團(tuán)隊(duì)合作時(shí),需要大家一起努力來(lái)達(dá)成共同目標(biāo)。
- 提升性能: 盡管默認(rèn)分頁(yè)插件能夠滿足絕大部分情況,但在處理大量數(shù)據(jù)時(shí),可能會(huì)對(duì)性能產(chǎn)生影響。這時(shí)候,我們可以重新設(shè)計(jì)分頁(yè)邏輯,以提升查詢性能。
- 特殊數(shù)據(jù)展示: 有時(shí)候,我們希望分頁(yè)結(jié)果中包含一些特殊的數(shù)據(jù),例如總計(jì)數(shù)量、平均值等。就像我們?cè)跁?shū)的每一頁(yè)下面添加一些注釋一樣,這些注釋可能不是原來(lái)的內(nèi)容。
原因: Mybatis的分頁(yè)功能很弱,它是基于內(nèi)存的分頁(yè)(查出所有記錄再按偏移量offset和邊界limit取結(jié)果),在大數(shù)據(jù)量的情況下這樣的分頁(yè)基本上是沒(méi)有用的
總的來(lái)說(shuō),重寫(xiě)MyBatis的分頁(yè)功能是為了更好地適應(yīng)我們的特殊需求,就像我們?cè)趯?xiě)作時(shí)需要根據(jù)具體情況來(lái)選擇不同的寫(xiě)作方式。這需要我們對(duì)分頁(yè)的原理和項(xiàng)目的實(shí)際情況有一定的了解,以便更好地滿足我們的業(yè)務(wù)需求。如果默認(rèn)的分頁(yè)功能無(wú)法滿足我們的要求,重新設(shè)計(jì)分頁(yè)邏輯可能會(huì)是一個(gè)不錯(cuò)的選擇。
三、特殊字符處理
3.1特殊字符對(duì)查詢結(jié)果的影響
特殊字符在數(shù)據(jù)庫(kù)查詢結(jié)果中可能會(huì)產(chǎn)生不同的影響,取決于數(shù)據(jù)庫(kù)查詢語(yǔ)句的構(gòu)造和特殊字符的處理方式。
以下是一些可能的影響情況:
- SQL注入: 如果特殊字符沒(méi)有得到正確的處理,惡意用戶可能利用SQL注入攻擊來(lái)篡改查詢語(yǔ)句,獲取敏感數(shù)據(jù)或破壞數(shù)據(jù)庫(kù)。通過(guò)轉(zhuǎn)義字符或參數(shù)化查詢,可以防止這種情況發(fā)生。
- 查詢錯(cuò)誤: 如果查詢語(yǔ)句中包含未轉(zhuǎn)義的特殊字符,數(shù)據(jù)庫(kù)可能會(huì)誤解查詢的意圖,導(dǎo)致錯(cuò)誤的查詢結(jié)果。特別是在需要精確匹配的情況下,如使用
LIKE運(yùn)算符時(shí),特殊字符可能引起意外結(jié)果。 - 字符截?cái)啵?/strong> 如果特殊字符沒(méi)有得到正確處理,數(shù)據(jù)庫(kù)可能會(huì)截?cái)嘧址驅(qū)⑵湟暈榉指舴瑥亩鴮?dǎo)致意外的數(shù)據(jù)截?cái)嗷蚍指睢?/li>
- 特殊符號(hào)的顯示: 如果查詢結(jié)果中包含HTML或XML中的特殊字符,如
<,>,&等,可能會(huì)影響在網(wǎng)頁(yè)或應(yīng)用程序中的顯示效果。這時(shí)需要對(duì)這些特殊字符進(jìn)行轉(zhuǎn)義,確保它們能夠正確顯示。- 轉(zhuǎn)義和反轉(zhuǎn)義問(wèn)題: 查詢結(jié)果中的特殊字符可能需要在展示時(shí)進(jìn)行轉(zhuǎn)義,但在某些情況下,如果進(jìn)行了多次轉(zhuǎn)義和反轉(zhuǎn)義,可能會(huì)導(dǎo)致特殊字符的處理出現(xiàn)問(wèn)題。
- 特殊符號(hào)的顯示: 如果查詢結(jié)果中包含HTML或XML中的特殊字符,如
總之,特殊字符的影響取決于數(shù)據(jù)庫(kù)查詢的構(gòu)造、數(shù)據(jù)的處理方式以及在展示時(shí)的處理。為了避免問(wèn)題,應(yīng)當(dāng)根據(jù)上下文適當(dāng)?shù)剞D(zhuǎn)義和處理特殊字符,以確保查詢的正確性、安全性和顯示效果。
3.2特殊字符處理的解決方案
根據(jù)情況,您可以選擇其中一個(gè)或多個(gè)方法來(lái)確保在使用 Mybatis 時(shí)能夠處理特殊字符并保護(hù)應(yīng)用程序的安全性。
針對(duì) Mybatis 中的特殊字符處理,有幾種解決方案可以考慮:
- 使用轉(zhuǎn)義字符: 可以通過(guò)在特殊字符前添加轉(zhuǎn)義字符(例如:
\)來(lái)處理特殊字符,以確保它們被正確地插入到 SQL 查詢中。 - 使用正則表達(dá)式: 利用正則表達(dá)式來(lái)檢測(cè)并替換掉輸入中的特殊字符,以防止惡意代碼注入。
- 使用預(yù)處理語(yǔ)句: Mybatis 支持使用預(yù)處理語(yǔ)句,這樣數(shù)據(jù)庫(kù)會(huì)在執(zhí)行查詢之前對(duì)輸入進(jìn)行參數(shù)化處理,從而有效地防止 SQL 注入攻擊。
- 使用特殊字符過(guò)濾器: 開(kāi)發(fā)一個(gè)特殊字符過(guò)濾器,對(duì)輸入進(jìn)行過(guò)濾,將特殊字符或可能引發(fā)安全問(wèn)題的內(nèi)容進(jìn)行替換或刪除。
方案一:使用轉(zhuǎn)義字符
轉(zhuǎn)義字符是一種特殊的字符常量。轉(zhuǎn)義字符以反斜線""開(kāi)頭,后跟一個(gè)或幾個(gè)字符。轉(zhuǎn)義字符具有特定的含義,不同于字符原有的意義,故稱“轉(zhuǎn)義”字符。例如,在前面各例題printf函數(shù)的格式串中用到的“\n”就是一個(gè)轉(zhuǎn)義字符,其意義是“回車換行”。轉(zhuǎn)義字符主要用來(lái)表示那些用一般字符不便于表示的控制代碼。
不同的語(yǔ)言有不同的轉(zhuǎn)義符。如HTML轉(zhuǎn)義符、java 轉(zhuǎn)義符、xml 轉(zhuǎn)義符、 oracle 轉(zhuǎn)義符、sql 轉(zhuǎn)義符 、sqlserver 轉(zhuǎn)義符、php 轉(zhuǎn)義符、asp 轉(zhuǎn)義符、vb轉(zhuǎn)義符、 javascript 轉(zhuǎn)義符等等,還有網(wǎng)址中的百分號(hào)。
例如:
- HTML的< >&"©分別是 < > & " © 的轉(zhuǎn)義字符
- XML只有5個(gè)轉(zhuǎn)義符: < >& " ',分別對(duì)應(yīng)<>&"’
轉(zhuǎn)義符使用場(chǎng)景:
例:
- HTML中< > &等字符是有特殊含義的,其中 < > 用于鏈接簽,&用于轉(zhuǎn)義。
- Mybatis中< > 等字符在xml解析中是會(huì)報(bào)錯(cuò)的。
| 特殊字符 | 轉(zhuǎn)義字符 |
|---|---|
| < | < |
| > | > |
| & | & |
| " | " |
| ’ | ' |
| <= | <= |
| >= | >= |
方案二:使用xml的![CDATA[ ]]語(yǔ)法
<![CDATA[ ]]>是xml語(yǔ)法,在<![CDATA[ ]]>內(nèi)部的所有內(nèi)容都會(huì)被解析器忽略,不進(jìn)行轉(zhuǎn)義。
所以在xml中這是一種通用方案。
| 特殊字符 | <![CDATA[ ]]> |
|---|---|
| < | <![CDATA[<]]> |
| > | <![CDATA[>]]> |
| & | <![CDATA[&]]> |
| " | <![CDATA["]]> |
| ’ | <![CDATA[']]> |
| <= | <![CDATA[<=]]> |
| >= | <![CDATA[>=]]> |
| != | <![CDATA[!=]]> |
四、總結(jié)
Mybatis分頁(yè)查詢和特殊字符處理的重要性
當(dāng)你使用 Mybatis 進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),有兩個(gè)關(guān)鍵點(diǎn)至關(guān)重要:
1. 分頁(yè)查詢的重要性: 想象你有一個(gè)裝滿數(shù)據(jù)的大盒子,而你只能一次拿出一小部分?jǐn)?shù)據(jù)。如果你試圖一次性拿出所有數(shù)據(jù),你可能會(huì)遇到問(wèn)題:拿不動(dòng)、耗時(shí)很長(zhǎng)。分頁(yè)查詢就像你每次只拿出盒子里的一部分?jǐn)?shù)據(jù),這樣做有幾個(gè)好處:
速度更快: 不用等到所有數(shù)據(jù)都準(zhǔn)備好,所以能更快地開(kāi)始瀏覽數(shù)據(jù)。不會(huì)卡?。?/strong> 即使數(shù)據(jù)很多,也不會(huì)讓你的程序卡住或崩潰。不會(huì)忘記: 想象一次要拿出一大堆數(shù)據(jù),你可能會(huì)忘記拿哪些了。分頁(yè)就像一次只拿幾個(gè),不容易忘記。
2. 特殊字符處理的重要性: 想象你有一個(gè)魔法筆,你可以用它寫(xiě)出各種事物。但有些字會(huì)變成魔法,可能會(huì)讓你的朋友受傷。處理特殊字符就像你使用那支筆寫(xiě)字,但在寫(xiě)之前,你會(huì)檢查每個(gè)字,如果發(fā)現(xiàn)是魔法字,你會(huì)把它們變成普通字。這樣做有幾個(gè)好處:
保護(hù)朋友: 防止壞人利用魔法字來(lái)傷害你的朋友(你的數(shù)據(jù)庫(kù))。保持秩序: 魔法字可能會(huì)讓字句變得混亂,處理特殊字符就像保持字句的秩序,讓一切都運(yùn)行正常。避免麻煩: 如果你不處理特殊字符,你的字句可能變得奇怪,就像句子中出現(xiàn)亂碼,這會(huì)引起很多麻煩。
綜上所述,分頁(yè)查詢和特殊字符處理在數(shù)據(jù)庫(kù)操作中起著類似于整理數(shù)據(jù)和保護(hù)數(shù)據(jù)的作用,讓數(shù)據(jù)庫(kù)操作更快、更安全、更可靠。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- MyBatis-Plus實(shí)現(xiàn)對(duì)查詢結(jié)果進(jìn)行分頁(yè)的基本步驟
- MybatisPlus多表查詢及分頁(yè)查詢完整代碼
- MyBatis分頁(yè)查詢返回list的時(shí)候出現(xiàn)null的問(wèn)題
- mybatis-plus分頁(yè)查詢的實(shí)現(xiàn)實(shí)例
- MybatisPlus將自定義的sql列表查詢返回改為分頁(yè)查詢
- Mybatis實(shí)現(xiàn)分頁(yè)查詢的詳細(xì)流程
- mybatis-plus分頁(yè)查詢?nèi)N方法小結(jié)
- Java中Mybatis分頁(yè)查詢的四種傳參方式
- Mybatis分頁(yè)查詢主從表的實(shí)現(xiàn)示例
相關(guān)文章
java自定義日志輸出文件(log4j日志文件輸出多個(gè)自定義日志文件)
打印日志的在程序中是必不可少的,如果需要將不同的日志打印到不同的地方,則需要定義不同的Appender,然后定義每一個(gè)Appender的日志級(jí)別、打印形式和日志的輸出路徑,下面看一個(gè)示例吧2014-01-01
基于SpringBoot實(shí)現(xiàn)文件秒傳功能
在開(kāi)發(fā)Web應(yīng)用時(shí),文件上傳是一個(gè)常見(jiàn)需求,然而,當(dāng)用戶需要上傳大文件或相同文件多次時(shí),會(huì)造成帶寬浪費(fèi)和服務(wù)器存儲(chǔ)冗余,此時(shí)可以使用文件秒傳技術(shù)通過(guò)識(shí)別重復(fù)文件,本文就給大家介紹了如何基于SpringBoot實(shí)現(xiàn)文件秒傳功能,需要的朋友可以參考下2025-04-04
不寫(xiě)mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問(wèn)題分析
這篇文章主要為大家介紹了不寫(xiě)mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Java實(shí)現(xiàn)讀取超過(guò)內(nèi)存大小的文件
在一些場(chǎng)景下,我們需要處理的文件可能比我們機(jī)器所擁有的內(nèi)存要大,如果遇到這種情況該如何解決呢,本文就來(lái)和大家講講如何使用Java實(shí)現(xiàn)讀取超過(guò)內(nèi)存大小的文件吧2024-03-03

