博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mybatis源码阅读心得

Posted on 2018-07-11 16:03  和风细雨汪汪  阅读(396)  评论(0编辑  收藏  举报

 

 第一天阅读源码及创建时序图。(第一次用prosson画时序图,挺丑。。)

 

 

1.  调用 SqlSessionFactoryBuilder 对象的 build(inputStream) 方法;

2.  SqlSessionFactoryBuilder 会根据输入流 inputStream 等信息创建XMLConfigBuilder 对象 ;

3.  SqlSessionFactoryBuilder 调用 XMLConfigBuilder 对象的 parse() 方法;

4.  XMLConfigBuilder 对象返回 Configuration 对象;

5.  SqlSessionFactoryBuilder 根据 Configuration 对象创建一个DefaultSessionFactory 对象;

6.  SqlSessionFactoryBuilder 返回 DefaultSessionFactory 对象给 Client ,供 Client使用。

 

public SqlSessionFactory build(InputStream inputStream)
{
  return build(inputStream, null, null);
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)
{
  try
  {
    //2. 创建XMLConfigBuilder对象用来解析XML配置文件,生成Configuration对象
    XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
    //3. 将XML配置文件内的信息解析成Java对象Configuration对象
    Configuration config = parser.parse();
    //4. 根据Configuration对象创建出SqlSessionFactory对象
    return build(config);
  }
  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.
    }
  }
}
//从此处可以看出,MyBatis内部通过Configuration对象来创建SqlSessionFactory,用户也可以自己通过API构造好Configuration对象,调用此方法创建SqlSessionFactory
public SqlSessionFactory build(Configuration config)
{
  return new DefaultSqlSessionFactory(config);
}

上述的初始化过程中,涉及到了以下几个对象:

  • SqlSessionFactoryBuilder : SqlSessionFactory的构造器,用于创建SqlSessionFactory,采用了Builder设计模式

  • Configuration :该对象是mybatis-config.xml文件中所有mybatis配置信息
  • SqlSessionFactory:SqlSession工厂类,以工厂形式创建SqlSession对象,采用了Factory工厂设计模式
  • XmlConfigParser :负责将mybatis-config.xml配置文件解析成Configuration对象,共SqlSessonFactoryBuilder使用,创建SqlSessionFactory

 

<p>当时的想法
xml文件会被XMLConfigBuilder的parse()方法解析,并存在XMLMapperBuilder的sqlFragments里

 //用来存放sql片段的哈希表
  private Map<String, XNode> sqlFragments;

</P

  

http://xpenxpen.iteye.com/blog/1508749

https://www.jianshu.com/p/e739afb8fe31

https://www.cnblogs.com/mengheng/p/3739610.html

https://blog.csdn.net/u014297148/article/details/78696096

https://blog.csdn.net/l454822901/article/details/51829785

 

结合设计模式理解