精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

原來PageHelper還有這個坑!

數(shù)據(jù)庫 其他數(shù)據(jù)庫
PageHelper是Mybatis-Plus中的一個插件,主要用于實(shí)現(xiàn)數(shù)據(jù)庫的分頁查詢功能。其核心原理是將傳入的頁碼和條數(shù)賦值給一個Page對象,并保存到本地線程ThreadLocal中。

哈嘍,大家好,我是了不起。

Mybatis插件PageHelper很多人都會使用吧,有一次Copy的時候忘了去掉PageHelper.startPaeg()方法,結(jié)果導(dǎo)致數(shù)據(jù)查不到,debug 的時候發(fā)現(xiàn)第一次查詢沒有數(shù)據(jù),再查詢一次就有數(shù)據(jù)了,這個坑竟然也花了一點(diǎn)時間,那么今天就把這個坑填平。

這里我們一起看看其原理以及日常使用注意事項。

如何使用PageHelper

PageHelper是Mybatis-Plus中的一個插件,主要用于實(shí)現(xiàn)數(shù)據(jù)庫的分頁查詢功能。其核心原理是將傳入的頁碼和條數(shù)賦值給一個Page對象,并保存到本地線程ThreadLocal中。接下來,PageHelper會進(jìn)入Mybatis的攔截器環(huán)節(jié),在攔截器中獲取并處理剛才保存在ThreadLocal中的分頁參數(shù)。這些分頁參數(shù)會與原本的SQL語句和內(nèi)部已經(jīng)定義好的SQL進(jìn)行拼接,從而完成帶有分頁處理的SQL語句的構(gòu)建。

Pagehelper 有很多種使用方式,下面列出官方給出的幾種使用方式。

//第一種,RowBounds方式的調(diào)用
    List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

    //第二種,Mapper接口方式的調(diào)用,推薦這種使用方式。
    PageHelper.startPage(1, 10);
    List<Country> list = countryMapper.selectIf(1);

    //第三種,Mapper接口方式的調(diào)用,推薦這種使用方式。
    PageHelper.offsetPage(1, 10);
    List<Country> list = countryMapper.selectIf(1);

    //第四種,參數(shù)方法調(diào)用
    //存在以下 Mapper 接口方法,你不需要在 xml 處理后兩個參數(shù)
    public interface CountryMapper {
        List<Country> selectByPageNumSize(
                @Param("user") User user,
                @Param("pageNum") int pageNum,
                @Param("pageSize") int pageSize);
    }
    //配置supportMethodsArguments=true
    //在代碼中直接調(diào)用:
    List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);

    //第五種,參數(shù)對象
    //如果 pageNum 和 pageSize 存在于 User 對象中,只要參數(shù)有值,也會被分頁
    //有如下 User 對象
    public class User {
        //其他fields
        //下面兩個參數(shù)名和 params 配置的名字一致
        private Integer pageNum;
        private Integer pageSize;
    }
    //存在以下 Mapper 接口方法,你不需要在 xml 處理后兩個參數(shù)
    public interface CountryMapper {
        List<Country> selectByPageNumSize(User user);
    }
    //當(dāng) user 中的 pageNum!= null && pageSize!= null 時,會自動分頁
    List<Country> list = countryMapper.selectByPageNumSize(user);

    //第六種,ISelect 接口方式
    //jdk6,7用法,創(chuàng)建接口
    Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
        @Override
        public void doSelect() {
            countryMapper.selectGroupBy();
        }
    });
    //jdk8 lambda用法
    Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy());

    //也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
    pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
        @Override
        public void doSelect() {
            countryMapper.selectGroupBy();
        }
    });
    //對應(yīng)的lambda用法
    pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy());

    //count查詢,返回一個查詢語句的count數(shù)
    long total = PageHelper.count(new ISelect() {
        @Override
        public void doSelect() {
            countryMapper.selectLike(country);
        }
    });
    //lambda
    total = PageHelper.count(()->countryMapper.selectLike(country));

PageHelper原理

其核心原理是將傳入的頁碼和條數(shù)賦值給一個Page對象,并保存到本地線程ThreadLocal中。

下面以常見的使用方式看一下:

PageHelper.startPage(1, 10, orderBy);

經(jīng)過一些列的循環(huán)俄羅斯套娃調(diào)用之后,來到了這里:

