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

在线报名网站建设上海网站建设上海迈歌

在线报名网站建设,上海网站建设上海迈歌,开封网站设计,深圳上市公司全部名单1、背景 springboot的pagehelper插件能够实现对mybatis查询的分页管理#xff0c;而且在使用时只需要提前声明即可#xff0c;不需要修改已有的查询语句。使用如下#xff1a; 之前对这个功能一直很感兴趣#xff0c;但是一直没完整看过#xff0c;今天准备详细梳理下。按…1、背景 springboot的pagehelper插件能够实现对mybatis查询的分页管理而且在使用时只需要提前声明即可不需要修改已有的查询语句。使用如下 之前对这个功能一直很感兴趣但是一直没完整看过今天准备详细梳理下。按照个人的习惯我喜欢带着问题去看源码这次浏览源码我希望可以了解以下两个问题1分页插件什么时候被加载的 2分页插件什么时候生效的如何生效的 2、技巧可跳过 mybatis自身的功能原理这里我们不深入探讨网上文章很多我之前也写过类似的文章这里为了防止文章杂乱我们只关注感兴趣的点即mybatis pagehelper分页原理其它的一笔带过。另外因为mybatis查询生效都是用的代理对象。如果对源码不是很熟悉很难第一时间找到打断点的位置。不过通过查看page的源码可以知道最后的分页参数都放到了threadlocal对象里如下而最后使用该threadlocal时是一定会调用它的获取和移除方法因此我们在它的这两个方法中加断点。等进入断点后再通过方法栈追踪其全流程。如下 3、源码追踪流程 有了上述方法栈的查看我们知道了查询的入口和大体流程现在重新执行查询跟随源码脚步来详细看下分页的实现逻辑。首先是在代码中我们主动进行分页查询如下 前三行代码很简单主要是从httpservletrequest中获取分页参数并设置到当前线程的threadlocal变量中。第四行则是调用接口方法进行查询。在mybatis中接口方法最终功能的实现主要是依靠MapperProxy代理类实现代理类中包含接口和xml配置相关信息所以接下来我们直接到MapperProxy中打断点追踪至于mybatis如何关联接口和mapper.xml文件MapperProxy如何生成等问题不是本文讨论重点感兴趣的可以单独去查阅或者浏览我以前的相关文章。 MapperProxy是代理对象主要调用方法是invoke方法所以在该方法中加断点或者依靠第二步中的技巧查看整个查询的方法栈随后再在MapperProxy对应的行中加断点。具体断点信息如下 因为method不是Object类型所以执行else里面的代码 可以看到最后会执行PlainMethodInvoker对象里的invoke方法所以我们接着到该方法中打断点并继续追踪查看 可以看到调用SqlSessionTemplate对象的selectList方法我们接着向下看 再接着到DefaultSqlSession中继续查看 可以看到最后会调用CachingExecutor的query方法但是这里要留意一点那就是CachingExecutor是一个代理对象执行代理对象方法首先要进入代理并执行invoke方法。我们这里通过断点调试的步入查看执行哪个类的invoke方法 可以看到最终是通过Plugin代理实现CachingExecutor对象query方法的调用。我们再接着向下看 因为要执行的方法是查询方法其是分页拦截器指定要拦截的方法类型所以会进入拦截方法中。这里我标记了两个框第一个是拦截第二个是不进行拦截直接执行查询方法因此可以推测分页逻辑是再拦截器中进行的。拦截器中会进行sql的改写所以这里进入拦截器中进一步查看。拦截器对象为PageInterceptor到这终于和本文的主题关联上了接下来我们到分页拦截器中看一下 可以看到源码中都加好注释了看起来就更简单了这里我们看下进入分页的条件 可以看到最后获取的page对象实际上就是我们一开在代码中传入分页参数创建的page对象。因为page对象不为空所以会返回false进而不跳过分页逻辑。另外这里要提醒下各位小伙伴page对象继承了ArrayList所以断点查看时看不得page里面的内容只能看到其size为0。 我们接着回到主流程向下看随后会判断是否需要计算总数默认创建page时需要计算总数这里我们就不进入before方法查看了里面逻辑比较简单。下面我们简单看下计算总数的逻辑 可以看到其计算总数的sql比较精简主要是根据查询的对象和条件直接计算总数。这里sql的解析和生成主要是依赖jsqlparser工具类实现(jsqlparser的使用可以参考我以前的文章)sql解析比较复杂感兴趣的可以自行查看。接着我们再回到主流程看下何时添加的分页查询参数 可以看到最后再sql末尾加了limit分页参数而这个sql的改写过程与计算count类似都是通过jsqlparser工具实现的。 通过上面的流程我们已经知道了分页插件如何生效的了。但是还有一个问题是分页插件如何被加载的。这个流程比较简单我也是通过第二步的技巧逆推的全流程。下面我按照正常项目的加载顺利简单介绍下 当我们在pom中引入pageHelper插件依赖并且在yml中配置分页相关的信息时项目启动后就会主动的进行插件的初始化并注入到插件拦截器链里面。大体逻辑如下 可以看到分页插件有个配置类其在项目初始化的时候会创建分页拦截器并调用Configuration进行添加接着我们看下最后会将拦截器添加到哪里 可以看到最终会添加到拦截器链对象的私有集合里。但是我们最终使用拦截器是在Plugin对象里用的而不是在拦截器链里面那Plugin如何使用到该拦截器的呢 在拦截器链里有个pluginAll方法它会封装拦截器成一个“链式”动态代理对象代理类是Plugin该方法会在创建Executor时执行还记得前面源码里介绍这块的提醒吧Executor是一个被动态代理的对象通过pluginAll方法将拦截器封装成链并将Executor放在链路最后一层。 可以看到通过pluginAll方法将拦截器封装成了一个链下面再看一下Executor的创建就完全清晰了 至此我们两个问题都再浏览源码的过程中清晰了。 4、总结 1该文章主要是探究sringboot分页插件实现的原理所以对于mapper.xml与接口方法的整合和mybatis代理对象如何实现查看没有细讲但是这部分也是查询过程中核心的代码。 2由PageInterceptor分页拦截器拦截指定的查询请求然后在拦截方法中调用PageHelper中的方法对sql进行改写最后再进行提交。 2无论计算总数还是重写分页sql都是通过jsqlparser工具实现的为了使得文章主题清晰这里没有介绍sql的改写过程jsqlparser的使用可以浏览我以前的文章 3Plugin是一个链式动态代理对象最后一个节点是Executor被代理对象前面的节点是Interceptor被代理对象。 4再Plugin.wrap方法中会提取出拦截器里的signature标签并保存在每个Plugin链式代理对象中。在被代理对象执行对应方法时如果plugin代理对象包含对应的signature集合则说明当前被代理对象是拦截器如果不包含signature或者signature标签没有拦截当前方法则直接执行当前方法。 参考文章 5分钟彻底搞懂MyBatis插件PageHelper原理 - 知乎
http://www.hkea.cn/news/14321198/

