Configuration--mappers

2022-07-08 12:38:58

本篇文章,我们来讲mybatis中最核心的配置mappers.

先来看看mappers标签的用法:

<mappers><mapperresource="org/mybatis/builder/AuthorMapper.xml"/><mapperurl="file:///var/mappers/AuthorMapper.xml"/><mapperclass="org.mybatis.builder.AuthorMapper"/><packagename="org.mybatis.builder"/></mappers>

我们直接来看mapperElement(root.evalNode(“mappers”))方法:

privatevoidmapperElement(XNode parent)throws Exception {if (parent !=null) {// 遍历mappers下所有子标签for (XNode child : parent.getChildren()) {if ("package".equals(child.getName())) {// 当子标签为package时,使用configuration的addMappers方法添加mapper
          String mapperPackage = child.getStringAttribute("name");
          configuration.addMappers(mapperPackage);
        }else {
          String resource = child.getStringAttribute("resource");
          String url = child.getStringAttribute("url");
          String mapperClass = child.getStringAttribute("class");if (resource !=null && url ==null && mapperClass ==null) {// 在mapper标签中使用resource时,使用XMLMapperBuilder的parse方法解析
            ErrorContext.instance().resource(resource);
            InputStream inputStream = Resources.getResourceAsStream(resource);
            XMLMapperBuilder mapperParser =new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
            mapperParser.parse();
          }elseif (resource ==null && url !=null && mapperClass ==null) {// 在mapper标签中使用url时,使用XMLMapperBuilder的parse方法解析
            ErrorContext.instance().resource(url);
            InputStream inputStream = Resources.getUrlAsStream(url);
            XMLMapperBuilder mapperParser =new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments());
            mapperParser.parse();
          }elseif (resource ==null && url ==null && mapperClass !=null) {// 在mapper标签中使用class时,使用configuration的addMappers方法解析
            Class<?> mapperInterface = Resources.classForName(mapperClass);
            configuration.addMapper(mapperInterface);
          }else {thrownew BuilderException("A mapper element may only specify a url, resource or class, but not more than one.");
          }
        }
      }
    }
  }

从上述代码中我们可以看出,最终是使用ConfigurationaddMappers方法或者XMLMapperBuilderparse方法去解析.

可以看出,当mapper引用的是一个类时,会使用ConfigurationaddMappers方法进行加载,当mapper引用的是一个xml文件时,会使用XMLMapperBuilderparse方法进行加载.

接下来我们将单独来讲讲这两个方法的加载过程.

  • 作者:XingTree
  • 原文链接:https://blog.csdn.net/XingTree/article/details/76944460
    更新时间:2022-07-08 12:38:58