Java中mybatis的三種分頁方式
前言
分頁是我們在開發(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ù)層代碼:
<select id="getUserInfo1" parameterType="map" resultType="dayu"> select * from user <if test="startPos!=null and pageSize!=null"> limit ${startPos},${pageSize} </if> </select>
List<User> getUserInfo1(Map<String,Object> map);
@Test public void selectUser() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); //這里塞值 Map<String,Object> parms = new HashMap<>(); parms.put("startPos","0"); parms.put("pageSize","5"); List<User> 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<User> users = session.selectList("com.dy.mapper.UserMapper.getUserInfoRowBounds",null,new RowBounds(0, 5)); List<User> users = mapper.getUserInfoRowBounds(new RowBounds(0,5)); for (User map: users){ System.out.println(map); } session.close(); }
List<User> getUserInfoRowBounds(RowBounds rowBounds);
<select id="getUserInfoRowBounds" resultType="dayu"> select * from user </select>
執(zhí)行查看結(jié)果:
三、Mybatis_PageHelper分頁插件
引入jar包:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.7</version> </dependency>
配置MyBatis核心配置文件:
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor" /> </plugins>
業(yè)務(wù)層代碼:
@Test public void selectUserPageHelper() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); //第二種,Mapper接口方式的調(diào)用,推薦這種使用方式。 PageHelper.startPage(1, 3); List<User> list = mapper.getUserInfo(); //用PageInfo將包裝起來 PageInfo page = new PageInfo(list); for (User map: list){ System.out.println(map); } System.out.println("page:---"+page); session.close(); }
執(zhí)行結(jié)果:
總結(jié):
PageHelper還是很好用的,也是物理分頁!
實際上我們一般用第二種比較多:Mapper接口方式的調(diào)用
@Test public void selectUserPageHelper() { SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); //第二種,Mapper接口方式的調(diào)用,推薦這種使用方式。 PageHelper.startPage(1, 3); List<User> list = mapper.getUserInfo(); //用PageInfo將包裝起來 PageInfo page = new PageInfo(list); for (User map: list){ System.out.println(map); } System.out.println("page:---"+page); session.close(); }
拓展:
//獲取第1頁,10條內(nèi)容,默認(rèn)查詢總數(shù)count PageHelper.startPage(1, 10); List<User> list = userMapper.selectAll(); //用PageInfo對結(jié)果進(jìn)行包裝 PageInfo page = new PageInfo(list); //測試PageInfo全部屬性 //PageInfo包含了非常全面的分頁屬性 assertEquals(1, page.getPageNum()); assertEquals(10, page.getPageSize()); assertEquals(1, page.getStartRow()); assertEquals(10, page.getEndRow()); assertEquals(183, page.getTotal()); assertEquals(19, page.getPages()); assertEquals(1, page.getFirstPage()); assertEquals(8, page.getLastPage()); assertEquals(true, page.isFirstPage()); assertEquals(false, page.isLastPage()); assertEquals(false, page.isHasPreviousPage()); assertEquals(true, page.isHasNextPage());
到此這篇關(guān)于Java中mybatis的三種分頁方式的文章就介紹到這了,更多相關(guān)Java mybatis分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring AOP自定義注解方式實現(xiàn)日志管理的實例講解
下面小編就為大家分享一篇spring AOP自定義注解方式實現(xiàn)日志管理的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Java實現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法示例
這篇文章主要介紹了Java實現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法,結(jié)合實例形式分析了java基于第三方庫文件針對dcm醫(yī)學(xué)影像文件的解析操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2018-04-04關(guān)于Process的waitFor死鎖問題及解決方案
這篇文章主要介紹了關(guān)于Process的waitFor死鎖問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12基于Redis分布式鎖Redisson及SpringBoot集成Redisson
這篇文章主要介紹了基于Redis分布式鎖Redisson及SpringBoot集成Redisson,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小小伙伴可以參考一下2022-09-09SpringBoot+mybatis實現(xiàn)多數(shù)據(jù)源支持操作
這篇文章主要介紹了SpringBoot+mybatis實現(xiàn)多數(shù)據(jù)源支持操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10