夜雨聆风学习资料网

ARTICLE · 1053396

MyBatis 插件机制与PageHelper面试坑

MyBatis 插件机制与PageHelper面试坑

面试被问到 MyBatis 插件,很多人卡在代理链和 PageHelper 上。其实它只拦截四个核心接口:Executor、StatementHandler、ParameterHandler、ResultSetHandler。

代理不是在 SQL 执行时才套上的。四大对象刚实例化完,Configuration 就立刻调用 pluginAll() 层层包好。多个插件像洋葱一样,后注册的包在最外层,所以它的 intercept() 会最先执行。

PageHelper 就是个 Interceptor。调用 startPage() 时,分页参数被塞进当前线程的 ThreadLocal。等查询走到 Executor.query(),它先取参数做 COUNT 统计,再按数据库方言生成新 SQL 去查。

这就引出了经典坑:为什么它只对紧跟的第一次查询生效?因为查询一结束,finally 块里就会把 ThreadLocal 清掉。第二次查询时参数已经空了,自然不生效。想查两次,就得调两次 startPage()。

另外别拿它跟 MyBatis 自带的 RowBounds 比。RowBounds 是内存分页,查出全量数据再在应用层截取,性能极差;PageHelper 是物理分页,数据库只返回当前页,这才是正经用法。

原文MyBatis 插件(Interceptor)原理与 PageHelper 分页实现
北京,15分钟前,

相关学习资料