27、ResultMap解析

本文详细探讨了MyBatis中ResultMap的解析过程,从解析入口开始,包括resultMapElement方法、processConstructorElement处理构造标签、buildResultMappingFromContext生成结果映射以及ResultMap对象的构建。解析过程中涉及id、type、extends、autoMapping属性的处理,以及如何处理construct标签、解决javaType和TypeHandler,最终构建完整的ResultMap对象。
摘要由CSDN通过智能技术生成

ResultMap的解析入口

由前面的文章分析,mapper文件的解析都是有XMLMapperBuilder完成的。

   public void parse() {
        if (!configuration.isResourceLoaded(resource)) {
  //是否加载过此资源
            configurationElement(parser.evalNode("/mapper"));
            configuration.addLoadedResource(resource);//把加载过的资源放到Configuration的LoadedResource Set里面,标识加载过此资源
            bindMapperForNamespace();
        }

        parsePendingResultMaps();
        parsePendingCacheRefs();
        parsePendingStatements();
    }
/**
     * 解析mapper的配置项
     * 1、解析名称空间
     * 2、解析cache-ref元素,并把Cache赋给MapperBuilderAssistant
     * 3、解析cache元素,并把Cache赋给MapperBuilderAssistant
     * 4、当2中元素都存在的时候,以Cache元素为主
     * 5、解析parameterMap(不推荐使用,未来可能废弃)
     *
     * @param context
     */
    private void configurationElement(XNode context) {
        try {
            String namespace = context.getStringAttribute("namespace");//得到名称空间
            if (namespace == null || 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"));
            buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
        } catch (Exception e) {
            throw new BuilderException("Error parsing Mapper XML. Cause: " + e, e);
        }
    }

由上面的代码可知,resultMap的解析主要有resultMapElement方法完成

resultMapElement

 private ResultMap resultMapElement(XNode resultMapNode, List<ResultMapping> additionalResultMappings) throws Exception {
        ErrorContext.instance().activity("processing " + resultMapNode.getValueBasedIdentifier());
        //得到resultMap的id
        String id = resultMapNode.getStringAttribute("id",
                resultMapNode.getValueBasedIdentifier());
        //得到resultMap的类型
        String type = resultMapNode.getStringAttribute("type",
                resultMapNode.getStringAttribute("ofType",
                        resultMapNode.get
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值