若依框架---PageHelper分页(十)

news/2024/12/5 9:17:22/

在前几天的文章中,我们介绍了PageHelper的分页方法,研读代码定位到了ExecutorUtil.pageQuery(...)方法,并阅读到了其中的部分代码。

今天我们将看到重要的SQL修改代码。

getPageSql

我们接着看代码:

if (!dialect.beforePage(ms, parameter, rowBounds)) {return executor.query(ms, parameter, RowBounds.DEFAULT, resultHandler, cacheKey, boundSql);
} else {parameter = dialect.processParameterObject(ms, parameter, boundSql, cacheKey);String pageSql = dialect.getPageSql(ms, boundSql, parameter, rowBounds, cacheKey);// 其他代码 ...
}

今天应该阅读dialect.getPageSql方法了。通过前面的文章,我们已经知道dialect对应的实现是MysqlDialect,那么getPageSql在MySql中的具体实现是什么样的呢?

public class MySqlDialect extends AbstractHelperDialect {public String getPageSql(String sql, Page page, CacheKey pageKey) {StringBuilder sqlBuilder = new StringBuilder(sql.length() + 14);sqlBuilder.append(sql);if (page.getStartRow() == 0L) {sqlBuilder.append("\n LIMIT ? ");} else {sqlBuilder.append("\n LIMIT ?, ? ");}return sqlBuilder.toString();}
}

经过不懈的查找,我们终于看到了对SQL语句的直接修改了。(^▽^)。

这里的写法也很值得学习,首先是使用StringBuilder加速字符串拼接速度;其次,是在拼接前首先开辟充足的空间new StringBulder(sql.length() + 14)以免在StringBuilder拼接过程中再次分配空间浪费时间。

然后我们就看到了SQL拼接啦!!!

首先判断是否是第一页,如果是第一页,则拼接\n LIMIT ?,不是第一页则拼接\n LIMIT ?, ?

至此我们终于看到了SQL修改的真容。

为表庆祝,已经确定我们查看的就是代码执行位置,今天我们换种形式,借助IDEA来逐步查看Java代码的执行情况。

以若依系统中的中某个页面,如“系统监控->定时任务”存在分页,我们以此为例。

页面加载完成后是下面的样子:

 我们首先在PageInterceptor拦截器入口处打一个断点。:

并成功拦截。

然后我们在MysqlDialect修改方法出打一个断点,并再次成功拦截!开心!

题外话

我公司目前使用的另一套开源架构jfinal,其中的分页方式也蛮方便的,但是和PageHelper没什么关系,这里多说几句吧。

jfinal中的分页方式使用为:

Page<Record> page = Db.paginate(pageNumber, pageSize, selectSql, sqlExceptSelect);

里面的参数名称都很规范,相信大家都看的明白,我们大致看一下它其中的分页实现代码是怎样的:

/**MySqlDialect.java*/
public String forPaginate(int pageNumber, int pageSize, StringBuilder findSql) {int offset = pageSize * (pageNumber - 1);findSql.append(" limit ").append(offset).append(", ").append(pageSize);    // limit can use one or two '?' to pass parasreturn findSql.toString();
}

可以看到他也是通过拼接LIMIT offset, pageSize来实现的。其中的offset=pageSize * (pageNumber - 1)。


http://www.ppmy.cn/news/22498.html

相关文章

【数模比赛】2023美国大学生数学建模比赛(思路、代码......)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

cmake构建动态库

文章目录前言代码库文件代码测试代码Linux下测试前言 linux下的动态库/静态库&#xff0c;以前就知道咋构建&#xff1a;头文件与库的关系。最近写win下动态库的时候&#xff0c;有些细节与linux下有点不同。 所以这篇文章简单介绍下&#xff0c;如果使用cmake构建一个可以跨…

git命令总结

1、git stash命令总结 git stash:命令会把所有未提交的修改保存到git堆栈&#xff08;包括git add和未add的&#xff09;。 git stash save "test-cmd-stash"&#xff1a;作用同上&#xff0c;但可以给stash添加注释信息。 git stash --keep-inde&#xff1a;只会…

HTML基础学习(3)——认识表格

往期文章 HTML基础学习&#xff08;1&#xff09;——HTML基本标签HTML基础学习&#xff08;2&#xff09;——超链接和使用图像 # 1.表格基本组成 HTML中表格使用表格标签\和多个行\、表头\ 或单元格\组成。 标签描述<table>定义表格<caption>定义表格标题<…

【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 31页省一等奖论文及代码

相关链接 &#xff08;1&#xff09;【第十届“泰迪杯”数据挖掘挑战赛】B题&#xff1a;电力系统负荷预测分析 问题一Baseline方案 &#xff08;2&#xff09;【第十届“泰迪杯”数据挖掘挑战赛】B题&#xff1a;电力系统负荷预测分析 问题一ARIMA、AutoARIMA、LSTM、Prophe…

软件体系结构 架构技术知识点总结(建议收藏)

文章目录页面技术一、Spring框架1. 三层体系架构2. Spring的核心3. Spring 的Bean中主要的装配方式&#xff08;1&#xff09;基于XML的装配&#xff1a;&#xff08;2&#xff09;基于Annotation的装配&#xff1a;&#xff08;3&#xff09;自动装配&#xff1a;4. Spring框架…

面试被问到“类的加载过程”,怎么回答可以脱颖而出?

目录一、做一个小测试&#xff0c;通过注释&#xff0c;标注出下面两个类中每个方法的执行顺序&#xff0c;并写出studentId的最终值。二、类的初始化步骤&#xff1a;三、看看你写对了没&#xff1f;四、类的加载过程1、加载2、链接3、初始化五、类加载器的分类1、启动类加载器…

【Spring】OCP,DIP原则,IoC思想和依赖注入DI重点知识汇总

1. Spring启示录:1.1 OCP原则&#xff1a;什么是OCP?OCP是软件七大开发原则的最基本原则: 开闭原则对什么开? 对扩展开放对什么闭? 对修改关闭OCP原则是最核心的最基本的, 其他的六个原则都是为这个原则服务的OCP开闭原则的核心是什么?只要你在扩展功能的时候, 没有修改以前…