欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

mybatis源码解析2

时间:2023-07-05

我们紧接着上次讲的,由于我的mapper里面输入的resource 所以我们直接看它获取到resource属性所作的处理。。

首先获取到resource中的地址,然后获取它的输入流,通过输入流构造XMLMapperBuilder
我们看一看里面有什么:

第一步进入父类的构造方法中 并且把Config对象传如其中,这是很正常的,Config对象包含了很多我们的参数,基本上mybatis大部分对象都调用了它。我们看一看XMLMapperBuilder的父类构造函数

我们看到它首先将Config给自己的私有属性赋值,然后给一下两个属性赋值,这两个属性里面到底包含了什么,我们看一看
this.typeAliasRegistry = this.configuration.getTypeAliasRegistry();
this.typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();

首先第一个typeAliasRegistry 我们看里面装的东西就可以了解到了,再我们的xml文件中我们有时候会频繁的用到一些对象,。如果每次都写全名的话太麻烦了,所以我们使用了别名来代替它,这个我们可以在xml文件中自己配置这些别名像下面这样:

......


另一个我们可以看出它就是一个类型的处理就是我们在数据库的数据和我们的java数据的对应关系,而且也可以自定义类型,比如说我们想要在数据库中获取的Date数据处理成为一个只含有yyyy-MM-dd格式的时间数据,就可以自定义处理函数。

通过这些属性我们大致知道了这个对象是用来干什么的了,它就是用来将我们的xml文件中的文档解析出来,让他成为可以和我们的数据库进行交互的对象数据。
下面它调用了自己的parse方法来解析我们的xml文件,注意,这次解析的不是我们的最大的xml文件,而是我们的每个javaMapper的对象对应的xml文件。


进入我们的解析方法中,首先判断这个资源是否已经解析,没有解析的话调用
this.configurationElement(this.parser.evalNode("/mapper"));方法来解析我们的mapper


我们看一看它的内部总体上它就是对我们的xml文件进行了解析,成为了一个对象,方便我们的调用。

第二步 this.configuration.addLoadedResource(this.resource);
将该资源文件的位置设置为已经加载,防止下次再次加载,会出现这种情况,因为我们又是后设置的是包扫描,同时又配置了该文件就会出现重复扫描的情况。

第三步 this.bindMapperForNamespace();
将我们的命名空间和mapper接口绑定在一起,当我们在调用的时候能够直接对应。
我们看一看它的内部是怎么来的

首先获取它的命名空间,其实就是我们的对应的接口的位置,然后通过classForName获取到对应的Class对象,然后将我们的命名空间添加到已经加载的资源中,最后将我们的class对象添加进入mapperRegister中去,我们仔细看一看它如何添加的。(这里就有个小知识点了,为什么我们的mapper对象必须是接口,不能是其他的抽象类或者什么,因为我们的代理使用的是jdk的动态代理,它需要的就是一个接口,不能是其他的,如果代理使用cglib的话就可以用类,spring中就是使用cglib来代理实现的)。

里面的方法
MapperAnnotationBuilder parser = new MapperAnnotationBuilder(this.config, type);
parser.parse();
应该就是对我们的对象的注解进行解析
然后就是我们的结果集的映射,但是我们的对象暂时没有用结果集,所以这个地方就没有处理

之后我们的sqlSessionFactory正式创建成功。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。