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{
         //处理SQL

String 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失效相关推荐

  1. 解决使用mybatis分页插件PageHelper的一个报错问题

    解决使用mybatis分页插件PageHelper的一个报错问题 参考文章: (1)解决使用mybatis分页插件PageHelper的一个报错问题 (2)https://www.cnblogs.co ...

  2. (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示

    http://blog.csdn.net/yerenyuan_pku/article/details/72774381 上文我们实现了展示后台页面的功能,而本文我们实现的主要功能是展示商品列表,大家要 ...

  3. Mybatis分页插件PageHelper使用教程(图文详细版)

    Mybatis分页插件PageHelper使用教程(图文详细版) 1.配置 2.后台代码 controller类 html页面 html页面效果图 1.配置 小编的项目是springBoot项目,所以 ...

  4. MyBatis分页插件PageHelper使用练习

    转载自:http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown 1.环境准备: 分页插件p ...

  5. 【MyBatis】MyBatis分页插件PageHelper的使用

    转载自 https://www.cnblogs.com/shanheyongmu/p/5864047.html 好多天没写博客了,因为最近在实习,大部分时间在熟悉实习相关的东西,也没有怎么学习新的东西 ...

  6. MyBatis学习总结(17)——Mybatis分页插件PageHelper

    2019独角兽企业重金招聘Python工程师标准>>> 如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 分页插件支持任何复杂的单表.多表分页,部分特殊 ...

  7. Mybatis分页插件PageHelper简单使用

    转载自:https://www.cnblogs.com/ljdblog/p/6725094.html 引言 对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句, ...

  8. mybatis分页插件pageHelper简单实用

    转载自 http://blog.csdn.net/Smile_Miracle/article/details/53185655 工作的框架spring springmvc mybatis3 首先使用分 ...

  9. MyBatis复习(八):MyBatis 分页插件 PageHelper

    PageHelper是国人开源的一款MyBatis扩展插件,可以帮助完成自动分页功能.PageHelper自动分页插件使用非常简单,如果持久层框架用的是MyBatis,建议使用该分页插件. 引入分页插 ...

最新文章

  1. Task01:青少年软件编程(Scratch)等级考试模拟卷(一级)
  2. Windows 7 下月停止支持,微软重申将全屏通知敦促用户升级系统
  3. 机器学习 数据量不足问题----1 做好特征工程 2 不要用太多的特征 3 做好交叉验证 使用线性svm...
  4. Individual Project
  5. 容器viewController添加或者删除子viewController
  6. JSONObject转换JSON--将Date转换为指定格式
  7. 【JAVA】Eclipse保存时出现“Save could not be completed”问题
  8. Java数据结构的知识体系
  9. 【线程】——线程安全问题
  10. 交互设计[小插曲]--网站UI配色
  11. 【转】PLI是什么以及怎么用
  12. c++ __declspec
  13. 极易的je-analysis-1.5.3.jar 可与 solr 一起使用 http://www.jesoft.cn/
  14. 什么是技术交底书? 如何撰写技术交底书
  15. 案例▍Python实战 爬取万条票房数据分析2019春节档电影状况
  16. node项目部署到云服务器
  17. 兄弟单词C语言,brother是什么意思
  18. hover鼠标的悬停效果
  19. 关于was应用正常,控制台无法连接(SRVE0255E)
  20. 编译ASP.NET网站项目,以及部署网站到本地localhost服务器上实现独立运行

热门文章

  1. 创建你的第一个webdriver python代码
  2. ios14测试版兼容软件,ios14支持设备列表_ios14支持哪些机型
  3. Vue—搭建项目脚手架
  4. 使用微信小程序云开发实现类似朋友圈效果
  5. 有道云-markdown画流程图
  6. 基于QT实现B树可视化程序设计
  7. 20162329张旭升 2016-2017-2 《程序设计与数据结构》第八周学习总结
  8. CleanMyMac X4.11.1版本一款好用的Mac清理和优化工具
  9. linux红帽chown命令,Linux chown命令
  10. 如何提高App的邀请效率