2. XMLMapperBuilder如何解析mapper.xml文件

本文详细探讨了MyBatis中XMLMapperBuilder如何解析mapper.xml文件,重点关注了XMLMapperBuilder的构造、属性以及关键方法如configurationElement的过程,展示了mybatis如何处理namespace、cache-ref、resultMap等标签。
摘要由CSDN通过智能技术生成

我们在mybatis中写的很多mapper.xml文件就是通过XMLConfigurationBuilder中的mapperElement进行解析的,下面我们好好研究一下mapper.xml文件

下面就是整个mapperElement方法中的内容,为了简化我只保留关于resource的内容。

  private void mapperElement(XNode parent) throws Exception {
    for (XNode child : parent.getChildren()) {
	          ErrorContext.instance()  .resource(resource);
           InputStream inputStream = Resources.getResourceAsStream(resource);
           //解析mapper.xml
           XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource,
                                                                configuration.getSqlFragments());
	}

    }

在mapperElement重要加载mapper.xml ,然后把解析工作交给了XMLMapperBuilder

XMLMapperBuilder

XMLMapperBuilder中的属性字段:

  • XPathParser parser:用户解析xml
  • MapperBuilderAssistant builderAssistant:用于帮助XMLMapperBuilder把解析出的内容进行对象化。例如:resultMapper标签映射成了类ResultMap。
  • Map<String, XNode> sqlFragments:暂时不清楚
  • String resource:mapper.xml所在的资源路径。

这个类继承了BaseBuilder,在BaseBuilde中有三个字段:

  • Configuration configuration:各种配置信息,来源于XMLConfigurationBuilder中的configuration
  • TypeAliasRegistry typeAliasRegistry:别名注册器,里面记录各种类的简称和对应的Class,例如:
    public class TypeAliasRegistry {
    private final Map<String, Class<?>> TYPE_ALIASES = new HashMap<String, Class<?>>();
        public TypeAliasRegistry() {
            registerAlias("string", String.class);
            registerAlias("byte", Byte.class);
            ....
            }
            ....
    }
    
  • TypeHandlerRegistry typeHandlerRegistry:里面维护了各种java类型和其对应的处理器。例如:
    public final class TypeHandlerRegistry {
      ....
        public TypeHandlerRegistry() {
    	        register(Boolean.class, new BooleanTypeHandler());
    	        register(boolean.class, new BooleanTypeHandler());
    	        register(JdbcType.BOOLEAN, new BooleanTypeHandler());
    	        register(JdbcType.BIT, new BooleanTypeHandler());
    	        ...
        }
        ...
    }
    

下面我们看看XMLMapperBuilder的parse方法中都做了什么事情

    public void parse() {
        if (!configuration.isResourceLoaded(resource)) {
            //解析mapper中的各种标签
            configurationElement(parser.evalNode("/mapper"));
            //表示该资源已经被加载过了
            configuration.addLoadedResource(resource);
            bindMapperForNamespace();
        }

        parsePendingResultMaps();
        parsePendingChacheRefs();
        parsePendingStatements();
    }


主要的解析内容都在configurationElement方法中,下面我们看看configurationElement方法(只保留关键部分)

    private void configurationElement(XNode context) {
 			String namespace = context.getStringAttribute("namespace");
            builderAssistant.setCurrentNamespace(namespace);
            //解析cache-ref
            cacheRefElement(context.evalNode("cache-ref"));
            //解析cache
            cacheElement(context.evalNode("cache"));
            //已经废弃 不看
            parameterMapElement(context.evalNodes("/mapper/parameterMap"));
            //解析resultMap标签
            resultMapElements(context.evalNodes("/mapper/resultMap"));
            //解析sql标签
            sqlElement(context.evalNodes("/mapper/sql"));
            //解析insert update delete select标签..
            buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
    }

这一篇文章我们找到了解析mapper.xml文件的入口,下面我们看看mybatis是如何解析各种标签的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值