美文网首页
mybatis databaseIdProvider详解

mybatis databaseIdProvider详解

作者: 左洁 | 来源:发表于2019-09-25 08:25 被阅读0次

    mybatis databaseIdProvider详解

    1.环境

    • jdk8
    • mybatis3.5.2
    • Spring 5.1.9.RELEASE
    • spring-jdbc 5.1.9.RELEASE

    2.官方解释

    myBatis可以执行不同语句根据配置数据库,多个数据提供商依靠语句中databasId属性,mybatis加载sql语句在没有databaseId或者databaseId匹配当前一个,在相同sql语句没有databaseId被匹配会丢弃。

    3.执行流程

    database执行图.jpg

    Step1:初始化SqlSessionFactoryBean

    
      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <!-- 自动扫描路径下xml文件-->
    <!--     <property name="mapperLocations" value="classpath*:mapper/*.xml" />-->
    
            <!-- 自动扫描路径下配置文件-->
            <property name="configLocation" value="classpath:mybatis-config.xml"/>
            <property name="databaseIdProvider" ref="databaseIdProvider"/>
        </bean>
        
    
    
    

    step2:设置databaseId

      
    ……………………
    if (this.databaseIdProvider != null) {// fix #64 set databaseId before parse mapper xmls
          try {
            targetConfiguration.setDatabaseId(this.databaseIdProvider.getDatabaseId(this.dataSource));
          } catch (SQLException e) {
            throw new NestedIOException("Failed getting a databaseId", e);
          }
        }
        ………………
    

    Step3:解析config标签配置文件

     xmlConfigBuilder.parse()-> parseConfiguration(parser.evalNode("/configuration"))
       -> mapperElement(root.evalNode("mappers"))->  mapperParser.parse()
          -> configurationElement(parser.evalNode("/mapper"))
           ->buildStatementFromContext(context.evalNodes("select|insert|update|delete"))
            ->buildStatementFromContext(list, configuration.getDatabaseId())
                 -> statementParser.parseStatementNode()
    

    Step4:分析parseStatementNode方法

     
    ……………………
    String id = context.getStringAttribute("id");
        String databaseId = context.getStringAttribute("databaseId");
    
            //关键点 如果map.xml中配置 databaseId="mysql",判断和上述文件中dataSoure metaData.getDatabaseProductName()是否相等,不相等直接忽略 不会保存org.apache.ibatis.session.Configuration#mappedStatements
        if (!databaseIdMatchesCurrent(id, databaseId, this.requiredDatabaseId)) {
          return;
        }
    ………………
    

    相关文章

      网友评论

          本文标题:mybatis databaseIdProvider详解

          本文链接:https://www.haomeiwen.com/subject/qcnmyctx.html