Mybatis运行原理01-从xml配置到SqlSessionFactory

1.demo构建--我们做了些什么

首先建立一个demo,通过它来逐步认识mybatis内部是如何工作的。demo地址: https://mybatis.org/mybatis-3/getting-started.html

总结一下这个demo中我们做的事情吧: 

    1.定义一个mybatis-config.xml配置文件,配置的根节点为configuration,可配置的项有environments, 描述mappers信息的xml文件的位置,以及databaseIdProvider,typeHandler等信息。

    2.定义dao接口i.e.BlogMapper ,用来作为生成代理对象的模板。

    3.定义namespace与dao接口对应的mapper.xml

    4.开始使用mybatis完成数据的crud操作,如图。

a hello-world demo for mybatis

具体地:

        4.1 读取主配置文件mybatis-config.xml创建输入流is

        4.2 以is为资源创建SqlSessionFactoryBuilder这个建造器,没什么好说的,建造工厂用的,单一职责。

        4.3 构建SqlSessionFactory,也没啥好说的,就用来创建SqlSession对象。

        4.4 factory.openSession(),创建一个与数据库会话的sqlSession对象

        4.5 通过sqlSession对象获取到mapper的代理对象

        4.6 利用mapper代理对象实现对数据的操作,拿到结果集对应的java对象

        4.7 对结果集进行业务逻辑处理。

2.Mybatis做了些什么

简单来说,我们对mybatis的本身、操作数据的方法和方法对应的sql语句做了些配置,mybatis就按照预期完成了对数据的操作,并将结果集封装成了JAVA对象返回给了我们。那这个过程中它需要做哪些事情才能达到这样的效果呢?从我的角度来看至少应当做这些事情:

    1.解析配置文件

    2.将mapper配置的sql语句和方法对应起来,同时还得生成代理对象来执行方法。

    3.管理数据库连接、事务控制.etc

    4.sql语句的参数处理

    5.将结果集封装成指定的JAVA对象

3.debug看看吧

指定IO源-->读取数据流-->创建SqlSessionFactoryBuilder fb没什么可说的。

先看看fb是如何构建SqlSessionFactory的。


fb.build(InputStream is, ...)

该方法做了两件事情:

    1.通过指定的配置源,新建了一个xml解析器。xml解析器用于解析配置,然后生成一个Configuration对象,用来封装配置信息。可以用的配置源有:指定的输入流、系统环境配置以及properties文件。

    2.将Configuration对象作为build()方法的参数,构建SqlSessionFactory对象。

3.1 解析配置,创建Configuration对象

mybatis将解析配置文件并创建Configuration对象的工作交给了XMLConfigBuilder,该builder关联了configuration对象。解析分两步:

    3.3.1.解析xml文档树。

在配置文件中,标签构成了文档树的一个节点。这里就是从这个标签开始,构建出一个节点。parser.evalNode()方法就是解析节点,在这里不讲。

XMLConfigBuilder.parse()

    3.3.2.调用parseConfiguraton()方法为configuration设置属性。(重要)

    在内,有很多子标签,它们作为configuration的element。同样的,可以将其解析成一个个的节点,然后将其set到configuration对象的对应属性。先看一眼Configuration对象有哪些常见的属性吧。

Configuration类常见的一些属性

然后就开始解析配置文件中的子节点,并为Configuration对象设置属性了。这一步比较关键,因为后续的很多操作都离不开Configuration对象。

XMLConfigBuilder.parseConfiguration()

在这里以mappers为例,进去看个大概。

我们在configuration中指定mapper的方式有4种,如图。

(参考:https://www.cnblogs.com/dongying/p/4046488.html)

指定mapper
mappers节点解析

四种方式分别对应的解析方式说明:

1.指定resource,那么直接读取resource指定的xml文件,将其解析为mapper.


mapperParser.parse()

    之前XMLConfigBuilder完成了部分的Configuration对象属性的封装,现在他将这个对象作为参数传递给了XMLMapperBuilder来对Configuration对象的mapperRegistry属性进行完善。

    step1. XMLMapperBuilder去解析这个xml文件的/mapper标签,获取它的namespace,然后解析下面的parameterMap, resultMap, ,存放到Configuration的对应map内,最后解析