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

成都网站建设kaituozu网站建设服务商 需要什么主机

成都网站建设kaituozu,网站建设服务商 需要什么主机,建设局招标网站,互联网公司排名20191、背景 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.dnsts.com.cn/news/127900.html

相关文章:

  • 电子商务网站建设程序应用题怎样做网站制作团队
  • 深圳市光明建设发展集团网站怎么做自己的网站平台
  • 首钢水钢赛德建设有限公司网站手机如何搭建网站
  • jsp网站建设美食皮皮果网站建设
  • 企业网络设计与实现毕业设计天津搜索引擎seo
  • 丽水网站建设公司艺术网站定制
  • 网站开发女生可以做吗网站模板下载地址
  • 静态网站维护网站优化排名易下拉霸屏
  • 免费ppt模板下载大全网站做网站编辑要有逻辑吗
  • 怎么为一个网站做外链网页设计与制作教程第三版课后答案
  • 卖鞋做哪个网站好网站建设的售后
  • 网站开发需要多少钱新闻wordpress默认后台密码
  • 广西网站建设银行辽宁省住房建设厅网站
  • 西部中大建设集团网站哪些网站是用h5做的
  • 广州建站公司兴田德润活动网站地图的使用
  • 太原深圳建设工程信息网站网站建设app
  • 广州海珠网站建设有没有做网站的随州
  • 去哪网网站设计风格吉林省网站制作公司有哪些
  • 视频网站采集规则自己有了域名 怎么做网站
  • 苏州专业建设网站宿州市埇桥建设规划局网站
  • it外包一个人可以赚多少seo准
  • 合肥网站建设专业设计制作公司网页代码
  • 巴中建设银行官方网站云服务器网站文件夹
  • wordpress打开超级慢百度系优化
  • 做网站 智域大连物流网站建设报价
  • 网站建设洽谈公司简历模版
  • 开家网站建设培训学校熊掌号网站怎么做
  • 哈尔滨网站建设推荐好看的wordpress模版
  • 做网站用户充值提现亚洲
  • wordpress网站无法打开英文网站收录提交