pagehelper设置分页参数导致threadlocal数据污染

使用分页插件时设置分页参数,会存在当前线程池的线程的threadlocal中作为一个临时变量,在这个线程进行下一次分页查询时带上该参数,如果此次查询没有使用这个临时变量,该临时变量,会在该线程的下次查询中带上该参数,然后才会销毁该参数,该事故的特征是自己的接口无影响,下一次的接口有影响,且SQL日志中会出现多的limit的,

### 使用 PageHelper 实现 MyBatis 分页的步骤和方法 PageHelper 是 MyBatis 中常用的分页插件,能够简化分页逻辑的实现。使用 PageHelper 时,只需在查询前调用 `PageHelper.startPage(page, size)` 方法,随后的第一个查询会自动应用分页逻辑[^2]。 #### 引入依赖 在项目中使用 PageHelper 需要引入其依赖,例如在 Maven 项目中的 `pom.xml` 文件添加以下配置: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.0</version> </dependency> ``` #### 配置插件 在 MyBatis 的全局配置文件 `mybatis-config.xml` 中注册 PageHelper 插件: ```xml <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"/> </plugins> ``` 通过这种方式,PageHelper 能够拦截 SQL 查询并动态添加分页逻辑[^4]。 #### 在代码中使用 在实际业务逻辑中,通常需要先调用 `PageHelper.startPage()` 方法,然后执行查询操作。例如,在 Service 层处理订单数据时,可以通过如下方式实现分页: ```java @Override public List<Orders> findAll(int page, int size) throws Exception { PageHelper.startPage(page, size); return orderDao.findAll(); } ``` 这里 `page` 表示当前页码,`size` 表示每页显示的数据条目数。PageHelper 会在查询完成后自动清理 ThreadLocal 存储的对象,从而避免线程污染问题[^1]。 #### 获取分页结果 查询结果可以通过 PageInfo 类进行封装,以获取更多分页信息(如总记录数、导航页数等): ```java List<User> list = userMapper.selectAllUsers(); PageInfo<User> pageInfo = new PageInfo<>(list, 8); ``` 其中 `list` 是查询到的数据集合,`8` 表示导航页数,用于生成分页栏显示。PageInfo 提供了丰富的属性,包括当前页数据、总记录数等[^3]。 #### 分页原理 PageHelper 的核心实现依赖于 ThreadLocal 变量存储分页参数。当调用 `startPage()` 方法时,分页对象会被存入 ThreadLocal 中,随后的查询会从 ThreadLocal 获取这些参数,并将其应用于 SQL 构造过程。具体实现如下: ```java private static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<>(); public static void startPage(int startPage, int pageSize) { Page page = new Page(); page.setStartPage(startPage); page.setPageSize(pageSize); LOCAL_PAGE.set(page); } public static Page getPage() { return LOCAL_PAGE.get(); } ``` 这种方式确保了每个线程都能独立维护自己的分页状态,从而保证了并发环境下的安全性[^4]。 #### 注意事项 - **线程安全**:由于 PageHelper 依赖 ThreadLocal 存储分页信息,因此在多线程环境下需谨慎使用。 - **查询限制**:PageHelper 只对紧跟在其后的第一个查询生效,后续查询不会自动应用分页逻辑。 - **性能优化**:在大数据量场景下,建议结合数据库索引优化查询效率,避免因分页导致性能下降。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值