MyBatis源码的学习(9)---映射器mappers的的XML解析
来自官方文档
解析的方式如下:
<!-- 使用相对于类路径的资源引用 -->
<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解析相关推荐
- mybatis源码过程学习梳理
一.mybatis配置文件详情 在Spring中,是使用xml的配置文件或使用java代码对mybatis的连接属性,环境等进行配置的,我们先看一下mybatis中对配置文件中节点的要求. 通过myb ...
- mybatis源码分析之事务管理器
2019独角兽企业重金招聘Python工程师标准>>> 上一篇:mybatis源码分析之Configuration 主要分析了构建SqlSessionFactory的过程中配置文件的 ...
- caffe源码深入学习6:超级详细的im2col绘图解析,分析caffe卷积操作的底层实现
在先前的两篇博客中,笔者详细解析了caffe卷积层的定义与实现,可是在conv_layer.cpp与base_conv_layer.cpp中,卷积操作的实现仍然被隐藏,通过im2col_cpu函 ...
- 【Mybatis源码】源码分析
[Mybatis源码]源码分析 (一)Mybatis重要组件 [1]四大核心组件 (1)SqlSessionFactoryBuilder (2)SqlSessionFactory (3)SqlSess ...
- Mybatis源码分析: MapperMethod功能讲解
canmengqian </div><!--end: blogTitle 博客的标题和副标题 --> <div id="navigator"> ...
- MyBatis源码简单分析
准备工作 Mybatis官网地址:https://blog.mybatis.org/ MyBatis官方文档地址:https://mybatis.org/mybatis-3/ MyBatis源码下载地 ...
- 【博学谷学习记录】超强总结,用心分享 | 架构师 Mybatis源码学习总结
Mybatis源码学习 文章目录 Mybatis源码学习 一.Mybatis架构设计 二.源码剖析 1.如何解析的全局配置文件 解析配置文件源码流程 2.如何解析的映射配置文件 Select inse ...
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- MyBatis源码学习笔记(从设计模式看源码)
文章目录 1.源码分析概述 ①.Mybatis架构分析 ②.门面模式 ③.设计模式的原则 2.日志模块分析 ①.适配器模型 ②.动态代理 ③.日志模块分析 3.数据源模块分析 ①.工厂模式 ②.数据源 ...
最新文章
- 从外部导入django模块
- 18.移动架构数据库升级解决方案
- Electron-builder打包详解
- DIOCP (一) DIOCP常见问题。
- 勒索病毒一周记:它让我们得到了什么经验教训?
- 告警系统邮件引擎、运行告警系统
- Python 爬虫使用固定代理IP
- ugui unity 图片缩放循环_Unity基础系列(四)——构造分形(递归的实现细节)...
- 模拟Spring如何在WEB中运行
- 【视频】详解Scala中的类及与Java的详细区别
- wxWidgets:wxMouseEvent类用法
- CVE-2020-0796复现(poc+exp)
- 现在学前端还来得及吗?总听人说饱和了
- 01 安装ansible
- 新学期福利,送18本Python图书
- sql server作业_在SQL Server中报告作业失败并发出警报
- java实现蛇形输出,Java 输入一个正整数,按蛇形打印。
- PPT:华为数字化转型实践分享(附下载)
- 中望cad自定义快捷键命令_中望CAD快捷键全集
- mysql全部加两岁,mysql数据库课堂笔记2