mybatis databaseIdProvider详解

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.执行流程

mybatis databaseIdProvider详解_第1张图片
database执行图.jpg

Step1:初始化SqlSessionFactoryBean


  
        
        


        
        
        
    
    


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详解)