MyBatis(三) xml文件解析流程 动态SQL解析

本文详细解析了MyBatis中XML文件的解析流程,从Configure对象的重要性到XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder等类的功能。重点介绍了动态SQL的解析过程,包括XMLMapperBuilder的configurationElement方法作为起点,XMLStatementBuilder如何解析SQL节点,以及SqlSource的生成。还探讨了不同类型的SqlNode,如TrimSqlNode、IfSqlNode、ChooseSqlNode和ForEachSqlNode在动态SQL中的作用。
摘要由CSDN通过智能技术生成

1.MyBatis将整个系统串联起来的就是Configure对象这个需要牢记。在前面MyBatis xml文件解析流程(二) Mapper解析中介绍了Mapper的解析入口,以及Mapper文件中各个节点的解析方法。里面有几个类需要总结下

BaseBuilder.png

  1. BaseBuilder:作为其他Builder类的基类
    2.XMLConfigBuilder:在Configuration解析时介绍过,主要用来解析config配置文件下的Configuration节点,内部会使用XMLMapperBuilder用于解析xml文件
    3.XMLMapperBuilder:在Mapper解析中也介绍过。主要用来解析Mapper文件的,里面用,内部会使用XMLStatementBuilder来处理节点
    4.XMLStatementBuilder:解析select|insert|update|delete节点,内部会使用XMLScriptBuilder解析xml节点
    5.XMLScriptBuilder:解析sql中各个其他的节点并把解析结果保存到SqlNode中。
    6.MapperBuilderAssistant:这是mapper解析中的关键,他作为mapper解析的助理类,负责将解析出来的结果保存下来,并且通过configuration.addMappedStatement方法保存到conguration对象中,最终在调用dao是根据传入的参数动态生成sql。所以说configuration是MyBatis调用的调配中心。

2.动态sql解析流程分析
2.1 从XMLMapperBuilder类中configurationElement方法是mapper文件解析开始。

private void configurationElement(XNode context) {
    try {
      String namespace = context.getStringAttribute("namespace");
      if (namespace.equals("")) {
          throw new BuilderException("Mapper's namespace cannot be empty");
      }
      builderAssistant.setCurrentNamespace(namespace);
      cacheRefElement(context.evalNode("cache-ref"));
      cacheElement(context.evalNode("cache"));
      parameterMapElement(context.evalNodes("/mapper/parameterMap"));
      resultMapElements(context.evalNodes("/mapper/resultMap"));
      sqlElement(context.evalNodes("/mapper/sql"));
//sql insert|select|update|delete节点解析入口
      buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing Mapper XML. Cause: " + e, e);
    }
  }

2.2调用buildStatementFromContext方法,将配置文件中的insert|select|update|delete保存到list集合中,并且通过buildStatementFromContext方法进行循环解析所有节点

 private void buildStatementFromContext(List<XNode> list) {
    if (configuration.getDatabaseId() != null) {
      buildStatementFromContext(list, configuration.getDatabaseId());
    }
    buildStatementFromContext(list, null);
  }

  private void buildStatementFromContext(List<XNode> list, String requiredDatabaseId) {
    for
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值