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

MyBatis分頁(yè)查詢與特殊字符處理方式

 更新時(shí)間:2023年12月05日 15:41:29   作者:Ar.小白  
這篇文章主要介紹了MyBatis分頁(yè)查詢與特殊字符處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、引言

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ǔ)句。通常使用LIMITOFFSET關(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ù)化的方式傳遞pageSizeoffset的值。

  • 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使用LIMITOFFSET來(lái)實(shí)現(xiàn)分頁(yè),而Oracle數(shù)據(jù)庫(kù)使用ROWNUMROW_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-PageHelper
  • MyBatis-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ǔ)句,但不再使用LIMITOFFSET關(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中使用LIMITOFFSET關(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)題。

總之,特殊字符的影響取決于數(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)義字符
<&lt;
>&gt;
&&amp;
"&quot;
&apos;
<=&lt;=
>=&gt;=

方案二:使用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è)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java自定義日志輸出文件(log4j日志文件輸出多個(gè)自定義日志文件)

    java自定義日志輸出文件(log4j日志文件輸出多個(gè)自定義日志文件)

    打印日志的在程序中是必不可少的,如果需要將不同的日志打印到不同的地方,則需要定義不同的Appender,然后定義每一個(gè)Appender的日志級(jí)別、打印形式和日志的輸出路徑,下面看一個(gè)示例吧
    2014-01-01
  • java對(duì)象初始化順序驗(yàn)證示例

    java對(duì)象初始化順序驗(yàn)證示例

    以下這段小程序?qū)φ{(diào)用對(duì)象構(gòu)造函數(shù)時(shí),父類構(gòu)造函數(shù)、成員變量初始化函數(shù),以及非靜態(tài)初始化塊調(diào)用順序進(jìn)行驗(yàn)證,不考慮靜態(tài)成員及靜態(tài)初始化塊
    2014-02-02
  • 基于SpringBoot實(shí)現(xiàn)文件秒傳功能

    基于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
  • JavaBean和Map轉(zhuǎn)換封裝類的方法

    JavaBean和Map轉(zhuǎn)換封裝類的方法

    下面小編就為大家?guī)?lái)一篇JavaBean和Map轉(zhuǎn)換封裝類的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • 不寫(xiě)mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問(wèn)題分析

    不寫(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雙重校驗(yàn)鎖單例原理

    Java雙重校驗(yàn)鎖單例原理

    大家好,本篇文章主要講的是Java雙重校驗(yàn)鎖單例原理,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Java實(shí)現(xiàn)讀取超過(guò)內(nèi)存大小的文件

    Java實(shí)現(xiàn)讀取超過(guò)內(nèi)存大小的文件

    在一些場(chǎng)景下,我們需要處理的文件可能比我們機(jī)器所擁有的內(nèi)存要大,如果遇到這種情況該如何解決呢,本文就來(lái)和大家講講如何使用Java實(shí)現(xiàn)讀取超過(guò)內(nèi)存大小的文件吧
    2024-03-03
  • Java在Excel中創(chuàng)建透視表方法解析

    Java在Excel中創(chuàng)建透視表方法解析

    這篇文章主要介紹了Java在Excel中創(chuàng)建透視表方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Struts2訪問(wèn)Servlet的三種方式

    Struts2訪問(wèn)Servlet的三種方式

    這篇文章主要介紹了Struts2訪問(wèn)Servlet的三種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java代理模式詳細(xì)解析

    Java代理模式詳細(xì)解析

    這篇文章主要為大家詳細(xì)介紹了Java代理模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03

最新評(píng)論

南丹县| 岢岚县| 和静县| 思茅市| 新泰市| 金昌市| 礼泉县| 子洲县| 长汀县| 齐河县| 新源县| 图木舒克市| 沙湾县| 通渭县| 盐山县| 温宿县| 梧州市| 贺兰县| 河北区| 得荣县| 江孜县| 华安县| 伊宁县| 信阳市| 濮阳县| 兰考县| 闵行区| 石棉县| 罗定市| 延川县| 上思县| 陕西省| 东兰县| 民勤县| 房产| 汝南县| 庆元县| 武胜县| 五原县| 商城县| 黔江区|