数据分页
数据进行分页是最基础的功能,一般可以把分页分成两类:
- 逻辑分页,先查询出所有的数据缓存到内存,再根据业务相关需求,从内存数据中筛选出合适的数据进行分页。
- 物理分页 ,直接利用数据库支持的分页语法来实现,比如 Mysql 里面提供了分页关键词 Limit
Mybatis分页方式
Mybatis 提供了四种分页方式:
- Mybatis Mapper
- RowBounds
- Interceptor 拦截器实现
- 框架实现
Mybatis Mapper
在 Mybatis Mapper 配置文件里面直接写分页 SQL,这种方式比较灵活,实现也简单。
RowBounds
RowBounds 实现逻辑分页,也就是一次性加载所有符合查询条件的目标数据,根据分页参数值在内存中实现分页。当然,在数据量比较大的情况下,JDBC 驱动本身会做一些优化,也就是不会把所有结果存储在 ResultSet 里面,而是只加载一部分数据,再根据需求去数据库里面加载。这种方式不适合数据量较大的场景,而且有可能会频繁访问数据库造成比较大的压力 。
Interceptor 拦截器实现
通过拦截需要分页的 select 语句,然后在这个 sql 语句里面动态拼接分页关键字,从而实现分页查询。(如图)Interceptor 是 Mybatis 提供的一种针对不同生命周期的拦截器,比如:
- 1.拦截执行器方法
- 2. 拦截参数的处理
- 3. 拦截结果集的处理
- 4. 拦截 SQL 语法构建的处理
我们可以拦截不同阶段的处理,来实现 Mybatis 相关功能的扩展。
这种方式的好处,就是可以提供统一的处理机制,不需要我们再单独去维护分页相关的功能。
框架实现
插件(PageHelper)及(MyBaits-Plus、tkmybatis)框架实现这些插件本质上也是使用 Mybatis 的拦截器来实现的。只是他们帮我们实现了扩展和封装,节省了分页扩展封装的工作量,在实际开发中,只需要拿来即用即可。
总结
有三种方式来实现分页:
- 第一种,直接在 Select 语句上增加数据库提供的分页关键字,然后在应用程序里面传递当前页,以及每页展示条数即可。
- 第二种,使用 Mybatis 提供的 RowBounds 对象,实现内存级别分页。
- 第三种,基于 Mybatis 里面的 Interceptor 拦截器,在 select 语句执行之前动态拼接分页关键字。