当前位置: 首页 > 网络应用技术

假装是小拜的大量学习mybatis(2)

时间:2023-03-07 01:06:06 网络应用技术

  在本文中,我们将介绍Mybatis插件的开发。这也是以前的访谈经验。面试官为我计算了DAO层的慢速SQL。当时我的答案是使用Spring的AOP机制拦截DAO层上的所有DAO层。方法,但访调员再次要求这不是SQL的执行时间。还有其他代码时间。您还有其他想法吗?我考虑过,说不,面试官继续问,您是否曾经接触过Mybatis插件的开发?我说我没有联系过。但是我已经给了稍后我。我认为这个问题是一个有价值的问题,因此我也将其列入我的学习计划中。

  在阅读本文之前建议:

  如果有人问在哪里可以找到上述两篇文章,则可以转到掘金或考虑一下。目前,公共帐户尚未。预计这三个平台的文章将在年中统一。

  如果您阅读了官方文档,MyBatis不会定义插头-in,但基本上是拦截器。Mybatis插头是一些拦截器,可以拦截某些Mybats核心组件并增强功能。有四种类型的入口点可以在官方文档中增强:

  执行SQL的核心组件。室内opecutor表示干涉或增强基础执行的CRUD操作

  拦截参数Handler意味着干扰SQL参数注入和读取的作用。

  拦截此参数Handler,以干扰/增强包装结果的动作集

  拦截声明手册是指干扰/增强陈述创建的运动

  要使Mybatis插头 - 首先,我必须实现MyBatis的拦截器接口。请注意,不应定向课程。互联网是非常受欢迎的。要实施界面,Mybatis将将实施类视为Mybatis的拦截器。拦截是什么方法以及如何指定?通过@intercepts注释,以下示例:

  请注意,该标签必须放置在环境上,Mybatis严格限制了标签的顺序。

  让我们看一下执行结果:

  谁是拦截?目前,只有遗嘱执行人和语句Handler才能选择。我们必须查看SQL时间。遗嘱执行人距离SQL有点远。(1)已经描述了第一次相遇,我不会在此处详细介绍。目前,SatectionHandler最接近SQL。它的实现类将直接转移到JDBC,因此我们拦截了语句Handler.Value,我们是否要拦截它,当然,我们还需要拦截它。我们的插件方法如下:

  如何获取相应的SQL?我们仍然去SpatectHandler查看:

  我们仍然必须通过语句获取参数。我们尝试。您会发现您将在日志级别上输出SQL。如以下内容:

  如果日志级别是调试输出,则如下:

  为什么这是?如果您已经阅读了“ MyBatis源代码学习笔记(1)首先),您可能会认为MyBatis体系结构中的日志模块将用于访问日志框架,那么这绝对是代理,我们验证我们的想法的游戏破解点:

  我最初的想法是准备statementlogger的代理类。如果您仔细考虑一下,我会感到错误。我觉得我仍然对代理模式不了解,因此我阅读了上一篇文章“代理模式 - AOP介绍”,而动态代理模式模式modethe目标:

  在“ Acting Mode-Aop Int理论”中,我们做了一个非常简单的代理:

  我们目前的需求是增强iRenthouse的方法。静态代理的使用是为iRenthouse做另一个实现课程,这相当于在Renthouse上打包一层。但是,如果我有很多要增强的类别,那么它实际上在包装中非常具有侵入性。在这种情况下,我们的最终选择是动态代理。当运行时生成接口实现类的代理类时,代理对象的方法是:

  接下来,让我们看一下Mybatis的包装方式。

  InvocationHandler是动态代理的接口,BaseJDBClogger不关注。值得注意的是:

  一些同学可能会问newproxyinstance,为什么他们给出了两个参数,因为CallableStatement继承了准备阶段。这是第一层,实际上,您可以单击另一层。在ConnectionLogger的ConnectionLogger(ConnectionLogger,它也实现了InvocationHandler,因此这也是代理回调类),并且ConnectionLogger的实例在Baseexecutor中完成。如果您仍然可以记得JDBC生产SQL,那么当时的过程实际上就是这样:

  让我们来看看。ConnectionLogger是连接的代理,但是连接界面中有很多方法,因此连接Logger在回电时做出了判断:

  regredstatementlogger是一个回调类。此准备的StatementLogger具有相应的语句。我们可以通过语句获得相应的SQL。调整类与代理商类之间的关系是什么?让我们看一下代理类的一般结构:

  因此,我最初的想法是,JDK会生成回调类的类中有一个InvocationHandler成员变量。没有此回调实例,让我们研究GetProxyClass0:

  因此解决了该案例,保护代理中的InvacationHandler受到保护,因此我们应采用以下变量:

  最终输出如下:

  但是这个插头并不是那么完美,也就是说,SQL查询时间很慢,我们现在正在写死亡

  这两个问题可以在Mybatis中解决。我们可以看到拦截器接口:

  SetProperties用于从配置文件中获取值,插件添加当前插件,而截距是一种真正增强的方法。上面已经解决了两个问题:

  在配置文件中首次配置

  然后重写:

  回想一下JDBC我们实际上执行SQL:有两种方法:

  Mybatis中的这两种方法对应于不同的语句类型,而准备的StatementLogger对应于连接的准备测试方法。如果将语句语句声明为mybatis中的语句,则我们的SQL监视语句将在此处造成错误,因此我们需要在这里。

  实际上,反射工具类是用mybatis编写的。

  然后,我有多个插头,如何指定订单?在配置文件中指定,并按顺序从上到下执行

  上面配置的执行顺序是mybatisslowsqlplplplplplplplugin01,mybatisslowsqlplugin02.插件-In

  情绪很深。最初预计它将在两个小时内写成,然后我写了一个下午。