91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis 源碼解析 —— SqlSessionFactory

發布時間:2020-05-27 12:14:48 來源:網絡 閱讀:495 作者:Java_老男孩 欄目:編程語言

本文主要分析SqlSessionFactory的構建過程

SqlSessionFactoryBuilder從XML中構建SqlSessionFactory

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

MyBatis 源碼解析 —— SqlSessionFactory

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactoryBuilder用來創建SqlSessionFactory實例,一旦創建了SqlSessionFactory,就不再需要它了

public SqlSessionFactory build(InputStream inputStream) {
  return build(inputStream, null, null);
}

調用

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties)

源碼如下:

/**
   * 根據配置創建SqlSessionFactory
   *
   * @param inputStream 配置文件輸入流
   * @param environment 環境名稱
   * @param properties  外部配置
   * @return
   */
  public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      //parser.parse()讀取配置文件返回configuration
      //build()根據返回的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.
      }
    }
  }

最終創建DefaultSqlSessionFactory實例

public SqlSessionFactory build(Configuration config) {
  return new DefaultSqlSessionFactory(config);
}

其中

XMLConfigBuilder與Configuration

MyBatis 源碼解析 —— SqlSessionFactory

XMLConfigBuilder的方法parse()

public Configuration parse() {
    if (parsed) {
        throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    //讀取mybatis-config.xml配置信息,"configuration"是根結點
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
}

XMLConfigBuilder的方法parseConfiguration(XNode root)

/**
 * 讀取配置文件組裝configuration
 * @param root 配置文件的configuration節點
 */
private void parseConfiguration(XNode root) {
    try {
        //issue #117 read properties first
        propertiesElement(root.evalNode("properties"));
        typeAliasesElement(root.evalNode("typeAliases"));
        pluginElement(root.evalNode("plugins"));
        objectFactoryElement(root.evalNode("objectFactory"));
        objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
        reflectionFactoryElement(root.evalNode("reflectionFactory"));
        settingsElement(root.evalNode("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);
    }
}

關于配置文件相關的源碼分析參看:

http://www.iocoder.cn/MyBatis/udbwcso/Configuration

設計模式

從SqlSessionFactory和Configuration的創建過程中可以看出它們都使用了建造者模式.

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

涞源县| 清苑县| 渑池县| 库车县| 行唐县| 扎囊县| 广德县| 天祝| 昌江| 和平县| 瓦房店市| 高陵县| 乌兰察布市| 三门峡市| 海城市| 蓬溪县| 麻栗坡县| 澳门| 沙湾县| 萝北县| 浮梁县| 济宁市| 沽源县| 临夏县| 腾冲县| 黎川县| 麻阳| 鹤庆县| 高邮市| 成安县| 色达县| 上林县| 武乡县| 新源县| 江都市| 桃源县| 盐山县| 泉州市| 南华县| 晋州市| 黑龙江省|