我这里写的并非很仔细,主要是在debug的时候并无截图,有些注释我本身也比较懒就没有写了,但愿你们能够本身debug走一遍,这样印象会深入一点,我这里只是写个大概面试
MyBatis有一个核心的配置文件,configuration.xml,这里面配置不少核心的信息,可是我并不会每个配置都讲,这里主要是将咱们再编写 xml文件中编写sql语句,以及如何执行sql并返回结果,其它的之后有时间再来写相关的文章。这里我从MyBatis官网截了张图 sql
里面都这么多配置,这里咱们先将标签,也就是映射器。以前面试问到过这么个问题,咱们编写好的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集合中去。在解析到这里的时候就会去解析相应的节点apache
第二步:解析好相应的节点以后,就能获得节点配置的值了,这里就是 test,而后又封装成一个SqlNode对象,放到List集合中mybatis
第三步:解析到 where 1=1 and id = ${id},又解析到节点了,无论节点,先封装成SqlNode对象,放到List集合中去app
第四步:就是将解析好的片断封装到SqlNode就行ui
咱们能够看到SqlNode有不少的实现类,这里就能够知道什么样的节点就会解析成对应的SqlNode spa
解析好Sql语句以后返回的是一个集合List的集合,可是仍是会封装带一个SqlSource对象中去,其实就是下面这个样子,里面只不过是包含了刚刚解析好的SQL语句而已。 debug
可是解析成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中去,