<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          美團(tuán)一面:MyBatis 的 3 種分頁,還有誰不會?

          共 4089字,需瀏覽 9分鐘

           ·

          2023-06-20 09:43

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 4 分鐘。

          來自:https://blog.csdn.net/weixin_43829443/article/details/119912221

          分頁是我們在開發(fā)中繞不過去的一個坎!當(dāng)你的數(shù)據(jù)量大了的時候,一次性將所有數(shù)據(jù)查出來不現(xiàn)實,所以我們一般都是分頁查詢的,減輕服務(wù)端的壓力,提升了速度和效率!也減輕了前端渲染的壓力!
          注意:由于 java 允許的最大整數(shù)為 2147483647,所以 limit 能使用的最大整數(shù)也是 2147483647,一次性取出大量數(shù)據(jù)可能引起內(nèi)存溢出,所以在大數(shù)據(jù)查詢場合慎重使用!

          一、Limit分頁

          語法:
          ?limit?${startPos},${pageSize}
          ?
          在實際項目中我們一般會加上為空為null判斷,如下:
          ?<if?test="startPos!=null?and?pageSize!=null">
          ????limit?${startPos},${pageSize}
          if>
          ?
          業(yè)務(wù)層代碼:
          ?"getUserInfo1"?parameterType="map"?resultType="dayu">
          ????select?*?from?user
          ????<if?test="startPos!=null?and?pageSize!=null">
          ????????limit?${startPos},${pageSize}
          ????if>

          ?
          ?List?getUserInfo1(Map?map);
          ?
          ?@Test
          ?public?void?selectUser()?{
          ?????SqlSession?session?=?MybatisUtils.getSession();
          ?????UserMapper?mapper?=?session.getMapper(UserMapper.class);
          ?????//這里塞值
          ??????Map?parms?=?new?HashMap<>();
          ??????parms.put("startPos","0");
          ??????parms.put("pageSize","5");
          ?????List?users?=?mapper.getUserInfo1(parms);
          ?????for?(User?map:?users){
          ?????????System.out.println(map);
          ????}
          ?????session.close();
          }
          ?
          執(zhí)行結(jié)果:
          ?
          傳入0,10時:
          ?
          總結(jié):
          • limit 0,10;
          • 0 代表從第0條數(shù)據(jù)開始
          • 10 代表查10條數(shù)據(jù)
          • 等到第二頁的時候就是 limit 10,10;
          以此類推!
          這些內(nèi)容其實就時MySQL中的內(nèi)容,不作再詳細(xì)講解了。

          二、RowBounds分頁(不推薦使用)

          RowBounds幫我們省略了limit的內(nèi)容,我們只需要在業(yè)務(wù)層關(guān)注分頁即可!無須再傳入指定數(shù)據(jù)!
          但是,這個屬于邏輯分頁,即實際上sql查詢的是所有的數(shù)據(jù),在業(yè)務(wù)層進(jìn)行了分頁而已,比較占用內(nèi)存,而且數(shù)據(jù)更新不及時,可能會有一定的滯后性!不推薦使用!
          RowBounds對象有2個屬性,offset和limit。
          • offset:起始行數(shù)
          • limit:需要的數(shù)據(jù)行數(shù)
          因此,取出來的數(shù)據(jù)就是:從第offset+1行開始,取limit行
          業(yè)務(wù)層代碼:
          ?@Test
          public?void?selectUserRowBounds()?{
          ????SqlSession?session?=?MybatisUtils.getSession();
          ????UserMapper?mapper?=?session.getMapper(UserMapper.class);
          ????//?List?users?=?session.selectList("com.dy.mapper.UserMapper.getUserInfoRowBounds",null,new?RowBounds(0,?5));
          ????List?users?=?mapper.getUserInfoRowBounds(new?RowBounds(0,5));
          ????for?(User?map:?users){
          ????????System.out.println(map);
          ????}
          ????session.close();
          }
          ?
          ?List?getUserInfoRowBounds(RowBounds?rowBounds);
          ?
          ?"getUserInfoRowBounds"?resultType="dayu">
          ???select?*?from?user

          ?
          執(zhí)行查看結(jié)果:
          ?

          三、Mybatis_PageHelper分頁插件

          官方GitHub地址:
          https://github.com/pagehelper/Mybatis-PageHelper
          引入jar包
          ?
          ???com.github.pagehelper
          ???pagehelper
          ???5.1.7

          ?
          配置MyBatis核心配置文件
          ?
          ????"com.github.pagehelper.PageInterceptor"?/>

          ?
          業(yè)務(wù)層代碼
          執(zhí)行結(jié)果
          ?
          總結(jié):
          PageHelper還是很好用的,也是物理分頁!
          實際上我們一般用第二種比較多:Mapper接口方式的調(diào)用
          ?//第一種,RowBounds方式的調(diào)用
          List?list?=?sqlSession.selectList("x.y.selectIf",?null,?new?RowBounds(0,?10));

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

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

          //第四種,參數(shù)方法調(diào)用
          //存在以下?Mapper?接口方法,你不需要在?xml?處理后兩個參數(shù)
          public?interface?CountryMapper?{
          ????List?selectByPageNumSize(
          ????????????@Param("user")
          ?User?user,
          ????????????@Param("pageNum")?int?pageNum,?
          ????????????@Param("pageSize")?int?pageSize)
          ;
          }
          //配置supportMethodsArguments=true
          //在代碼中直接調(diào)用:
          List?list?=?userMapper.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?selectByPageNumSize(User?user);
          }
          //當(dāng)?user?中的?pageNum!=?null?&&?pageSize!=?null?時,會自動分頁
          List?list?=?userMapper.selectByPageNumSize(user);

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

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

          //count查詢,返回一個查詢語句的count數(shù)
          long?total?=?PageHelper.count(new?ISelect()?{
          ????@Override
          ????public?void?doSelect()?{
          ????????userMapper.selectLike(user);
          ????}
          });
          //lambda
          total?=?PageHelper.count(()->userMapper.selectLike(user));
          ?
          拓展
          這種方式十分方便快捷好用!推薦使用!
          篇幅有限,不可能所有用法都演示一遍!有興趣的小伙伴可以自行測試一遍!
          悄悄的說,反正我是全部試了一遍,還整合了Spring,加了攔截器測試了!

          推薦閱讀:

          不要再封裝各種Util工具類了,這個神級框架你值得擁有!

          SpringBoot 實現(xiàn) PDF 添加水印有哪些方案?

          互聯(lián)網(wǎng)初中高級大廠面試題(9個G)

          內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!

          ?戳閱讀原文領(lǐng)?。?/span>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?

          瀏覽 25
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  影视先锋成人电影 | 丁香网五月 | 亚洲AV无码乱码国产精品黑人 | 性少妇69| 囯产精品久久久久久久 |