MyBatis-Plus 分页查询以及自定义sql分页的实现
一、引言
分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。
物理分页:相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较大,数据更新比较频繁的场景。
逻辑分页:一次性把全部的数据取出来,通过程序进行筛选数据。如果数据量大的情况下会消耗大量的内存,由于逻辑分页只需要读取数据库一次,不能获取数据库最新状态,实施性比较差,适用于数据量小,数据稳定的场合。
那么MP中的物理分页怎么实现呢?往下看往下看
二、配置
创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Springboot配置方式。
/** *@Auther:IT贱男 *@Date:2019/6/1215:06 *@Description:MybatisPlus配置类 */ @Configuration publicclassMyBatisPlusConfig{ /** *分页插件 *@return */ @Bean publicPaginationInterceptorpaginationInterceptor(){ returnnewPaginationInterceptor(); } }
三、具体分页实现
MP的Wrapper提供了两种分页查询的方式,源码如下:
/** *根据entity条件,查询全部记录(并翻页) * *@parampage分页查询条件(可以为RowBounds.DEFAULT) *@paramqueryWrapper实体对象封装操作类(可以为null) */ IPageselectPage(IPage page,@Param(Constants.WRAPPER)Wrapper queryWrapper); /** *根据Wrapper条件,查询全部记录(并翻页) * *@parampage分页查询条件 *@paramqueryWrapper实体对象封装操作类 */ IPage
可见两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准。
/** *分页查询 */ @Test publicvoidselectByPage(){ QueryWrapperwrapper=newQueryWrapper(); wrapper.like("name","雨").lt("age",40); Page page=newPage<>(1,2); //IPage userIPage=userMapper.selectPage(page,wrapper); IPage
以上分页查询执行sql如下,先是查询了一次总记录数,然后在查询的数据。
DEBUG==> Preparing:SELECTCOUNT(1)FROMuserWHEREnameLIKE?ANDage
DEBUG==>Parameters:%雨%(String),40(Integer)
TRACE<== Columns:COUNT(1)
TRACE<== Row:2
DEBUG==> Preparing:SELECTid,name,age,email,manager_id,create_timeFROMuserWHEREnameLIKE?ANDage DEBUG==>Parameters:%雨%(String),40(Integer),0(Long),2(Long)
TRACE<== Columns:id,name,age,email,manager_id,create_time
TRACE<== Row:2,张雨琪,31,zjq@baomidou.com,1088248166370832385,2019-01-1409:15:15
TRACE<== Row:3,刘红雨,31,lhm@baomidou.com,1088248166370832385,2019-01-1409:48:16
DEBUG<== Total:2
总页数1
总记录数2
现在我们有需求只要查询数据即可,不关心总记录数等,如果使用默认的方式就消耗不必要的性能。那么解决办法也是很简单的,只需要在创建page对象时传入第三个参数为false即可。
Pagepage=newPage<>(1,2,false);
四、自定义sql分页查询
有时候查询的数据难免会出现多表连接查询,或者是一些复杂的sql语句,但是这些语句也是需要支持分页查询的,
先定义查询接口,第一个参数要是分页的参数,小编这里演示就写简单的sql。
步骤一:在mapper文件中,编写对应的分页查询接口。
步骤二:在xml中编写对应的sql语句,小编这里演示的“${ew.customSqlSegment}”,这个是如果你想自定义的sql语句,也想使用wrapper查询条件构造器,则需要在mapper接口中添加参数,以及xml中也要有固定。
/** *自定义sql分页 *@parampage *@paramqueryWrapper看这里看这里,如果自定义的方法中需要用到wrapper查询条件,需要这样写 *@return */ IPageselectMyPage(IPage page,@Param(Constants.WRAPPER)Wrapper queryWrapper);
SELECT*FROMuser${ew.customSqlSegment}
/** *自定义sql分页查询 */ @Test publicvoidselectByMyPage(){ QueryWrapperwrapper=newQueryWrapper(); wrapper.like("name","雨").lt("age",40); Page page=newPage<>(1,2); IPage mapIPage=userMapper.selectMyPage(page,wrapper); System.out.println("总页数"+mapIPage.getPages()); System.out.println("总记录数"+mapIPage.getTotal()); List records=mapIPage.getRecords(); records.forEach(System.out::println); }
五、多表sql分页查询
看评论有小伙伴反馈多表连接查询怎么分页,其实道理都是一样的。
小编以简单的为主,sql如下:his_ipd_encounter、his_user两张表
selectu.realnamefromhis_ipd_encountere,his_useruwheree.his_uid=u.his_uid
mapepr如下:需要传入分页的参数,返回的类型也需要是分页对象
/** **用户Mapper接口 *
* *@authorIT贱男 *@since2019-06-14 */ publicinterfaceUserMapperextendsMyMapper{ /** *多表查询分页 *@parampage *@return */ IPage selectByHisName(IPage page); }
测试如下:通过查看日志,执行的sql加了分页条件的。
@Test publicvoidselect(){ //创建分页参数 Pagepage=newPage<>(1,2); IPage result=userMapper.selectByHisName(page); //获取数据 List records=result.getRecords(); records.forEach(System.out::println); System.out.println("总页数="+result.getPages()); }
ARNWarn:Couldnotfind@TableIdinClass:com.example.demo.model.HisUser.
INFOStartedUserMapperTestin2.428seconds(JVMrunningfor2.959)
selectu.realnamefromhis_ipd_encountere,his_useruwheree.his_uid=u.his_uid
DEBUG==> Preparing:SELECTCOUNT(1)FROMhis_ipd_encountere,his_useruWHEREe.his_uid=u.his_uid
DEBUG==>Parameters:
TRACE<== Columns:COUNT(1)
TRACE<== Row:117
DEBUG==> Preparing:selectu.realnamefromhis_ipd_encountere,his_useruwheree.his_uid=u.his_uidLIMIT?,?
DEBUG==>Parameters:0(Long),2(Long)
TRACE<== Columns:realname
TRACE<== Row:胡伯云
TRACE<== Row:安元慧
DEBUG<== Total:2
Time:20ms-ID:com.example.demo.mapper.UserMapper.selectByHisName
ExecuteSQL:
com.p6spy.engine.wrapper.PreparedStatementWrapper@61bcbcce胡伯云
安元慧
总页数=59
到此这篇关于MyBatis-Plus分页查询以及自定义sql分页的实现的文章就介绍到这了,更多相关MyBatis-Plus自定义sql分页内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。