Java中PageHelper的拦截器实现机制
2026/8/9 16:40:19 网站建设 项目流程

注意:Mapper中的select语句一定不能加分号,否则会报语法错误!!!!

PageHelper的核心是基于MyBatis实现分页,相当于一个“拦截器”,通过动态篡改SQL语句、拦截执行流程完成分页逻辑注入,核心机制可概括为以下3步:

1. 拦截器注册与触发时机

PageHelper通过 @Intercepts 注解声明拦截目标:聚焦MyBatis的 StatementHandler 接口,拦截其 prepare 方法。

启动时通过Spring配置或自动装配,将拦截器注册到MyBatis的 InterceptorChain ,执行SQL前会触发拦截逻辑。

2. 分页参数传递与SQL篡改

需先通过 PageHelper.startPage(pageNum, pageSize) 设置分页参数,该方法会将参数存入 ThreadLocal 。

拦截 prepare 方法时,拦截器从 ThreadLocal 中获取分页参数,若存在则:

1. 解析原始SQL

2. 拼接分页语法(MySQL用 limit ,Oracle用 rownum ),生成分页SQL(如 select * from user limit 0,10 );

3. 替换 StatementHandler 中的原始SQL,确保执行分页查询。

3. 总条数查询与结果封装

若开启 count 查询(默认开启),拦截器会生成总条数SQL(如 select count(*) from user ),单独执行获取总记录数。

执行分页SQL后,将查询结果与总条数封装为 Page 对象(继承 ArrayList ),包含页码、页大小、总条数、总页数等信息,最后清除 ThreadLocal 中的参数。

核心关键点

拦截器注解: @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})}) 是拦截核心配置。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询