(基于spring-mybatis)PageInterceptor 类

1、用法(EmployeeController. getEmpsWithJson())

PageHelper.startPage(pn, 10);
List<Employee> emps = employeeService.getAll();
PageInfo page = new PageInfo(emps, 10);

先看PageHelper jar 包中PageInterceptor 的源码。拦截的是Executor 的两个query()方法。在这里对SQL 进行了改写:

//调用方言获取分页sql
String pageSql = dialect.getPageSql(ms, boundSql, parameter, rowBounds, pageKey);

跟踪到最后,是在MySqlDialect. getPageSql()对SQL 进行了改写,翻页参数是从一个Page 对象中拿到的,那么Page 对象是怎么传到这里的呢?

上一步,AbstractHelperDialect. getPageSql()中:

Page page = getLocalPage();
return getPageSql(sql, page, pageKey);

Page 对象是从一个ThreadLocal<>变量中拿到的,那它是什么时候赋值的?

回到EmployeeController. getEmpsWithJson()中,PageHelper.startPage()方法,把分页参数放到了ThreadLocal<>变量中。

protected static void setLocalPage(Page page) {LOCAL_PAGE.set(page);
}

关键类总结:

对象 作用
PageInterceptor 自定义拦截器
Page 包装分页参数
PageInfo 包装结果
PageHelper 工具类

MyBatis 插件原理与自定义插件-PageHelper 原理相关推荐

  1. MyBatis 插件原理与自定义插件-插件编写与注册

    (基于spring-mybatis)运行自定义的插件,需要3 步,我们以PageHelper 为 1.编写自己的插件类 1)实现Interceptor 接口 这个是所有的插件必须实现的接口. 2)添加 ...

  2. MyBatis 插件原理与自定义插件-代理和拦截是怎么实现的?

    问题1:四大对象什么时候被代理,也就是:代理对象是什么时候创建的? 问题2:多个插件的情况下,代理能不能被代理?代理顺序和调用顺序的关系? 问题3:谁来创建代理对象? 问题4:被代理后,调用的是什么方 ...

  3. idea mybatis generator插件_Mybatis使用自定义插件去掉POJO的Getter和Setter方法

    Mybatis使用自定义插件去掉POJO的Getter和Setter方法

  4. 插件properties_Meshlab编写自定义插件(下) -- 开发自定义插件

    本文中的代码资源(即"附件")下载地址: 链接: https://pan.baidu.com/s/1Ci85MrtVHKVkxpGDYz2dXw 提取码: cueq 上一篇文章:I ...

  5. MyBatis 插件原理与自定义插件-猜想

    MyBatis 的插件可以在不修改原来的代码的情况下,通过拦截的方式,改变四大核心对象的行为,比如处理参数,处理SQL,处理结果. 第一个问题: 不修改对象的代码,怎么对对象的行为进行修改,比如说在原 ...

  6. MyBatis 插件原理与自定义插件

    MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能. 需要注意的是,如果没有完全理解MyBatis 的运行原理和插件的工作方式,最好不要使用插件,因为它会改变系底层 ...

  7. MyBatis 插件原理与自定义插件-用代理模式我们就要解决几个问题

    1) 有哪些对象允许被代理?有哪些方法可以被拦截? 我们应该了解MyBatis 允许哪些对象的哪些方法允许被拦截,并不是每一个运行的节点都是可以被修改的.只有清楚了这些对象的方法的作用,当我们自己编写 ...

  8. MyBatis 插件原理与自定义插件-需求实现

    1.当我们传入RowBounds 做翻页查询的时候,使用limit 物理分页,代替原来的逻辑分页. 2.在未启用日志组件的情况下,输出执行的SQL(先实现查询的拦截),并且统计SQL 的执行时间

  9. MyBatis 插件原理与自定义插件-应用场景分析

    作用 实现方式 水平分表 对query update 方法进行拦截 在接口上添加注解,通过反射获取接口注解,根据注解上配置的参数进行分表,修改原SQL,例 如id 取模,按月分表 数据加解密 upda ...

最新文章

  1. Confluence 6 从你的 JDBC 连接中直接启用校验查询
  2. 安全退出调用多个Activity的Application
  3. python实验报告二_分组级运算和转换
  4. Pytorch:GAN生成对抗网络实现二次元人脸的生成
  5. delphi mysql dll直接_十万火急!!!那位高手用过libmysql.dll直接连接MySql数据库?如何将二进制文件保存到blob字段中? (60分)...
  6. [转]C#连接操作mysql实例
  7. linux之awk命令学习笔记
  8. MATLAB函数使用记录1-plot/line/set
  9. 区块链矿池(pool)汇总(不定期更新,欢迎评论区留言)
  10. 大数据_Flink_Java版_数据处理_流处理API_Transform(5)_connect合流---Flink工作笔记0033
  11. mybatis --- 事务
  12. TODO:这是一个我的自媒体
  13. ADS1115--已调通(附源码)
  14. python批量图片合并
  15. 心碎!一张照片找到救命恩人,没过几天却听到了他离世的消息
  16. streamx编译,streamx-console初始化启动踩坑
  17. 什么是GIS(地理信息系统)
  18. 电子小制作:手机控制的收音机
  19. brave+zipkin实现dubbo的服务跟踪
  20. 美团招聘不要黄泛区及东北人_吃瓜群众愤慨怒怼!

热门文章

  1. asp.net权限设置可能导致应用程序无法正常运行(转)
  2. 块级元素与行级元素(内联元素)
  3. ELM327 scanners work on iPhone, iPad and iPod
  4. JAVA去掉HTMl以及CSS样式
  5. 关于mysql的error-based injection payload
  6. 深入理解WEB请求过程
  7. CentOS 7 安装 Mysql5.5 或自定义版本 RPM 方式
  8. Android 优秀博客汇总
  9. php 查询数据库返回json数据
  10. Pattern-No.07 设计模式之单例模式