时间:2021-05-20
一、引言
分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。
物理分页:相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较大,数据更新比较频繁的场景。
逻辑分页:一次性把全部的数据取出来,通过程序进行筛选数据。如果数据量大的情况下会消耗大量的内存,由于逻辑分页只需要读取数据库一次,不能获取数据库最新状态,实施性比较差,适用于数据量小,数据稳定的场合。
那么MP中的物理分页怎么实现呢? 往下看往下看
二、配置
创建MybatisPlusConfig配置类,需要配置分页插件,小编使用的Spring boot配置方式。
三、具体分页实现
MP的Wrapper提供了两种分页查询的方式,源码如下:
可见两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准。
以上分页查询执行sql如下,先是查询了一次总记录数,然后在查询的数据。
DEBUG==> Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ?
DEBUG==> Parameters: %雨%(String), 40(Integer)
TRACE<== Columns: COUNT(1)
TRACE<== Row: 2
DEBUG==> Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,?
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-14 09:15:15
TRACE<== Row: 3, 刘红雨, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16
DEBUG<== Total: 2
总页数1
总记录数2
现在我们有需求只要查询数据即可, 不关心总记录数等,如果使用默认的方式就消耗不必要的性能。那么解决办法也是很简单的,只需要在创建page对象时传入第三个参数为false即可。
四、自定义sql分页查询
有时候查询的数据难免会出现多表连接查询,或者是一些复杂的sql语句,但是这些语句也是需要支持分页查询的,
先定义查询接口,第一个参数要是分页的参数,小编这里演示就写简单的sql。
步骤一:在mapper文件中,编写对应的分页查询接口。
步骤二:在xml中编写对应的sql语句,小编这里演示的 “${ew.customSqlSegment}”,这个是如果你想自定义的sql语句,也想使用wrapper查询条件构造器,则需要在mapper接口中添加参数,以及xml中也要有固定。
五、多表sql分页查询
看评论有小伙伴反馈多表连接查询怎么分页,其实道理都是一样的。
小编以简单的为主,sql如下: his_ipd_encounter、his_user 两张表
mapepr如下:需要传入分页的参数,返回的类型也需要是分页对象
/** * <p> * 用户 Mapper 接口 * </p> * * @author IT贱男 * @since 2019-06-14 */public interface UserMapper extends MyMapper<User> { /** * 多表查询分页 * @param page * @return */ IPage<String> selectByHisName(IPage<User> page);}测试如下:通过查看日志,执行的sql加了分页条件的。
ARNWarn: Could not find @TableId in Class: com.example.demo.model.HisUser.
INFOStarted UserMapperTest in 2.428 seconds (JVM running for 2.959)
select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid
DEBUG==> Preparing: SELECT COUNT(1) FROM his_ipd_encounter e, his_user u WHERE e.his_uid = u.his_uid
DEBUG==> Parameters:
TRACE<== Columns: COUNT(1)
TRACE<== Row: 117
DEBUG==> Preparing: select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid LIMIT ?,?
DEBUG==> Parameters: 0(Long), 2(Long)
TRACE<== Columns: realname
TRACE<== Row: 胡伯云
TRACE<== Row: 安元慧
DEBUG<== Total: 2
Time:20 ms - ID:com.example.demo.mapper.UserMapper.selectByHisName
Execute SQL:
com.p6spy.engine.wrapper.PreparedStatementWrapper@61bcbcce
胡伯云
安元慧
总页数 = 59
到此这篇关于MyBatis-Plus 分页查询以及自定义sql分页的实现的文章就介绍到这了,更多相关MyBatis-Plus 自定义sql分页内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
mybatis中分页有3种方式来实现,通过sql语句(两种传参方式)来实现,通过mybatis的Rowbounds来实现。通过(自定义类型)传参来实现分页:映射
和默认翻页方式相比,自定义分页能提高几个数量级的效率。当我们的需要对大量数据分页的时候就需要考虑自定义分页,然而实现自定义分页相比默认分页需要做更多工作。对
描述项目中用到boot整合mybatis-plus,个人在使用分页条件查询的时候一直查不出total,pages,终于找到原因了.环境2.1.5.RELEASE
本文实例讲述了Yii视图操作之自定义分页实现方法。分享给大家供大家参考,具体如下:1.视图文件调用cgridview,clistview时候调用自定义的分页方法
1、使用mybatis-plus自身的查询构造去,只需要在全局配置中添加如下配置mybatis-plus:mapper-locations:classpath: