• Mybatis—解析SQL配置


      Mybatis源代码中SqlSource描述XML文件或者Java注解配置的SQL信息,SqlNode描述动态SQL配置中的等标签,LanguageDriver的职责就是负责将Mapper SQL配置进行解析,然后将SQL配置信息转换为SqlSource对象。从而可见LanguageDriver是解析SQL信息配置关键所在,即触发解析SQL信息配置的源头。

    总览

      在Mybatis源代码中SQL配置解析过程:

    1. 通过LanguageDriver接口定义的createSqlSource方法来触发解析通过XML配置的SQL信息和通过Java注解配置的SQL信息;
    2. XMLLanguageDriver#createSqlSource方法,首先创建XMLScriptBuilder对象,然后调用XMLScriptBuilder对象的parseScriptNode方法和parseDynamicTags方法将SQL信息转换为DynamicSqlSource对象或者RawSqlSource对象;
    3. 通过SqlSource接口定义的getBoundSql方法生成其对应的BoundSql。

    LanguageDriver

      关于LanguageDriver的详细介绍可见Mybatis—LanguageDriver,这里以针对处理XML SQL信息配置的XMLLanguageDriver实现类为例,LanguageDriver接口定义了两个createSqlSource方法,这两个方法唯一的区别就在于入参的第二个参数,一个接口定义所需要的XNode类型的script,另一个接口定义则需要String类型的script。Mybatis之所以这么设计,是因为一个方法是用于处理通过XML配置的SQL信息,另一个方法则用于处理通过Java注解配置的SQL信息。

    public interface LanguageDriver {
    
      /**
       * 用于处理通过XML配置的SQL信息
       */
      SqlSource createSqlSource(
          Configuration configuration, 
          XNode script, Class<?> parameterType);
    
      /**
       * 用于处理通过Java注解配置的SQL信息
       */
      SqlSource createSqlSource(
          Configuration configuration, 
          String script, Class<?> parameterType);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

      从XMLLanguageDriver源代码来看用于处理Java注解配置的SQL信息有两个处理分支,一是处理script文本中有