Java中mybatis的三種分頁方式
前言
分頁是我們?cè)陂_發(fā)中繞不過去的一個(gè)坎!當(dāng)你的數(shù)據(jù)量大了的時(shí)候,一次性將所有數(shù)據(jù)查出來不現(xiàn)實(shí),所以我們一般都是分頁查詢的,減輕服務(wù)端的壓力,提升了速度和效率!也減輕了前端渲染的壓力!
注意:由于 java 允許的最大整數(shù)為 2147483647,所以 limit 能使用的最大整數(shù)也是 2147483647,一次性取出大量數(shù)據(jù)可能引起內(nèi)存溢出,所以在大數(shù)據(jù)查詢場(chǎng)合慎重使用!
一、Limit分頁
語法:
limit?${startPos},${pageSize}
在實(shí)際項(xiàng)目中我們一般會(huì)加上為空為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時(shí):
總結(jié):
- limit 0,10;
- 0 代表從第0條數(shù)據(jù)開始
- 10 代表查10條數(shù)據(jù)
- 等到第二頁的時(shí)候就是 limit 10,10;
以此類推!
這些內(nèi)容其實(shí)就時(shí)MySQL中的內(nèi)容,不作再詳細(xì)講解了。
二、RowBounds分頁(不推薦使用)
RowBounds幫我們省略了limit的內(nèi)容,我們只需要在業(yè)務(wù)層關(guān)注分頁即可!無須再傳入指定數(shù)據(jù)!
但是,這個(gè)屬于邏輯分頁,即實(shí)際上sql查詢的是所有的數(shù)據(jù),在業(yè)務(wù)層進(jìn)行了分頁而已,比較占用內(nèi)存,而且數(shù)據(jù)更新不及時(shí),可能會(huì)有一定的滯后性!不推薦使用!
RowBounds對(duì)象有2個(gè)屬性,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還是很好用的,也是物理分頁!
實(shí)際上我們一般用第二種比較多: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對(duì)結(jié)果進(jìn)行包裝 PageInfo page = new PageInfo(list); //測(cè)試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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring AOP自定義注解方式實(shí)現(xiàn)日志管理的實(shí)例講解
下面小編就為大家分享一篇spring AOP自定義注解方式實(shí)現(xiàn)日志管理的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01Java實(shí)現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法,結(jié)合實(shí)例形式分析了java基于第三方庫文件針對(duì)dcm醫(yī)學(xué)影像文件的解析操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04關(guān)于Process的waitFor死鎖問題及解決方案
這篇文章主要介紹了關(guān)于Process的waitFor死鎖問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Spring中基于xml的AOP實(shí)現(xiàn)詳解
這篇文章主要介紹了Spring中基于xml的AOP實(shí)現(xiàn)詳解,基于xml與基于注解的AOP本質(zhì)上是非常相似的,都是需要封裝橫切關(guān)注點(diǎn),封裝到切面中,然后把橫切關(guān)注點(diǎn)封裝為一個(gè)方法,再把該方法設(shè)置為當(dāng)前的一個(gè)通知,再通過切入點(diǎn)表達(dá)式定位到橫切點(diǎn)就可以了,需要的朋友可以參考下2023-09-09基于Redis分布式鎖Redisson及SpringBoot集成Redisson
這篇文章主要介紹了基于Redis分布式鎖Redisson及SpringBoot集成Redisson,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小小伙伴可以參考一下2022-09-09SpringBoot+mybatis實(shí)現(xiàn)多數(shù)據(jù)源支持操作
這篇文章主要介紹了SpringBoot+mybatis實(shí)現(xiàn)多數(shù)據(jù)源支持操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10