Mybatis分页插件PageHelper失效
1,场景
错误:
//因为查询前要先去数据库查询几个条件,就会查询数据库。导致分页参数被(1)号查询消费了,所以(2)查询就没有使用到分页参数 public PageInfo<ArticleInfo> findPage(ArticleInfo entity) { PageHelper.startPage(entity.getPageNum(), entity.getPageSize());if (entity.getTopicId() != null) {List<String> codes = new ArrayList<>(); (1)BaikeTopic baikeTopic = itBaikeService.get(entity.getTopicId());codes.add(baikeTopic.getTopicCode());List<String> allCodesById = itBaikeService.getAllCodesById(entity.getTopicId(), codes);entity.setTopicCode(StringUtils.join(allCodesById, ","));}(2)List<ArticleInfo> list = this.findList(entity);list.forEach((e) -> {e.setStatusName(ArticleEnum.find(e.getStatus()).getName());e.setApproveBy(itBaikeService.getCheckUserInfo(e.getTopicCode()));});return new PageInfo<>(list); }
正确 :
PageHelper.startPage(entity.getPageNum(), entity.getPageSize());应该放在(2)查询上面
2,原因分析
PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。
3,PageHelper源码分析
@Intercepts({@Signature(
type = Executor.class,
method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
), @Signature(
type = Executor.class,
method = "query",
args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}
)})
public class PageInterceptor implements Interceptor {
protected Cache<CacheKey, MappedStatement> msCountMap = null;
private Dialect dialect;
private String default_dialect_class = "com.github.pagehelper.PageHelper";
private Field additionalParametersField;public PageInterceptor() {
}public Object intercept(Invocation invocation) throws Throwable {
try{
//处理SQLString pageSql = this.dialect.getPageSql(ms, boundSql, parameter, rowBounds, cacheKey);
}finally { //清楚ThreadLocal中存储的分页参数this.dialect.afterAll();public void remove() {ThreadLocalMap m = getMap(Thread.currentThread());if (m != null)m.remove(this);}
}}
}
public String getPageSql(MappedStatement ms, BoundSql boundSql, Object parameterObject, RowBounds rowBounds, CacheKey pageKey) {String sql = boundSql.getSql();//获取分页数据Page page = this.getLocalPage();//重置查询sql return this.getPageSql(sql, page, pageKey); }
public String getPageSql(String sql, Page page, CacheKey pageKey) {StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);sqlBuilder.append(sql);if (page.getStartRow() == 0) {sqlBuilder.append(" LIMIT ");sqlBuilder.append(page.getPageSize());} else {sqlBuilder.append(" LIMIT ");sqlBuilder.append(page.getStartRow());sqlBuilder.append(",");sqlBuilder.append(page.getPageSize());pageKey.update(page.getStartRow());}pageKey.update(page.getPageSize());return sqlBuilder.toString(); }
PageHelper.startPage(entity.getPageNum(), entity.getPageSize());
PageHelper继承了PageMethod
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) //package com.github.pagehelper.page;import com.github.pagehelper.ISelect; import com.github.pagehelper.Page; import com.github.pagehelper.util.PageObjectUtil;public abstract class PageMethod {protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();public PageMethod() {}protected static void setLocalPage(Page page) {LOCAL_PAGE.set(page);} public static <T> Page<T> getLocalPage() {return (Page)LOCAL_PAGE.get();}public static void clearPage() {LOCAL_PAGE.remove();}public static long count(ISelect select) {Page<?> page = startPage(1, -1, true);select.doSelect();return page.getTotal();}public static <E> Page<E> startPage(int pageNum, int pageSize) {return startPage(pageNum, pageSize, true);}public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {Page<E> page = new Page(pageNum, pageSize, count);setLocalPage(page);return page;}public static <E> Page<E> offsetPage(int offset, int limit) {return offsetPage(offset, limit, true);}public static <E> Page<E> offsetPage(int offset, int limit, boolean count) {Page<E> page = new Page(new int[]{offset, limit}, count);setLocalPage(page);return page;} public static <E> Page<E> startPage(Object params) {Page<E> page = PageObjectUtil.getPageFromObject(params, true);setLocalPage(page);return page;} }
4,mybatis插件原理
Mybatis插件原理及案例_身体好饿的博客-CSDN博客
Mybatis分页插件PageHelper失效相关推荐
- 解决使用mybatis分页插件PageHelper的一个报错问题
解决使用mybatis分页插件PageHelper的一个报错问题 参考文章: (1)解决使用mybatis分页插件PageHelper的一个报错问题 (2)https://www.cnblogs.co ...
- (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示
http://blog.csdn.net/yerenyuan_pku/article/details/72774381 上文我们实现了展示后台页面的功能,而本文我们实现的主要功能是展示商品列表,大家要 ...
- Mybatis分页插件PageHelper使用教程(图文详细版)
Mybatis分页插件PageHelper使用教程(图文详细版) 1.配置 2.后台代码 controller类 html页面 html页面效果图 1.配置 小编的项目是springBoot项目,所以 ...
- MyBatis分页插件PageHelper使用练习
转载自:http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown 1.环境准备: 分页插件p ...
- 【MyBatis】MyBatis分页插件PageHelper的使用
转载自 https://www.cnblogs.com/shanheyongmu/p/5864047.html 好多天没写博客了,因为最近在实习,大部分时间在熟悉实习相关的东西,也没有怎么学习新的东西 ...
- MyBatis学习总结(17)——Mybatis分页插件PageHelper
2019独角兽企业重金招聘Python工程师标准>>> 如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 分页插件支持任何复杂的单表.多表分页,部分特殊 ...
- Mybatis分页插件PageHelper简单使用
转载自:https://www.cnblogs.com/ljdblog/p/6725094.html 引言 对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句, ...
- mybatis分页插件pageHelper简单实用
转载自 http://blog.csdn.net/Smile_Miracle/article/details/53185655 工作的框架spring springmvc mybatis3 首先使用分 ...
- MyBatis复习(八):MyBatis 分页插件 PageHelper
PageHelper是国人开源的一款MyBatis扩展插件,可以帮助完成自动分页功能.PageHelper自动分页插件使用非常简单,如果持久层框架用的是MyBatis,建议使用该分页插件. 引入分页插 ...
最新文章
- Task01:青少年软件编程(Scratch)等级考试模拟卷(一级)
- Windows 7 下月停止支持,微软重申将全屏通知敦促用户升级系统
- 机器学习 数据量不足问题----1 做好特征工程 2 不要用太多的特征 3 做好交叉验证 使用线性svm...
- Individual Project
- 容器viewController添加或者删除子viewController
- JSONObject转换JSON--将Date转换为指定格式
- 【JAVA】Eclipse保存时出现“Save could not be completed”问题
- Java数据结构的知识体系
- 【线程】——线程安全问题
- 交互设计[小插曲]--网站UI配色
- 【转】PLI是什么以及怎么用
- c++ __declspec
- 极易的je-analysis-1.5.3.jar 可与 solr 一起使用 http://www.jesoft.cn/
- 什么是技术交底书? 如何撰写技术交底书
- 案例▍Python实战 爬取万条票房数据分析2019春节档电影状况
- node项目部署到云服务器
- 兄弟单词C语言,brother是什么意思
- hover鼠标的悬停效果
- 关于was应用正常,控制台无法连接(SRVE0255E)
- 编译ASP.NET网站项目,以及部署网站到本地localhost服务器上实现独立运行