网站首页 > 教程文章 正文
“Mybatis是如何进行分页的”?
这是一个工作了3年的同学,在面试的时候遇到的问题。
大家好,我是Mic,一个工作了14年的Java程序员。
经常有同学在后台跟我吐槽,在求职过程中遇到的各种面试难题,我发现大部分的问题之前的视频都有分析过,考虑到视频可能太过分散不方便大家学习,所以我系统整理了一份20万字的文档有需要的Si信我发送“Mic”领取
下面我们来分析一下面试官对于这个问题的考察意图。
考察目标
Mybatis是Java应用开发的基础框架,而分页又是我们实时都在使用的功能。
因此,在我看来,一方面考察的是求职者对Mybatis框架的使用能力。
另一方面,以此为切入点去深度挖掘Mybatis里面更多的问题,从而了解求职者对它的理解深度。
这道题考察难度不大,主要考察1-3年Java开发经验的同学。
问题解析
数据进行分页是最基础的功能,一般可以把分页分成两类:
- 逻辑分页,先查询出所有的数据缓存到内存,再根据业务相关需求,从内存数据中筛选出合适的数据进行分页。
- 物理分页 ,直接利用数据库支持的分页语法来实现,比如Mysql里面提供了分页关键词Limit
Mybatis提供了四种分页方式:
- 在Mybatis Mapper配置文件里面直接写分页SQL,这种方式比较灵活,实现也简单。
- RowBounds实现逻辑分页,也就是一次性加载所有符合查询条件的目标数据,根据分页参数值在内存中实现分页。
当然,在数据量比较大的情况下,JDBC驱动本身会做一些优化,也就是不会把所有结果存储在ResultSet里面,而是只加载一部分数据,再根据需求去数据库里面加载。
这种方式不适合数据量较大的场景,而且有可能会频繁访问数据库造成比较大的压力。 - Interceptor拦截器实现,通过拦截需要分页的select语句,然后在这个sql语句里面动态拼接分页关键字,从而实现分页查询。
- Interceptor是Mybatis提供的一种针对不同生命周期的拦截器,比如:
拦截执行器方法
拦截参数的处理
拦截结果集的处理
拦截SQL语法构建的处理
我们可以拦截不同阶段的处理,来实现Mybatis相关功能的扩展。
这种方式的好处,就是可以提供统一的处理机制,不需要我们再单独去维护分页相关的功能。
- 插件(PageHelper)及(MyBaits-Plus、tkmybatis)框架实现这些插件本质上也是使用Mybatis的拦截器来实现的。
只是他们帮我们实现了扩展和封装,节省了分页扩展封装的工作量,在实际开发中,只需要拿来即用即可。
总结一下,对于任何ORM框架,分页的实现逻辑无外乎两种,不管怎么包装,最终给到开发者的,只是使用上的差异而已。
那么,我们来看看高手该如何回答。
高手:
我认为有三种方式来实现分页:
- 第一种,直接在Select语句上增加数据库提供的分页关键字,然后在应用程序里面传递当前页,以及每页展示条数即可。
- 第二种,使用Mybatis提供的RowBounds对象,实现内存级别分页。
- 第三种,基于Mybatis里面的Interceptor拦截器,在select语句执行之前动态拼接分页关键字。
如果你喜欢我的作品,记得点赞收藏加关注哦!
需要高手面试文档合集(附赠大厂内部十万字面试文档)或者有不懂的技术面试题想咨询的小伙伴可以后台私信【Mic】或者评论区留言。
猜你喜欢
- 2024-12-25 mybatis-plus-join编码实现Join联表查询,真香!
- 2024-12-25 SpringBoot咋使用PageHelper实现数据分页?
- 2024-12-25 MyBatis-Plus中如何使用ResultMap
- 2024-12-25 通过Mybatis Plus实现代码生成器,常见接口实现讲解
- 2024-12-25 SpringBoot集成mybatis-plus springboot集成mybatisplus的配置
- 2024-12-25 MyBatis-Plus码之重器 lambda 表达式使用指南,开发效率瞬间提升80%
- 2024-12-25 MyBatis Plus—CRUD 接口 mybatis plus typehandler
- 2024-12-25 聊聊关于Mybatis分页操作PageHelper及实现原理?
- 2024-12-25 Springboot+MybatisPlus实现用户CRUD操作(后端实现)
- 2024-12-25 MybatisPlus方法详细使用,实现无SQL式开发
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)