注意:此系列源代码分析基于Mybatis 3.5.6,源代码的源代码,源代码仓库地址:Funcy/Mybatis。
本文是Mybatis源代码分析的第三部分。让我们分析SQL语句的执行过程。
在准备Mybatis示例演示中,我们提供的测试的主要类别如下:
在分析配置文件中,我们主要分析的施工过程,即
我们知道获得的类型是有一个成员变量,这是配置文件分析的内容。
本文继续分析演示背后的内容。
让我们先看一下这条线:
该方法在这里调用,返回的是什么。这是什么?它的注释如下:
与Mybatis合作的主要Java接口。通过此界面,您可以挖掘命令,获取映射器并管理交易。
使用Mybatis的主Java接口。通过此接口,您可以执行命令以获取MAPGER和管理交易。
从笔记来看,执行入口是。
我们进入路:
可以看出,最终处理了呼叫方法。此方法将获取数据源,生成事务处理器,然后创建一个执行器,最后包装它。进行交易处理,有相应的方法可以处理回滚和提交。您需要在执行SQL之前和之后手动调用它。本文没有分析它。我们专注于创建一个执行器,即以下代码:
执行器创建的方法如下:如下:
该方法首先基于执行器的类型创建相应的执行器,然后确定是否在处理插头-in之前是否打开缓存设备是否创建缓存执行器。
关于执行器和插件的相关内容,我们将稍后进行分析。LET查看此处的设置。一系列跟踪后,该值来自该方法,此方法是对配置文件的分析:
因此,配置来自配置文件的节点。
获得执行器后,创建了创建。相应的方法如下:
此方法仅是进行一些分配操作,因此不再进行分析。
关于一件事需要特别注意:
从音符来看,线程不安全。在实际使用中,您可以考虑为每个线程创建一个(可以实现),并为我们提供类似的信息:我们将在下面进行分析。
获得的方法,即一路遵循的方法,最终方法是:
此方法是先获取它,然后将其称为。
关于先前的分析和分析,提到它是对象的一种。
在中间,传输是获得的值是相应的:
让我们看看它是如何实例化并输入的:
实例化后,首先创建一个实例,然后调用实例化操作的方法。
它是什么?它的定义如下:
实施操作来处理JDK Dynamic代理,该方法是处理代理对象的生成。这意味着动态代理只要有一个接口(没有实现类)即可完成代理操作!这是很棒的!使用动态代理。我们使用演示来模拟:
在上面的代码中,没有实现类,但是当我们调用时,仍然可以获得结果,因为该方法的处理逻辑在其中指定了。
同样,尽管没有实施类,但该方法的逻辑已被处理。我们称之为调用的方法。您必须猜测最终调用必须是指定的SQL语句。关于此处理,我们将分析下一节。
在这里,可以获得实例。尽管它尚未实现类,但它通过动态代理生成了实例。
获得它后,我开始执行查询操作。相应的代码是:
在模式中输入此方法,它在这里:
在上一节中,在分析实例时,我们知道这是一个动态代理对象。执行该方法时,该方法被调用与实例相对应,也就是说,这也与通过调试获得的结果一致。
传递的参数如下:
定义类显然不是,因此将调用该方法,即:
这条代码包含两种方法:我们一一分析。
3.1:执行器的产生是首先查看该方法:
执行执行时,首先从缓存中获取,如果不存在,则将生成相应的方法。如果生成是接口的默认方法(JAVA8的语法,可以使用接口中的方法),则将被生成,否则将生成。在这里,我们专注于一代:
该方法分为两部分。让我们首先看一下这一代人,也就是说:
此类中有两个成员变量:和:::
让我们看一下这个过程:
建设性方法只是存储的。
3.2:该方法的方法在方法中。我们得到的课程是,让我们看一下它的方法:
继续输入该方法:
从代码的角度来看,SQL(标签),(中标)(中间标签)(中间的标签)(中间的标签)(用于执行器,执行缓存)和其他操作的操作。在这里,我们只注意操作操作与此操作相似。
我们直接输入处理多行记录的方法:
我们继续跟进,然后代码输入方法:
这里传递的是,在较早分析文件时,///标签内容的内容将被解析为对象,保存,这是一个,关键是“包名称。名称。类名称。该界面要获得相应的对应结果,所获得的结果如下:
获得它后,下一个操作由执行器处理。由于默认情况下,第一个级别的缓存被激活,因此执行缓存执行器的第一种方法:
此处获得的句子包含要执行的句子以及引入的参数:
继续跟进:
您可以看到,当查询查询时,首先确定是否存在缓存中查询的记录。如果您存在,请直接返回缓存中的记录,否则调用调用以进行查询。
这是什么?这是执行特定操作的执行器,它等同于装饰器,该装饰器包装特定的执行器将其层包装以使其具有缓存函数。对Mybatis的执行器进行了记录,我们将在下一篇文章中详细介绍它。
由于这是第一个呼叫,因此很明显,缓存中没有记录。
在此方法中,将处理数据库连接,采集和查询。在这里,我们只注意查询操作,遵循-up方法,最后输入:
此方法主要是执行的,然后处理返回结果,这是一个非常常规的操作。
如前所述,它是非线程的,它还提供了线程安全性:让我们看看其使用方式:
使用以下使用的差异:
从代码的角度来看,它具有相同的功能。
它如何实现线程安全性?让我们看一下其建设性方法:
从上面的代码中,
是的,支持方法如下:
换句话说,执行与数据库相关的操作时,它将被拦截。例如,我们执行的查询操作:
最终,该方法将被调用。
我们直接输入该方法:
从方法的角度来看,维护一个。当需要时,它将从中间获得,并且只有在没有存在的情况下才能打开。这样可以确保其独有的线程,因此线程是安全的。
本文主要介绍执行过程。引言的内容如下:
本文中的原始链接:https://my.oschina.net/funcy/blog/4952676,仅限于作者的个人级别,文章中有不可避免的事情,欢迎使用CROCKE!请与作者联系以获取业务重印。请指示非商业重印的来源。
原始:https://juejin.cn/post/7102811206129287204
