关于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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值