不当使用Mybatis插件PageHelper,引发查询结果行数不准确或者ClassCastException

10 篇文章 0 订阅
6 篇文章 0 订阅

PageHelper使用ThreadLocal来记录分页申明,并修改后续mybatis mapper执行逻辑。线程池和ThreadLocal引发的问题,比较难以定位,特此记录:

一、询结果行数不准确

在http、dubbo处理线程上,调用PageHelper.startPage后,如果不立即执行mapper的查询方法而发生了异常,退出当前请求的处理;由于线程复用,ThreadLocal里的分页申明记录将影响线程将来处理新请求时调用的某个未知mapper,给查询语句强行增加limit限制,从而返回局部结果。

二、处理查询结果List时,抛出ClassCastException

如果使用PageHelper.startPage仅仅为了初始化一个Page容器来装载数据,则装载的数据会遗留在ThreadLocal里,影响下个查询语句的结果:

	@Test
	public void testPaging() throws Exception {
		Page<Person> page = PageHelper.startPage(1, 10);
		Person aPerson = new Person();
		page.add(aPerson);
		List<UserInfo> lst = userMapper.query();
		// mapper方法的返回结果,就是一开始进行分页申明时得到的page对象
		assertTrue(lst == (Object) page);
		// 查询结果List的第一个数据,实际是之前插入到page里的数据,类型并不是UserInfo
		assertTrue(lst.get(0) == (Object) aPerson);
	}

当使用for循环获取上述的lst里的数据对象时,就会触发ClassCastException

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis是一款优秀的ORM框架,而PageHelper则是一款用于Mybatis分页插件使用PageHelper可以方便地实现分页查询功能。具体使用方法如下: 1.在pom.xml文件中添加PageHelper的依赖。 2.在Mybatis的配置文件中添加PageHelper插件配置。 3.在Mapper接口中定义分页查询的方法,并使用PageHelper.startPage方法设置分页参数。 4.在Controller中调用Mapper接口中的分页查询方法,并将查询结果封装到PageInfo对象中返回给前端。 下面是一个示例代码: 1.在pom.xml文件中添加PageHelper的依赖: ``` <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.11</version> </dependency> ``` 2.在Mybatis的配置文件中添加PageHelper插件配置: ``` <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> <property name="reasonable" value="true"/> <property name="supportMethodsArguments" value="true"/> <property name="params" value="count=countSql"/> </plugin> </plugins> ``` 3.在Mapper接口中定义分页查询的方法,并使用PageHelper.startPage方法设置分页参数: ``` List<User> getUserList(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize); ``` ``` PageHelper.startPage(pageNum, pageSize); List<User> userList = userMapper.getUserList(pageNum, pageSize); ``` 4.在Controller中调用Mapper接口中的分页查询方法,并将查询结果封装到PageInfo对象中返回给前端: ``` @RequestMapping("/getUserList") public PageInfo<User> getUserList(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { List<User> userList = userMapper.getUserList(pageNum, pageSize); PageInfo<User> pageInfo = new PageInfo<>(userList); return pageInfo; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值