MyBatis和数据库的交互有两种方式有JavaAPI和Mapper接口两种,所以MyBatis的初始化必然也有两种;那么MyBatis是如何初始化的呢?MyBatis初始化的方式及引入 MyBatis的初始化可以有两种方式:基于XML配置文件:基于XML配置文件的方式是将MyBatis的所有配置信息放在XML文件中,MyBatis通过加载并XML配置文件,将配置文信息组装成内部的Configuration对象。基于JavaAPI:这种方式不使用XML配置文件,需要MyBatis使用者在Java代码中,手动创建Configuration对象,然后将配置参数set进入Configuration对象中。初始化方式XML配置 现在就从使用MyBatis的简单例子入手,深入分析一下MyBatis是怎样完成初始化的,都初始化了什么。看以下代码: 有过MyBatis使用经验的读者会知道,上述语句的作用是执行com。foo。bean。BlogMapper。queryAllBlogInfo定义的SQL语句,返回一个List结果集。总的来说,上述代码经历了三个阶段(本系列也对应三篇文章分别讲解):mybatis初始化创建SqlSession执行SQL语句 上述代码的功能是根据配置文件mybatisconfig。xml配置文件,创建SqlSessionFactory对象,然后产生SqlSession,执行SQL语句。而mybatis的初始化就发生在第三句:SqlSessionFactorysqlSessionFactorynewSqlSessionFactoryBuilder()。build(inputStream);现在就让我们看看第三句到底发生了什么。MyBatis初始化基本过程: SqlSessionFactoryBuilder根据传入的数据流生成Configuration对象,然后根据Configuration对象创建默认的SqlSessionFactory实例。 初始化的基本过程如下序列图所示: 由上图所示,mybatis初始化要经过简单的以下几步:调用SqlSessionFactoryBuilder对象的build(inputStream)方法;SqlSessionFactoryBuilder会根据输入流inputStream等信息创建XMLConfigBuilder对象;SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parse()方法;XMLConfigBuilder对象返回Configuration对象;SqlSessionFactoryBuilder根据Configuration对象创建一个DefaultSessionFactory对象;SqlSessionFactoryBuilder返回DefaultSessionFactory对象给Client,供Client使用。 SqlSessionFactoryBuilder相关的代码如下所示: 上述的初始化过程中,涉及到了以下几个对象:SqlSessionFactoryBuilder:SqlSessionFactory的构造器,用于创建SqlSessionFactory,采用了Builder设计模式Configuration:该对象是mybatisconfig。xml文件中所有mybatis配置信息SqlSessionFactory:SqlSession工厂类,以工厂形式创建SqlSession对象,采用了Factory工厂设计模式XmlConfigParser:负责将mybatisconfig。xml配置文件解析成Configuration对象,共SqlSessonFactoryBuilder使用,创建SqlSessionFactory创建Configuration对象的过程 接着上述的MyBatis初始化基本过程讨论,当SqlSessionFactoryBuilder执行build()方法,调用了XMLConfigBuilder的parse()方法,然后返回了Configuration对象。那么parse()方法是如何处理XML文件,生成Configuration对象的呢?XMLConfigBuilder会将XML配置文件的信息转换为Document对象 而XML配置定义文件DTD转换成XMLMapperEntityResolver对象,然后将二者封装到XpathParser对象中,XpathParser的作用是提供根据Xpath表达式获取基本的DOM节点Node信息的操作。如下图所示: 之后XMLConfigBuilder调用parse()方法 会从XPathParser中取出节点对应的Node对象,然后解析此Node节点的子Node:properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,plugins,environments,databaseIdProvider,mappers: 注意:在上述代码中,还有一个非常重要的地方,就是解析XML配置文件子节点的方法mapperElements(root。evalNode(mappers)),它将解析我们配置的Mapper。xml配置文件,Mapper配置文件可以说是MyBatis的核心,MyBatis的特性和理念都体现在此Mapper的配置和设计上。然后将这些值解析出来设置到Configuration对象中 解析子节点的过程这里就不一一介绍了,用户可以参照MyBatis源码仔细揣摩,我们就看上述的environmentsElement(root。evalNode(environments));方法是如何将environments的信息解析出来,设置到Configuration对象中的: 返回Configuration对象 将上述的MyBatis初始化基本过程的序列图细化: 初始化方式基于JavaAPI 当然我们可以使用XMLConfigBuilder手动解析XML配置文件来创建Configuration对象,代码如下: