MyBatis源码通~SqlSource

SqlSource

构建动态SQL

//XMLStatementBuilder.parseStatementNode()
SqlSource sqlSource = langDriver.createSqlSource(configuration, context, parameterTypeClass);

涉及类

  • LanguageDriverRegistry+LanguageDriver
  • XMLStatementBuilder
  • SqlSource+SqlNode+SqlSourceBuilder
  • MappedStatement

0、 解析Statement中一些重要点

  • SqlSource如何构建?
  • Sql语句中如“#{xxx}”和“${xxx}‘如何处理?
  • SqlNode是如何创建的?

1、LanguageDriverRegistry+LanguageDriver

在初始化Configuration时,会预先初始化MyBatis提供的两个LanguageDriver的实现类并注册到LanguageDriverRegistry中:RawLanguageDriverXMLLanguageDriver,默认为XMLLanguageDriver

  • LanguageDriverRegistry中用LANGUAGE_DRIVER_MAP来缓存LanguageDriver
    • key:LanguageDriver的Class
    • value:LanguageDriver的实例对象(newInstance())

在这里插入图片描述

1.1、XMLLanguageDriver

作用于解析select|update|insert|delete节点为完整的SQL语句,对应XML格式的配置文件,创建SqlSourceParameterhandler

  • 主要方法1:createSqlSource(...):调用XMLScriptBuilder创建SqlSource
  • 主要方法2:createParameterHandler(...): 创建DefaultParameterHandler
//☆☆--XMLLanguageDriver
public class XMLLanguageDriver implements LanguageDriver {
   
  @Override
  public ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
   
    //NOTE: DefaultParameterHandler
    return new DefaultParameterHandler(mappedStatement, parameterObject, boundSql);
  }

  @Override
  public SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterType) {
   
    //NOTE: 通过XMLScriptBuilder构建SqlSource
    XMLScriptBuilder builder = new XMLScriptBuilder(configuration, script, parameterType);
    return builder.parseScriptNode();
  }

  @Override
  public SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterType) {
   
    //NOTE: 传入"<script>"脚本的Sql信息,构建SqlSource
    if (script.startsWith("<script>")) {
   
      XPathParser parser = new XPathParser(script, false, configuration.getVariables(), new XMLMapperEntityResolver());
      return createSqlSource(configuration, parser.evalNode("/script"), parameterType);
    } else {
   
      //NOTE: 通过PropertyParser解析"${}"替换成具体的属性值,并直接生成TextSqlNode后构建SqlSource
      script = PropertyParser.parse(script, configuration.getVariables());
      TextSqlNode textSqlNode = new TextSqlNode(script);
      if (textSqlNode.isDynamic()) {
   
        return new DynamicSqlSource(configuration, textSqlNode);
      } else {
   
        return new RawSqlSource(configuration, script, parameterType);
      }
    }
  }
}

1.2、RawLanguageDriver

继承自XMLLanguageDrive

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只打杂的码农

你的鼓励是对我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值