关于Mybatis使用PageHelper插件,出现没设置分页,sql也增加limit问题解决办法

问题描述:

近期项目在运行过程当中,经常发现某些查询结果与实际结果不相符,只显示部分结果。

查看后台日志,发现相应的sql后面自动添加了limit进行了分页导致。

但我实际并没有对此方法添加分页功能。经过百度查询相关问题

最终发现问题是在PageHelper插件的使用不规范导致的,

主要是因为程序中其他某个查询方法增加了 PageHelper.startPage(1, 5);该方法执行后,但实际并没有调用sql语句,就会出现问题。

PageHelper分页原理:

PageHelper采用ThreadLocal来进行分页标识设置,pagehelper保证的是当代码执行到Executor 方法时出现错误,它会在finally快中清理ThreadLocal中的分页标识,如果代码没有执行到Executor方法就出现异常,那就会造成ThreadLocal污染。

当我们执行PageHelper.startPage(1, 5);这一行的时候,其实是在当前线程的ThreadLocal中设置了分页的变量,当执行到mapper.select(id)的时候会通过Executor拦截,从ThreadLocal中获取分页标记,如果存在分页标记就在当前执行的sql语句中增加分页表达式,当Executor拦截执行的时候finally中会清理ThreadLocal中的分页变量。但问题如果执行PageHelper.startPage(1, 5),后续程序没有执行到相应的Executor方法时,则ThreadLocal被污染,分页变量并没有被清理。就会出现调用其他语句时自动添加上了limit。

解决方法:

在执行PageHelper.startPage(1, 5)之后,要保证能够执行到相应的 mapper Executor。

如果代码没有要执行的 mapper Executor,则删除PageHelper.startPage(1, 5)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 原生 SQLLimit 分页 原生 SQLLimit 分页是最基本的分页方式,通过使用 Limit 关键字从数据库中分页查询数据。这种方式的优点是简单易懂,适合对数据量不大的表进行分页查询,缺点是需要手写 SQL 语句,不够灵活,对于复杂的查询条件和多表关联查询不太适用。 2. Mybatis 自带的 RowBounds 分页 Mybatis 自带的 RowBounds 分页方式是通过在查询语句中添加 RowBounds 参数来实现分页查询。这种方式的优点是使用简单,不需要手写 SQL 语句,缺点是需要手动计算分页参数,不够方便,而且 RowBounds 分页方式只能用于单表查询,不支持多表关联查询。 3. 自定义拦截器插件进行分页 自定义拦截器插件可以通过拦截 Executor 的 query 方法,在查询语句中自动添加分页参数,从而实现分页查询。这种方式的优点是可以自由控制分页参数,适用于复杂的查询场景,缺点是需要编写复杂的拦截器插件,开发成本高。 4. 使用 PageHelper 插件分页 PageHelper 插件是一个比较成熟、流行的 Mybatis 分页插件,可以在不修改原始 SQL 查询语句的情况下实现分页查询。这种方式的优点是使用简单,不需要手写 SQL 语句,支持多表关联查询和复杂查询条件,而且提供了丰富的分页功能和参数设置,缺点是插件本身会对查询语句进行修改,可能会影响查询性能。 总的来说,四种方式各有优劣,需要根据实际情况选择合适的方式。对于简单的分页场景,可以使用原生 SQLLimit 分页或者 Mybatis 自带的 RowBounds 分页;对于复杂的查询场景,可以考虑使用自定义拦截器插件进行分页;对于大部分情况下的分页查询,可以使用 PageHelper 插件,提高开发效率和查询性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值