我这里写的并不是很仔细,主要是在debug的时候并没有截图,有些注释我自己也比较懒就没有写了,希望大家可以自己debug走一遍,这样印象会深刻一点,我这里只是写个大概
MyBatis有一个核心的配置文件,configuration.xml,这里面配置很多核心的信息,但是我并不会每一个配置都讲,这里主要是将我们再编写 xml文件中编写sql语句,以及如何执行sql并返回结果,其它的以后有时间再来写相关的文章。这里我从MyBatis官网截了张图

里面都这么多配置,这里我们先将标签,也就是映射器。之前面试问到过这么个问题,我们编写好的sql语句是在xml文件中的,那MyBatis是如何找到的。其实就是根据标签来的。本来以为这就结束了,面试官又问了有几种方式,不过还好当初MyBatis官网我是逛了不少遍的,其实是有4种

看下源码是如何解析节点的,

这个方法是在 org.apache.ibatis.builder.xml.XMLConfigBuilder类中实现的。这个方法就是解析核心配置文件的各个节点

sql配置文件的大致结构是

图片也是官网截下来的

跟进解析方法一直进入到org.apache.ibatis.scripting.xmltags.XMLScriptBuilder类中的
parseScriptNode()方法,这个方法就是解析我们编写的sql语句的。

这里滴啊用了一个方法返回了一个List集合,这个方法就是返回解析好我们编写好的sql,假如现在我们编写的sql语句是这样的

那么在解析我们编写的sql语句一般是这样的
第一步:解析到 select * from ,发现有标签存在,就先将这段解析好的封装成一个SqlNode对象,然后放到List集合中去。在解析到这里的时候就会去解析相应的节点
第二步:解析好相应的节点之后,就能得到节点配置的值了,这里就是 test,然后又封装成一个SqlNode对象,放到List集合中
第三步:解析到 where 1=1 and id = ${id},又解析到节点了,不管节点,先封装成SqlNode对象,放到List集合中去
第四步:就是将解析好的片段封装到SqlNode就行
我们可以看到SqlNode有很多的实现类,这里就可以知道什么样的节点就会解析成对应的SqlNode
解析好Sql语句之后返回的是一个集合List的集合,但是还是会封装带一个SqlSource对象中去,其实就是下面这个样子,里面只不过是包含了刚刚解析好的SQL语句而已。

但是解析成SqlSource对象并没有结束,因为后面执行SQL语句的时候是没有说获取SqlSource对象的,都是获取一个MapperStatement对象,所以在解析配置文件之后,都会把解析好的信息封装到这个类中,然后存放到Configuration类中,每解析好一条SQL语句都会将该MapperStatemnt对象放到一个Map中去,key值当然是namespace+id,所以说为什么namespace和id要唯一,这个id就是select|update之类标签的id,当然这里面还有一个很重要的信息就是SqlCommandType,

这个信息很重要,在执行sql语句的时候根据这个来执行不同的逻辑,也就是对应的增删改查。
解析好之后呢,执行方法mybatis又是怎么样找到对应的sql语句的????????

根据namespce的值得到mapper类的类型,然后将对应的namespce与mapper代理类进行绑定,并放到一个Map中去,