public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
        Page<E> page = new Page<E>(pageNum, pageSize, count);
        page.setReasonable(reasonable);
        page.setPageSizeZero(pageSizeZero);
        //當(dāng)已經(jīng)執(zhí)行過orderBy的時候
        Page<E> oldPage = getLocalPage();
        if (oldPage != null && oldPage.isOrderByOnly()) {
            page.setOrderBy(oldPage.getOrderBy());
        }
        setLocalPage(page);
        return page;
    }
  1. 重點(diǎn)在setLocalPage(page) 這個方法,將page對象放到了靜態(tài)變量ThreadLocal中。

圖片圖片

  1. 查詢接口進(jìn)來的時候, PageHelper中的Threadlocal對象中就保存的該線程對應(yīng)的分頁參數(shù),在調(diào)用查詢的時候就會拿出來使用。

PageHelper 中有寫了一個 com.github.pagehelper.PageInterceptor , 這里是執(zhí)行分頁的地方。如果你想要寫其他的攔截器,也可以自定義一個mybatis plugin包攔截器,在這里對sql進(jìn)行處理。

圖片圖片

  1. 在PageInterceptor  中有一個主要interceptor方法,在方法中需要判斷是否需要分頁,如果需要分頁,則獲取分頁信息,查詢數(shù)據(jù)量等。

圖片圖片

  1. 接下來,PageHelper會進(jìn)入Mybatis的攔截器環(huán)節(jié),在攔截器中獲取并處理剛才保存在ThreadLocal中的分頁參數(shù)。這些分頁參數(shù)會與原本的SQL語句和內(nèi)部已經(jīng)定義好的SQL進(jìn)行拼接,從而完成帶有分頁處理的SQL語句的構(gòu)建。需要注意一點(diǎn)的是在finally中remove掉 ThreadLocal對象中當(dāng)前線程的page對象。

圖片圖片

  1. 調(diào)用skip方法, 并獲取分頁參數(shù) 判斷是否需要分頁。

圖片圖片

  1. 從靜態(tài)ThreadLocal中獲取page對象,

圖片圖片

PageHelper在執(zhí)行這一過程時,會判斷SQL的類型,只有當(dāng)該SQL是查詢操作時,才會進(jìn)入分頁邏輯。并且,在進(jìn)入分頁邏輯處理后,PageHelper會通過反射獲取該方法的參數(shù),判斷是否存在IPage對象(這是Mybatis-Plus中的另一個分頁對象)的實(shí)現(xiàn)類。如果存在這樣的實(shí)現(xiàn)類,那么也會進(jìn)行相應(yīng)的分頁處理。

PageHelper注意事項

使用PageHelper分頁推薦使用  PageHelper.startPage(1, 10)  這種方式。

另外startPage語句最好緊挨著查詢語句,避免中間拋出異常,沒有辦法清除ThreadLocal中當(dāng)前線程的page對象。

下面看一下官方給出的不安全的用法 和推薦的例子:

不安全用法:下面的方法如果不走查詢的話,page對象就會保留在當(dāng)前線程中,算是一個內(nèi)存泄漏,如果下一個mybatis查詢方法剛好是這個線程的時候,就會被動分頁。

PageHelper.startPage(1, 10);
List<Country> list;
if(param1 != null){
    list = countryMapper.selectIf(param1);
} else {
    list = new ArrayList<Country>();
}

推薦用法,主要是緊挨著mybatis查詢方法,查詢結(jié)束后,page對象就被清理,對線程后續(xù)的運(yùn)行不受影響。

List<Country> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    list = countryMapper.selectIf(param1);
} else {
    list = new ArrayList<Country>();
}

回到最開始的那個坑,原因就在于錯誤的使用了PageHelper.startPage(page,size), 這里的分頁參數(shù)只是調(diào)用下游系統(tǒng)的分頁參數(shù),不應(yīng)該再這里使用,所以在第一頁的時候是沒問題的,到第二頁的時候,查詢就出問題了,數(shù)據(jù)庫中沒有那么多數(shù)據(jù),所以會查不到數(shù)據(jù)。 debug的時候,執(zhí)行一次數(shù)據(jù)查詢操作,把page對象消耗掉了,第二次查詢的數(shù)據(jù)沒有分頁參數(shù),所以就可以正常查詢出數(shù)據(jù)。

責(zé)任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2022-03-21 08:55:53

RocketMQ客戶端過濾機(jī)制

2022-07-26 01:00:12

Eureka延遲注冊

2021-09-03 11:15:18

場景sql配置

2021-01-14 05:08:44

編譯鏈接

2017-07-04 14:01:40

機(jī)房機(jī)柜

2024-05-13 16:22:25

固態(tài)硬盤接口硬盤

