【Mybaits执行原理】

SqlSession是怎么创建的?

我们在使用Mybatis的时候一直有一个疑惑。就是我们使用Mybatis知道想要使用它,是要去配置Myabtis的核心配置文件(mybatis-cofnig.xml)然后用SqlSessionFactory的build方法去读取Mybatis的核心配置文件在使用它的openSession方法去创建SqlSession对象。那这就有一个疑问了,就是Mybatis是怎么去读取核心配置文件的呢,读取之后是怎么创建SqlSession对象的呢?带着这两个问题让我们一起去阅读一下Mybatis的源码吧!

通过build去解析核心配置文件

通过Resources的getResourceAsReader方法读取Mybatis的核心配置文件

reader= Resources.getResourceAsReader("mybatis-config.xml");//读取mybatis-cofnig.xml

传入build

sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);

进入SqlSessionFactoryBuilder类找到对应的build方法(IDEA快捷键:ctrl+鼠标左键),可以发现里面重载了很多的build方法,而我们调用的方法是一个参数为Reader类型的build方法,找到它可以看见它里面又调用了另外一个build方法
build方法
它的参数有Reader(流对象),environment(环境),properties;为我们目前只是简单的创建一个SqlSession,所以只有一个一个参数(Mybatis核心配置文件)
追踪它可以看见它有一个由传入的流对象创建了一个XMLConfigBuilder对象
在这里插入图片描述
通过名字可以推测是由这个对象去解析mybatis-cofnig.xml文件,然后保存在parser对象中,而下面的方法可以可以看到它又调用了一个build方法,而这个方法的参数是根据刚刚保存了配置文件的parser对象的parse返回的返回值
在这里插入图片描述
点进parser对象的parse方法中可以看到这个方法的返回类型是Configration类型,Configration是一个保存了Mybatis框架的全局配置类
在方法中首先判断了一下是否以及解析过了,如果解析之后了就会抛出异常.反之则回去一个PATH路径表达式去获取配置文件下configuration节点,configuration节点是myabtis-cofnig.xml文件的根节点,所有的配置都是它的子节点
获取到configuration节点之后调用了本类的parseConfigration,这个方法是将configuration节点下的配置读取出来之后方法configuration(全局配置)中
在这里插入图片描述
可以看见有很多我们收悉的属性,我们可以点进去看一下

properties数据源配置

在这里插入图片描述
properties一共有三种配置方式
1.是在它的子节点下直接配置数据源,但是我们一般不使用,因为如果直接直接写在了properties节点下的话有多套数据库数据就无法配置,可扩展性不高
在这里插入图片描述

getChildrenAsProperties方法中也是去读取properties的子节点并获取它的name属性和value属性
2.在properties节点中有一个resource属性可以设置配置需要的数据源文件
3.在url节点中有一个resource属性可以设置配置需要的数据源文件
注:resource和url在properties中只能配置一个,不然就会抛出异常
选择一种数据源配置之后会将defaults中(Properties对象),在存入configuration全局配置中

typeAliases(别名)配置

在这里插入图片描述
点开typeAliasesElement方法可以看见首先回去遍历typeAliases节点下的子节点,typeAliasses也有两种设置方式

1.使用package节点

获取到package的name属性再将获取到的属性注册到configuration全局配置中
可以打开Configuration中的属性TypeAliasRegistry看一下它是怎么注册别名的
在这里插入图片描述
这里必须只能是普通的类才能够注册到别名中
其实在mybatis默认为我们已经注册了很多别名了,比如我们的基本数据类型,还有一些包装类之类的
在这里插入图片描述

2.typeAlias节点

还有一种方式就是是根据typeAlias节点的属性注册的,同样的不论是那种方式,都会调用到下面的这两个方法
在这里插入图片描述
package节点会去找到加了Alias注解的类,然后再注册。typeAlias会去获取它的属性值然后再注册到注册表中

mappers

在这里插入图片描述
这里也是去遍历mappers下面的子节点,然后再根据三种不同的方式去放入configuration全局配置中

根据SqlSessionFactory对象获取SqlSession对象

在这里插入图片描述

解析完并存入configuration全局配置中之后,会把这个configuration对象返回出去然后又会调用SqlSessionFactoryBuilder类中重载的build方法,继追踪下去
在这里插入图片描述
这里可以看到myabtis给我们new了一个默认的SqlSessionFactory,它返回的是一个SqlSessionFactory对象
在这里插入图片描述

获得了SqlSessionFactory对象之后是不是也就可以根据它的openSession方法去获得SqlSession对象了

创建SqlSession,打开一个SqlSession会话

在这里插入图片描述
在openSession方法中调用了一个方法openSessionFromDataSource,这个方法它的参数execType(ExecutorType):执行器类型
在这里插入图片描述
level(TransactionIsolationLevel):事务等级
autoCommit(boolean):是否开启事务提交,默认为false
这里我们重点关注一下下面这行代码

//根据事务和执行器类型去创建对应的执行器
final Executor executor = configuration.newExecutor(tx, execType);

这里是根据事务和执行器类型去创建一个我们需要的执行器,点开这个方法我们去开一下它类部的代码
在这里插入图片描述
前面两个三元运算符都是来判断是否传入进来这个执行器类型是否为空,如果为空的话就用默认的执行器类型
我们调试用的是默认执行器类型,所以会debug调试自然会走到默认执行器的判断中
new完执行器之后会去判断缓存是否启动,然后建一个缓存执行器,将前面new的缓存通过构造方法放入缓存执行器中
执行器创建完之后会去查看是否配置插件,如果配置了插件会将插件加入配置器
最后在返回这个配置器

 //创建默认的SqlSession
 new DefaultSqlSession(configuration, executor, autoCommit);

创建完执行器之后,就可以new出一个默认的SqlSession对象了,并将全局配置对象和执行器还有是否开启事务提价传入DefaultSqlSession构造函数就好了

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值