来自官方文档

解析的方式如下:

<!-- 使用相对于类路径的资源引用 -->
<mappers><mapper resource="org/mybatis/builder/AuthorMapper.xml"/><mapper resource="org/mybatis/builder/BlogMapper.xml"/><mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers><mapper url="file:///var/mappers/AuthorMapper.xml"/><mapper url="file:///var/mappers/BlogMapper.xml"/><mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers><mapper class="org.mybatis.builder.AuthorMapper"/><mapper class="org.mybatis.builder.BlogMapper"/><mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers><package name="org.mybatis.builder"/>
</mappers>
//XMLConfigBuilder类的如下方法
/** <mappers><!--这是告诉Mybatis区哪找持久化类的映射文件,对于在src下的文件直接写文件名,如果在某包下,则要写明路径,如:com/mybatistest/config/User.xml--><mapper resource="userMapper.xml"></mapper></mappers>
*/
private void mapperElement(XNode parent) throws Exception {if (parent != null) {for (XNode child : parent.getChildren()) {if ("package".equals(child.getName())) {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) {ErrorContext.instance().resource(resource);InputStream inputStream = Resources.getResourceAsStream(resource);XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());mapperParser.parse();} else if (resource == null && url != null && mapperClass == null) {ErrorContext.instance().resource(url);InputStream inputStream = Resources.getUrlAsStream(url);XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments());mapperParser.parse();} else if (resource == null && url == null && mapperClass != null) {Class<?> mapperInterface = Resources.classForName(mapperClass);configuration.addMapper(mapperInterface);} else {throw new BuilderException("A mapper element may only specify a url, resource or class, but not more than one.");}}}}}

先分一下类:package与class这是一组;url和resource是一组

最终都会调用的方法:使用XMLMapperBuilder类中的parse()进行解析

使用的如果是:package和class时,都会将类似 com.org.learn.UserMapper 这样的全限定类名,转换为我们的路径格式:

com/org/learn/UserMapper.xml。

package:对应的是多个class的集合

看上面的注释:使用class和package这一类的方式,主要是为了集成Spring。另外,需要注意的是,使用这一类方式时,xml文件的名称一定要和接口名一样。(UserMapper接口对应UserMapper.xml)

然后,我们看我们的资源文件UserMapper.xml的读取

第一种:类似于 /com/org/learn/UserMapper.xml (先使用相对路径,如果没有使用类加载器加载)

第二种:类加载器加载 com/org/learn/UserMapper.xml

ClassLoader[] getClassLoaders(ClassLoader classLoader) {return new ClassLoader[]{classLoader,defaultClassLoader,Thread.currentThread().getContextClassLoader(),getClass().getClassLoader(),systemClassLoader};
}

一共有五个类加载器,挨个进行资源的读取。

如果,想要具体的测试每一种加载xml的方式:

我们无需自己再编写测试用例,直接在源码中的test找,关于这个类XMLMapperBuilder 的单元测试用例

不管是哪种方式的,加载资源。最终都会调用到我们上面的那个方法:

getResourceAsStream(String resource, ClassLoader[] classLoader)

类加载器加载资源的时候,先用不带“/”的相对路径的方式加载,这种方式,要求我们的加载类(接口和类对于类加载器来说一样)和文件是放到一起的。

使用“/”这种的时候,相对的是项目的跟路径,就是从跟路径开始找。

MyBatis源码的学习(9)---映射器mappers的的XML解析相关推荐

  1. mybatis源码过程学习梳理

    一.mybatis配置文件详情 在Spring中,是使用xml的配置文件或使用java代码对mybatis的连接属性,环境等进行配置的,我们先看一下mybatis中对配置文件中节点的要求. 通过myb ...

  2. mybatis源码分析之事务管理器

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇:mybatis源码分析之Configuration 主要分析了构建SqlSessionFactory的过程中配置文件的 ...

  3. caffe源码深入学习6:超级详细的im2col绘图解析,分析caffe卷积操作的底层实现

       在先前的两篇博客中,笔者详细解析了caffe卷积层的定义与实现,可是在conv_layer.cpp与base_conv_layer.cpp中,卷积操作的实现仍然被隐藏,通过im2col_cpu函 ...

  4. 【Mybatis源码】源码分析

    [Mybatis源码]源码分析 (一)Mybatis重要组件 [1]四大核心组件 (1)SqlSessionFactoryBuilder (2)SqlSessionFactory (3)SqlSess ...

  5. Mybatis源码分析: MapperMethod功能讲解

    canmengqian </div><!--end: blogTitle 博客的标题和副标题 --> <div id="navigator"> ...

  6. MyBatis源码简单分析

    准备工作 Mybatis官网地址:https://blog.mybatis.org/ MyBatis官方文档地址:https://mybatis.org/mybatis-3/ MyBatis源码下载地 ...

  7. 【博学谷学习记录】超强总结,用心分享 | 架构师 Mybatis源码学习总结

    Mybatis源码学习 文章目录 Mybatis源码学习 一.Mybatis架构设计 二.源码剖析 1.如何解析的全局配置文件 解析配置文件源码流程 2.如何解析的映射配置文件 Select inse ...

  8. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  9. MyBatis源码学习笔记(从设计模式看源码)

    文章目录 1.源码分析概述 ①.Mybatis架构分析 ②.门面模式 ③.设计模式的原则 2.日志模块分析 ①.适配器模型 ②.动态代理 ③.日志模块分析 3.数据源模块分析 ①.工厂模式 ②.数据源 ...

最新文章

  1. 从外部导入django模块
  2. 18.移动架构数据库升级解决方案
  3. Electron-builder打包详解
  4. DIOCP (一) DIOCP常见问题。
  5. 勒索病毒一周记:它让我们得到了什么经验教训?
  6. 告警系统邮件引擎、运行告警系统
  7. Python 爬虫使用固定代理IP
  8. ugui unity 图片缩放循环_Unity基础系列(四)——构造分形(递归的实现细节)...
  9. 模拟Spring如何在WEB中运行
  10. 【视频】详解Scala中的类及与Java的详细区别
  11. wxWidgets:wxMouseEvent类用法
  12. CVE-2020-0796复现(poc+exp)
  13. 现在学前端还来得及吗?总听人说饱和了
  14. 01 安装ansible
  15. 新学期福利,送18本Python图书
  16. sql server作业_在SQL Server中报告作业失败并发出警报
  17. java实现蛇形输出,Java 输入一个正整数,按蛇形打印。
  18. PPT:华为数字化转型实践分享(附下载)
  19. 中望cad自定义快捷键命令_中望CAD快捷键全集
  20. mysql全部加两岁,mysql数据库课堂笔记2

热门文章

  1. google play电子市场和gmail如何安装在国产手机、三星手机、摩托手机里
  2. java模拟登录新版正方_java 模拟登陆正方教务系统
  3. 【技巧】搭建企业公司网站的实施步骤有哪些
  4. mysql什么方法返回id_MYSQL获取自增ID的四种方法
  5. 人工智能 --- Python求解线性和非线性规划问题
  6. 【合天网安】FCKeditor 2.4.3文件上传漏洞
  7. 【JavaWeb】之Tomcat介绍、安装与使用
  8. win7正版微软给你
  9. CTF学习笔记——Easy Calc
  10. jme-旋转的双子星