每日一道面试题-Mybatis是如何进行分页的?分页插件的原理是什么?
的有关信息介绍如下:
Mybatis_PageHelper分页插件
官方GitHub地址
引入jar包
配置MyBatis核心配置文件
业务层代码
执行结果
基于 SQL本身的分页
MyBatis 支持多种数据库,每种数据库的 SQL 方言可能不同。因此,MyBatis 通过在查询语句中添加不同的 SQL 语句来实现分页。
以 MySQL 为例,MyBatis 中实现分页的 SQL 语句如下:
其中,startIndex 表示查询的起始索引,pageSize 表示每页的记录数。在 MyBatis 中,这两个参数通常通过传递参数的方式来实现。
MyBatis 实现分页的原理比较简单,例如 LIMIT 子句,在数据库层面上实现分页。
在 MyBatis 中,我们可以通过两种方式来实现分页:
第一种方式:
MyBatis 支持多种数据库,每种数据库的 SQL 方言可能不同,因此需要在查询语句中添加不同的 SQL 语句来实现分页。以 MySQL 为例,MyBatis 中实现分页的 SQL 语句如下:
其中,startIndex 表示查询的起始索引,pageSize 表示每页的记录数。在 MyBatis 中,这两个参数通常通过传递参数的方式来实现。
第二种方式
使用插件实现分页:MyBatis 还提供了一种更加灵活的分页方式,即使用插件来实现分页。这种方式需要实现 MyBatis 的 Interceptor 接口,并在 intercept 方法中实现分页逻辑。
具体实现过程如下:
需要注意的是,MyBatis 中的分页通常都是基于物理分页实现的,即在数据库层面上通过 LIMIT 或者 ROWNUM 等语句进行分页,因此需要考虑性能问题。一般来说,建议在 SQL 语句中添加合适的索引,以提高查询性能。
RowBounds分页(不建议使用)
不使用SQL实现分页,通过java代码层面实现分页
//分页2:RowBounds
Mapper.xml
测试
分页过程
首先会把分页参数封装成Page对象放到ThreadLocal中
然后根据SQL进行拼接转换(select * from table where a) ->(select count(“0”)from table where a)和(select * from table where a limit ,)
有了total总条数、pageNum当前第几页、pageSize每页大小和当前页的数据,就可以算出分页的其他非必要信息(是否为首页,是否为尾页,总页数)
补充:更多关于Mysql的相关的知识考点:可以参考一下Mysql专栏:Mysql 从0到1,如果你还不知道Mysql的索引的话可以参考这篇文章:
好了,我是架构师小于哥
@终端研发部
专注分享互联网职场,技术开发小技巧,如果觉得不错可以收藏转发哦,希望我的分享对你能有帮助啊~



