当前位置: 首页 > wzjs >正文

专门做app网站西安网站搭建公司

专门做app网站,西安网站搭建公司,精品一卡2卡三卡4卡二百信息网,wordpress列表页怎么写一、引言 分页查询是Web开发的必备功能,MyBatis生态中的PageHelper以其简单易用的特性广受欢迎。本文将从源码层面(v5.3.2)解析PageHelper的分页实现机制,结合MySQL方言展示完整的执行链路。 二、核心实现原理 1. 插件初始化 …

一、引言

分页查询是Web开发的必备功能,MyBatis生态中的PageHelper以其简单易用的特性广受欢迎。本文将从源码层面(v5.3.2)解析PageHelper的分页实现机制,结合MySQL方言展示完整的执行链路。

二、核心实现原理

1. 插件初始化

PageHelper通过MyBatis插件机制注册拦截器

2. 分页参数设置

PageHelper.startPage()方法触发分页:

public static <E> Page<E> startPage(int pageNum, int pageSize) {return startPage(pageNum, pageSize, DEFAULT_COUNT);
}// 本质是通过ThreadLocal存储分页参数
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {Page<E> page = new Page<>(pageNum, pageSize, count);setLocalPage(page); // ThreadLocal保存return page;
}

3. SQL拦截过程

核心拦截逻辑(关键代码精简):

public Object intercept(Invocation invocation) throws Throwable {// 1. 获取分页参数Page page = getLocalPage();// 2. 生成COUNT查询SQLif (page.isCount()) {count(page, mappedStatement, parameterObject, boundSql);}// 3. 生成分页SQL(MySQL方言)String pageSql = dialect.getPageSql(originalSql, page, page.getPageSizeKey());// 4. 反射修改BoundSql中的SQLField sqlField = boundSql.getClass().getDeclaredField("sql");sqlField.setAccessible(true);sqlField.set(boundSql, pageSql);// 5. 执行修改后的SQLreturn invocation.proceed();
}

4. MySQL方言处理

MySqlDialect生成LIMIT子句:

public class MySqlDialect extends AbstractHelperDialect {public String getPageSql(String sql, Page page, String orderBy) {StringBuilder sqlBuilder = new StringBuilder(sql.length() + 20);sqlBuilder.append(sql);sqlBuilder.append(" LIMIT ?, ?");return sqlBuilder.toString();}// 参数处理逻辑public Object processPageParameter(...){paramMap.put("pageNum", page.getStartRow());paramMap.put("pageSize", page.getPageSize());}
}

三、执行流程详解(以pageNum=2, pageSize=10为例)

  1. 参数设置阶段

    • startPage(2, 10)创建Page对象并存入ThreadLocal
    • Page对象计算偏移量:offset = (2-1)*10 = 10
  2. SQL拦截阶段

    • 原始SQL:SELECT * FROM user
    • 改写后SQL:SELECT * FROM user LIMIT 10, 10
  3. 参数绑定阶段

    • 设置PreparedStatement参数:
      pstmt.setInt(1, 10); // offset
      pstmt.setInt(2, 10); // pageSize
  4. 结果封装阶段

    // Page继承ArrayList
    Page<User> pageResult = (Page<User>) resultList;
    pageResult.setTotal(100); // 总记录数
  5. PageInfo构建

    new PageInfo<>(pageResult).getTotalPages(); // 计算总页数=10

四、关键设计亮点

  1. ThreadLocal线程隔离

    protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<>();
  2. 自动方言识别

    <!-- 根据jdbcUrl自动识别 -->
    <property name="helperDialect" value="mysql"/>
  3. 智能COUNT优化

    SELECT COUNT(0) FROM (原查询SQL) tmp_count

五、最佳实践建议

  1. 避免深分页

    -- 页码过大时建议改用游标分页
    SELECT * FROM user WHERE id > #{lastId} LIMIT 10
  2. 参数校验配置

    PageHelper.startPage(0, 10); // 自动修正为pageNum=1
  3. 特殊查询处理

    PageHelper.startPage(1, 10).disableCount(); // 不执行COUNT查询

六、总结

PageHelper通过MyBatis插件机制实现物理分页,其核心在于:

  1. ThreadLocal存储分页上下文
  2. 动态改写SQL语句
  3. 多方言支持体系
  4. 自动COUNT查询优化

结合MySQL的LIMIT语法特性,PageHelper在保证性能的同时提供了简洁的开发体验。理解其实现原理有助于避免深分页等常见问题,更好地发挥分页功能的价值。

http://www.dtcms.com/wzjs/38101.html

相关文章:

  • 游戏网站开发过程域名注册网站哪个好
  • 网站建设上传宝贝xamp百度电话怎么转人工客服
  • 手机怎样使用域名访问网站建网站的公司
  • 无锡网站建设 微信龙斗seo博客
  • 教做家常菜的网站运营推广计划怎么写
  • 昆山网站建设 技术支持 力得网络东莞快速排名
  • 做公司官网大概多少钱seo销售话术开场白
  • 网站上传图片加水印百度热搜的含义
  • 合肥网站建设工作室宁波seo搜索排名优化
  • 设计一个网站的优势顶尖文案网站
  • 做网站的主营业务腾讯云1元域名
  • 买2g 空间做下载网站厦门网站制作
  • 观山湖网站建设快速网站推广优化
  • 江苏专业网站制作广告联盟赚钱app
  • 品牌宝免费网站seo优化软件购买
  • 有做销售产品的网站有哪些内容网站优化是什么
  • 清远做网站的公司百度竞价推广方法
  • 网站描述案例百度网页广告怎么做
  • 织梦备份网站数据精准客源引流平台
  • wordpress 文章页面模板电商网站seo优化
  • 静海的做网站搜索引擎优化seo
  • 法律网站开发广告优化师发展前景
  • 长春病毒最新消息黄山seo排名优化技术
  • 北海做网站网站建设哪家好南昌网站seo外包服务
  • 永泰县建设局网站最近的时事新闻
  • wordpress mip主题网络搜索优化
  • 网站建设移交确认书自助建站系统下载
  • 越策网站建设竞价账户托管哪家好
  • 网站菜单导航制作教程朝阳seo建站
  • 建大型购物网站seo站长工具 论坛