2023-11-27 13:19:00

數(shù)據(jù)AI

2022-10-17 08:17:47

位掩碼Java變量

2024-10-06 13:41:25

2025-04-08 08:12:26

Next.js組件ChatGPT

2024-01-31 12:34:16

panic錯誤檢測recover

2018-01-31 16:12:47

筆記本輕薄本游戲本

2022-06-20 10:00:57

Python工具包代碼

2018-07-12 14:59:44

獵網(wǎng)

2018-06-26 15:00:24

Docker安全風(fēng)險

2021-08-10 13:50:32

內(nèi)存電腦軟件

2023-05-07 23:22:24

golang

2018-12-05 15:39:24

2017-06-16 16:16:36

庫存扣減查詢

2018-09-13 10:59:30

Redis鍵值存儲
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

91一区一区三区| 国产成人手机高清在线观看网站| 国产精品传媒入口麻豆| 欧洲永久精品大片ww免费漫画| 污片免费在线观看| 松下纱荣子在线观看| 久久精品一区二区三区不卡| 国产精品色午夜在线观看| 欧洲美女女同性互添| 日韩精品一区二区三区中文| 亚洲第一av色| 日韩精品无码一区二区三区| 国产又黄又粗又猛又爽| 国产精品v欧美精品v日本精品动漫| 亚洲国产天堂久久综合网| www日韩在线观看| 哥也色在线视频| 99久久伊人精品| 国产精品一区二区女厕厕| 99精品久久久久| 久久a爱视频| 精品视频在线免费看| 91国在线高清视频| 你懂的好爽在线观看| 国内精品伊人久久久久av影院 | 日韩美女啊v在线免费观看| 操一操视频一区| 男人的天堂av网站| 亚洲欧美综合| 亚洲国产美女精品久久久久∴| 天天操天天摸天天爽| 国产美女情趣调教h一区二区| 国产婷婷精品av在线| 91丨九色丨国产| 亚洲精品一区二区二区| 国产日韩欧美一区在线| 久久久国产精品x99av| 五级黄高潮片90分钟视频| 亚洲经典视频| 欧美日韩国产另类一区| 日韩在线视频在线| 久久日韩视频| 91麻豆.com| 国产成人亚洲欧美| 在线播放一级片| 另类国产ts人妖高潮视频| 日韩在线视频线视频免费网站| 老熟妇精品一区二区三区| 欧美经典一区| 69p69国产精品| 91n.com在线观看| a一区二区三区| 亚洲成人午夜电影| av在线免费观看国产| 黄色精品免费看| 久久综合成人精品亚洲另类欧美 | 欧美日韩高清在线播放| 国产精品50p| 高潮在线视频| 午夜视频一区二区| 久久这里只有精品18| 福利在线视频网站| 中文字幕中文字幕中文字幕亚洲无线 | 国产一区福利视频| 亚洲狼人综合网| 国产成人免费视频一区| 91沈先生作品| 国产黄色av片| 国产成人在线免费| 99re资源| 亚洲欧美激情国产综合久久久| 国内精品国产三级国产a久久| 国产精品最新在线观看| 一级黄色片在线播放| 蜜桃一区二区三区在线观看| 国产精品久久久精品| 黄色大全在线观看| 麻豆精品一区二区三区| 91精品久久久久久久久中文字幕| 中文字幕 国产| 国产真实乱对白精彩久久| 91欧美日韩一区| 亚洲精品一区二区三区四区| 不卡影院免费观看| 国产视频在线观看一区| 青青九九免费视频在线| 国产女同互慰高潮91漫画| 亚洲国产另类久久久精品极度| 成年人在线视频免费观看| 国产日韩欧美精品电影三级在线 | 精品二区在线观看| 成人激情黄色小说| 亚洲一区二区毛片| 日韩中文字幕在线播放| 国内偷拍精品视频| 久久狠狠婷婷| av在线不卡一区| 国产原创av在线| 亚洲图片一区二区| 欧美三级午夜理伦三级富婆| 日韩激情精品| 中日韩美女免费视频网址在线观看| 91嫩草|国产丨精品入口| 亚洲女人av| 91传媒免费看| yiren22综合网成人| 亚洲自拍偷拍av| 天天干天天操天天做| 日本一区福利在线| 欧美成人免费观看| 国产情侣免费视频| eeuss鲁片一区二区三区在线观看| 五月天久久综合网| 在线高清av| 欧美精品一区二区不卡| 午夜成人亚洲理伦片在线观看| 国产精品夜夜夜| www.久久艹| 国产丝袜在线| 欧美日韩一级二级| 日本性高潮视频| 中文欧美日韩| 国产精品免费一区二区三区四区| 丝袜美腿美女被狂躁在线观看| 日韩欧美成人区| 久久人人爽人人人人片| 欧美精品播放| 亚洲一区二区三区成人在线视频精品| 国产一级免费在线观看| 激情成人在线视频| 精品无码av一区二区三区| 999精品在线| 国产精品久久久| 国产女主播在线写真| 欧美日韩在线观看视频| 91丝袜在线观看| 伊人成人网在线看| 国产精品国产亚洲精品看不卡15 | 国产精品入口麻豆九色| 可以免费在线看黄的网站| 美女一区二区在线观看| 久久青草福利网站| 欧美一级特黄aaaaaa| 夜夜揉揉日日人人青青一国产精品 | 爱爱视频免费在线观看| 蜜乳av一区二区三区| 五月天国产一区| 黄色日韩网站| 日韩亚洲一区二区| 国产乱叫456在线| 一区二区三区自拍| 成人做爰www看视频软件| 欧美日韩国产一区精品一区| 91原创国产| 蜜臀av在线| 亚洲成人久久一区| 国产黄色片免费看| 久久精品免视看| 邪恶网站在线观看| 午夜精品亚洲| 国产亚洲二区| 韩漫成人漫画| 最近2019好看的中文字幕免费| ,一级淫片a看免费| 亚洲激情图片qvod| 天天躁日日躁狠狠躁免费麻豆| 亚洲激情午夜| 欧美中日韩免费视频| 日韩成人一区| 欧美激情二区三区| 日本1级在线| 欧美蜜桃一区二区三区| 久久午夜无码鲁丝片| 99国产精品国产精品久久| 国产视频在线视频| 91成人免费| 精品国产乱码久久久久久郑州公司 | 久久人人妻人人人人妻性色av| 久久一本综合频道| 天天做天天爱天天高潮| 极品尤物一区| 国产精品色午夜在线观看| 欧美xxxxhdvideosex| 日韩精品在线看| 国产乱子伦精品无码码专区| 亚洲国产精品一区二区www在线| 亚洲一级中文字幕| 国产真实乱对白精彩久久| 欧美三级一级片| 99视频精品全部免费在线视频| 国产91精品入口17c| 精品成人av| 久久久久久久久久久91| аⅴ资源新版在线天堂| 精品成人免费观看| 中文字幕人妻互换av久久| 亚洲aⅴ怡春院| 亚洲一二三四五六区| 99久久精品费精品国产一区二区 | 国产成人综合自拍| 超碰av在线免费观看| 欧美日韩亚洲一区| 五月天婷亚洲天综合网鲁鲁鲁| 97成人在线| 91精品综合视频| 精品无人乱码一区二区三区 | 国产精品黄色片| 98精品国产高清在线xxxx天堂| 91在线播放网站| 亚洲成人久久网| 国产激情视频在线播放| 欧美人体做爰大胆视频| 人人爽人人爽人人片av| 亚洲国产综合视频在线观看| 国产精品综合激情| 国产欧美综合色| 久久人人爽人人爽人人片| 国产精品一二三在| 中文字幕一区久久| 美女诱惑一区二区| 波多野结衣作品集| 日韩香蕉视频| 精品无码一区二区三区爱欲| 中文字幕一区二区三区在线视频| 色一情一乱一伦一区二区三区 | 粉嫩av一区二区| 96国产粉嫩美女| 亚洲视频自拍| 国产综合香蕉五月婷在线| gogo亚洲高清大胆美女人体| 51色欧美片视频在线观看| 6699嫩草久久久精品影院| 美女性感视频久久久| 免费av在线网站| 日韩在线欧美在线| 欧美黑人激情| 久久亚洲综合国产精品99麻豆精品福利| 成人激情电影在线看| 亚洲人成在线电影| 久久免费看视频| 国产亚洲精品久久久久动| 精品三级久久久久久久电影聊斋| 日韩极品精品视频免费观看| 亚洲欧美综合一区二区| 日韩成人在线视频| 日本天堂影院在线视频| 亚洲欧美www| av在线资源网| www.日韩欧美| 羞羞的视频在线观看| 色综合导航网站| 51精品视频| 日本一区二区在线免费播放| 三上悠亚一区二区| 国产欧美日韩最新| 高清一区二区| 成人综合电影| 啄木系列成人av电影| 日韩精品一线二线三线| 水蜜桃久久夜色精品一区| 在线观看亚洲视频啊啊啊啊| 亚洲一区 二区 三区| 免费一级淫片aaa片毛片a级| 在线亚洲观看| 波多结衣在线观看| 国产米奇在线777精品观看| 亚洲最大视频网| 94色蜜桃网一区二区三区| 成人片黄网站色大片免费毛片| 国产精品卡一卡二| 日韩三级在线观看视频| 亚洲一区二区在线视频| 99久久久久久久久| 欧美久久久久久久久| 亚洲福利在线观看视频| 亚洲男女性事视频| 国产婷婷视频在线| 欧美一区二区.| 亚洲成人高清| 精品视频第一区| 久久日文中文字幕乱码| 国产精品自拍合集| 日韩精品1区2区3区| 亚欧精品在线视频| 久久日韩粉嫩一区二区三区| 日本美女黄色一级片| 午夜精品一区二区三区电影天堂 | 国产成人一区二区精品非洲| 亚洲一区二区三区综合| 亚洲图片激情小说| 久久国产视频播放| 91精品在线麻豆| 日韩三级电影网| 美女av一区二区| 日韩中文视频| 国产伦精品一区二区三区四区视频 | 在线精品国产欧美| 波多一区二区| 国产欧洲精品视频| 免费成人av| 欧美久久在线观看| 久久97超碰色| 泷泽萝拉在线播放| 亚洲一区在线观看免费观看电影高清 | 在线视频第一页| 亚洲va中文字幕| 精品人妻一区二区三区含羞草| 亚洲日本中文字幕| 成人av影院在线观看| 成人精品一区二区三区电影免费| 色综合www| 欧美人成在线观看| 国产精品一区二区久激情瑜伽| 亚洲а∨天堂久久精品2021| 亚洲成av人片一区二区梦乃| 国产富婆一级全黄大片| 色阁综合伊人av| 日本欧美日韩| 久久爱av电影| 影音先锋在线一区| 久久久久亚洲av片无码v| 国产精品久久久久久久久晋中| 黄色片中文字幕| 日韩精品中文字幕在线播放| 久久www人成免费看片中文| 91精品视频观看| 99久久久国产精品美女| 在线免费观看视频黄| 国产香蕉久久精品综合网| 久久精品一二区| 日韩av影院在线观看| 国产在线拍揄自揄拍视频| 91成人免费在线观看| 欧美激情偷拍| 日韩精品视频网址| 亚洲欧美日韩国产另类专区| 国产又大又长又粗| 久久精品视频网站| 国产亚洲高清在线观看| 色一情一乱一乱一区91| 国产一区二区福利视频| 99热精品免费| 亚洲成年人影院在线| 电影在线观看一区| 玛丽玛丽电影原版免费观看1977| 一区二区三区四区五区精品视频 | 樱花草www在线| 中文字幕亚洲一区二区av在线 | 日本一级一片免费视频| 亚洲电影在线看| 成人午夜视屏| 日本一区二区免费看| 日本vs亚洲vs韩国一区三区| 亚洲天堂精品一区| 日韩一区二区三区视频在线观看 | 婷婷综合五月天| 午夜国产在线视频| 欧美做受高潮1| 成人综合一区| 伊人成人免费视频| 亚洲一区二区三区视频在线播放| 亚洲精品综合久久| 人九九综合九九宗合| 日本精品三区| 国产chinesehd精品露脸| 黄色一区二区在线| 91在线高清| 国产成人精品日本亚洲11 | 91看片在线观看| 91久久国产婷婷一区二区| 国产主播一区| 西西444www无码大胆| 欧美猛男男办公室激情| 成人女同在线观看| 日韩三级在线播放| 国产精品99久久久久久久女警| 久久一区二区三区视频| 久久精品欧美视频| 免费看久久久| 午夜剧场在线免费观看| 亚洲午夜久久久久久久久电影网| 欧美日韩国产综合视频| 亚洲影院高清在线| 久久动漫亚洲| 精品99在线观看| 中文字幕久久亚洲| 国产精品一区二区三区美女| 污污视频网站免费观看| 亚洲精品成人在线| 黄色av免费在线观看| 国产精品国产亚洲精品看不卡15 | 成人网在线观看| 亚洲一区不卡| 免费在线看黄网址| 最近2019免费中文字幕视频三 | 大胆欧美人体视频| 亚洲影院天堂中文av色| 波多野结衣三级视频| 欧美三区免费完整视频在线观看| 国产又色又爽又黄刺激在线视频|