MyBatis源码分析-MyBatis初始化流程

  MyBatis 是支持定制化
SQL、存储过程和高档映射的精彩之持久层框架。MyBatis 避免了几有的
JDBC 代码和手动设置参数与获得结果集。MyBatis
可以对部署以及原生Map使用简便的 XML 或注解,将接口及 Java 的 POJOs(Plain
Old Java Objects,普通的
Java对象)映射成数据库中之笔录。如何新建MyBatis源码工程要点击MyBatis源码分析-IDEA新建MyBatis源码工程。

  MyBatis初始化的过程吧便是开创Configuration对象的经过,下面坐XML方式也例说明MyBatis是什么完成初始化的(完整测试代码点击MyBatis源码分析-SQL报告句执行的完好流程)。

String resouce = "conf.xml";
InputStream is = Resources.getResourceAsStream(resouce);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = sqlSessionFactory.openSession();
user = session.selectOne("com.luoxn28.dao.UserDao.getById", 1);

  以上代码通过了MyBatis初始化、创建SQLSession、执行SQL语句3单经过。根据conf.xml配置文件创建SqlSessionFactory对象,然后创建SqlSession对象,执行SQL语句。其中,MyBatis的初始化就生出在SqlSessionFactory
sqlSessionFactory = new
SqlSessionFactoryBuilder().build(is)

      
MyBatis初始化基本过程总结如下:SqlSessionFactoryBuilder根据传入的多寡流生成Configuration对象,然后因Configuration对象创建默认的SqlSessionFactory实例。其间序列图如下:

图片 1

落得图的初始化过程经过以下的几步:

    1. 调用SqlSessionFactoryBuilder对象的build(inputStream)方法;
  • 2.
    SqlSessionFactoryBuilder会根据输入流inputStream等消息创建XMLConfigBuilder对象;
    1. SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parse()方法;
    1. XMLConfigBuilder对象回来Configuration对象;
  • 5.
    SqlSessionFactoryBuilder根据Configuration对象创建一个DefaultSessionFactory对象;
    1. SqlSessionFactoryBuilder返回
      DefaultSessionFactory对象给Client,供Client使用。

 

SqlSessionFactoryBuilder相关代码:

public SqlSessionFactory build(InputStream inputStream) {
  return build(inputStream, null, null);
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
  try {
    // 1. 创建XMLConfigBuilder对象解析XML配置
    XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
    // 2. 将XML配置解析成Configuration对象,通过Configuration对象创建SqlSessionFactory
    return build(parser.parse());
  } catch (Exception e) {
    throw ExceptionFactory.wrapException("Error building SqlSession.", e);
  } finally {
    ErrorContext.instance().reset();
    try {
    inputStream.close();
    } catch (IOException e) {
    // Intentionally ignore. Prefer previous error.
    }
  }
}
/**
 * 内部通过Configuration对象创建SqlSessionFactory,也可以通过Java API方式创建Configuration对象,
 * 然后调用该方法创建SqlSessionFactory
 */
public SqlSessionFactory build(Configuration config) {
  return new DefaultSqlSessionFactory(config);
}

 

创立Configuration对象过程

  就上述的
MyBatis初始化基本历程讨论,当SqlSessionFactoryBuilder执行build()方法,调用了XMLConfigBuilder的parse()方法,然后回了Configuration对象。那么parse()方法是什么样处理XML文件,生成Configuration对象的啊?

  1.
XMLConfigBuilder会拿XML配置文件之信息变换为Document对象,而XML配置定义文件DTD转换成XMLMapperEntityResolver对象,然后用双边封装到XpathParser对象吃,XpathParser的意图是供基于Xpath表达式获取基本的DOM节点Node信息的操作。如下图所示:

图片 2

图片 3

  2. 自此XMLConfigBuilder调用parse()方法:会从XPathParser中取出
<configuration>节点对应之Node对象,然后解析这个Node节点的子Node:properties,
settings, typeAliases,typeHandlers, objectFactory, objectWrapperFactory,
plugins, environments,databaseIdProvider, mappers等。

public Configuration parse() {
  if (parsed) {
    throw new BuilderException("Each XMLConfigBuilder can only be used once.");
  }
  parsed = true;
  parseConfiguration(parser.evalNode("/configuration"));
  return configuration;
}

private void parseConfiguration(XNode root) {
  try {
    //issue #117 read properties first
    propertiesElement(root.evalNode("properties"));
    Properties settings = settingsAsProperties(root.evalNode("settings"));
    loadCustomVfs(settings);
    typeAliasesElement(root.evalNode("typeAliases"));
    pluginElement(root.evalNode("plugins"));
    objectFactoryElement(root.evalNode("objectFactory"));
    objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
    reflectorFactoryElement(root.evalNode("reflectorFactory"));
    settingsElement(settings);
    // read it after objectFactory and objectWrapperFactory issue #631
    environmentsElement(root.evalNode("environments"));
    databaseIdProviderElement(root.evalNode("databaseIdProvider"));
    typeHandlerElement(root.evalNode("typeHandlers"));
    mapperElement(root.evalNode("mappers"));
  } catch (Exception e) {
    throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
  }
}

  解析出XML中对应之价后哪怕装到Configuration对象中,具体分析过程可以阅读对应源代码。Configuration对象创建好下虽会回来,并经创造DefaultSqlSessionFactory对象。

  mapper.xml文件是当 mapperElement(root.evalNode(“mappers”));
中剖析的。

 

参考:

1、《深入理解mybatis原理》
Mybatis初始化机制详解

2、MyBatis源码分析-IDEA新建MyBatis源码工程

3、MyBatis源码分析-SQL告诉词执行之共同体流程

 

网站地图xml地图