记一次MyBatis分页莫名其妙的失效,首次执行合适,后续执行分页失效且异常

代码几乎一样,为啥这个xml配置的就会出现莫名其妙的问题呢

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='mybatis_plus_first', mode=IN, javaType=long, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #3 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (3 > number of parameters, which is 2).
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:97)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)
    at com.sun.proxy.$Proxy131.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224)
    at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForIPage(MybatisMapperMethod.java:121)
    at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:85)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)
    at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
    at com.sun.proxy.$Proxy237.getSearchIndexByPage(Unknown Source)
    at com.bigdatacd.panorama.system.service.impl.SearchIndexServiceImpl.getSearchIndexByPage(SearchIndexServiceImpl.java:31)
    at com.bigdatacd.panorama.system.service.impl.SearchIndexServiceImpl$$FastClassBySpringCGLIB$$bb45ed4a.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)
    at com.baomidou.dynamic.datasource.aop.DynamicDataSourceAnnotationInterceptor.invoke(DynamicDataSourceAnnotationInterceptor.java:57)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707)
    at com.bigdatacd.panorama.system.service.impl.SearchIndexServiceImpl$$EnhancerBySpringCGLIB$$3684ef87.getSearchIndexByPage(<generated>)
    at com.bigdatacd.panorama.system.controller.SearchIndexController.getSearchIndexByPage(SearchIndexController.java:40)
    at com.bigdatacd.panorama.system.controller.SearchIndexController$$FastClassBySpringCGLIB$$cc3a314a.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
最后,发现xml的注释 如-- 这样的会引起解析分页失败好吧,不追究了奇奇怪怪的问题

### MyBatis与PageHelper结合使用分页失效的原因及解决方案 #### 原因分析 1. **拦截器顺序问题** PageHelper的分页功能依赖于其内部的拦截器机制。如果在MyBatis中配置了多个拦截器,而PageHelper的拦截器未被正确加载或优先级较低,则可能导致其他拦截器先于PageHelper拦截SQL查询逻辑,从而使分页功能失效[^3]。 2. **线程绑定问题** PageHelper通过`ThreadLocal`存储分页参数,确保分页参数与当前线程绑定。然而,如果在调用PageHelper方法后未立即执行查询操作,或者存在多线程场景下的并发问题,可能会导致分页参数丢失或被覆盖,从而引发分页失效[^5]。 3. **SQL查询逻辑问题** 如果Mapper中的SQL查询逻辑不符合PageHelper的要求(例如嵌套查询、子查询等),PageHelper可能无法正确解析SQL并生成分页SQL,最终导致分页功能失效[^4]。 4. **分页参数传递问题** 在某些情况下,分页参数(如`pageNum`和`pageSize`)未正确传递到PageHelper方法中,也可能导致分页失效。例如,前端传参错误或后端未正确设置分页参数[^1]。 #### 解决方案 1. **调整拦截器顺序** 确保PageHelper拦截器的加载顺序优先于其他拦截器。可以在MyBatis配置文件中明确指定拦截器顺序,例如: ```xml <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 配置分页插件相关参数 --> </plugin> <!-- 其他拦截器 --> </plugins> ``` 2. **保证线程绑定一致性** 在调用PageHelper方法后,应立即执行对应的查询操作。避免在中间插入其他耗时操作或切换线程,以防止分页参数被清除或覆盖。例如: ```java PageHelper.startPage(pageNum, pageSize); // 设置分页参数 List<YourEntity> result = yourMapper.selectList(); // 立即执行查询 ``` 3. **优化SQL查询逻辑** 避免在Mapper中使用复杂的嵌套查询或子查询。如果确实需要使用复杂查询,可以通过手动拼接分页SQL的方式实现分页功能。例如: ```sql SELECT * FROM ( -- 复杂查询逻辑 ) temp_table LIMIT #{offset}, #{limit} ``` 4. **检查分页参数传递** 确保前端传递的分页参数正确,并在后端进行必要的校验。例如: ```java if (pageNum <= 0 || pageSize <= 0) { throw new IllegalArgumentException("分页参数不合法"); } ``` 5. **启用调试模式** 开启PageHelper的调试模式,查看生成的SQL语句是否符合预期。可以通过以下配置启用调试: ```properties pagehelper.debug=true ``` 6. **升级PageHelper版本** 如果遇到已知的分页失效问题,建议升级至最新版本的PageHelper,以修复潜在的Bug[^3]。 ```java // 示例代码:正确使用PageHelper PageHelper.startPage(1, 10); // 设置分页参数 List<User> users = userMapper.selectAll(); // 查询用户列表 PageInfo<User> pageInfo = new PageInfo<>(users); // 封装分页信息 ``` ### 注意事项 - 确保PageHelper版本与MyBatis版本兼容。 - 在高并发场景下,需特别注意`ThreadLocal`的使用限制。 - 对于复杂查询,可以考虑使用自定义分页逻辑替代PageHelper。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值