相关文章:

  • 做行业网站赚钱东莞公司网络营销公司
  • 石家庄市建设局网站nas 外网 wordpress
  • 温州网站域名注册服务公司建一个企业网站要花多少钱
  • 乐清建设网站哪家好重庆城乡建设信息网官网
  • 广州做网站优化app制作公司十强
  • 白银市建设局网站首页网站建设公司优势
  • 建网站有哪些文件夹app开发平台有哪些
  • 如何提高商城网站权重哪些网站是响应式
  • 深圳营销型网站建设设计公司献县制作网站
  • 重庆江北营销型网站建设公司哪家好wordpress程序在ftp中上传到空间 网页怎么打不开
  • 电影网站建设的程序wordpress编辑器格式
  • 企业网站模板免费简述什么是网络营销
  • 网站seo优化wordpress 数字格式
  • 织梦网站建设考试织梦网站添加视频教程
  • 南宁手机做网站设计淘宝上开做网站的店铺
  • wordpress网站更换空间怎么创网站
  • 商标可以做网站吗友情链接交换网
  • 做网站卖别人的软件可以吗wordpress排行榜模板
  • 2022年没封网站直接进入合肥seo
  • 网站不备案大连模板建站代理
  • 做网站教材建设旅游网站的意义
  • 做网站程序看什么书wordpress缺少临时文件夹
  • 如何通过建设网站赚钱新网站seo方法
  • 滨州网站定制ui设计哪里培训机构
  • 公司可以做多个网站吗中国十大网站建设
  • 阿里云大学 网站建设刷赞网站空间免费
  • 网站模板目录网络软文
  • 荆门网站制作公司智能设计平台
  • 爱站网 关键词挖掘附近的装修公司地点
  • 网站建设好还需投资吗网站结构有哪几种