mybatis的详细执行流程


1、Resource获取加载全局配置文件

Resources是ibatis.io包下面的类,也就是一个io流,用于读写文件,通过getResourceAsStream把xml文件加载进来,把配置文件解析为一个流。
image-20210716222401348

2、实例化SQLSessionBuild构造器

我们首先new了一个SqlSessionFactoryBuilder对象,他是SqlSessionFactory的构建者。
image-20210716222506251

3、解析配置文件流XMLConfigBuilder

我们调用了他的build()方法。在utils类中调用了build方法,让我们细查源码进去查看到底长什么样子?
image-20210716222820064
再向下查看,发现在进行xmlConfigBuild
image-20210716222858306

4、Configuration所有的配置信息

通过调用parse()方法解析mybatis配置文件
image-20210716223754834

然后,我们发现parse()解析完成后,他返回了一个configuration对象,它是用来存放mybatis核心配置文件解析完成后的结果。这个configuration又返回给谁了呢?继续看源码:
image-20210716223614008

5、SqlSessionfactory实例化

通过上面一步DefaultSqlSessionFactory()才真正获取到了一个SQLSessionFactory对象,将对象返回到了我们所编写的Utils工具类中的代码
image-20210716224209404

6、Transaction事务管理

接着我们调用openSession获取SQLSession对象,我们来看看openSession方法里有什么?
image-20210716225554392image-20210716230735391
看源码先看到返回值是sqlSession,再看看里面有些什么:

Transaction,这很明显是一个事务,我们都知道sql执行时都要涉及到事务操作的,提交或回滚什么的。而这个transaction产生需要什么参数呢,看源码知道里面有个environment(xml中配置的),而且是从configuration中获得的(之前做的总算没有白费),通过这些参数transactionFactory就帮我们产生了transaction。

7、创建executor执行器

继续剖析源码观察发现,接着又创建了一个executor执行器,executor执行器在mybatis中发挥着十分重要的作用。executor,这个名字一看就知道是一个执行器,是个接口(一般用SimpleExecutor来执行,实现类),他是mybatis的核心执行器,相当于jdbc中的statement,发送sql语句并执行。

有了这些我们就能得到最后的sqlSession了。
image-20210716231010468

8、创建SQLSession

image-20210716231150713
image-20210716231241934

9、jdk动态代理生成mapper接口的代理对象

主要通过DefaultSqlSession的getMapper()来生成。

首先看一看test类中的方法,通过调用了一个getmapper的方法

image-20210716231642310

细查代码首先到达的是SqlSession.class文件下的一个接口类

image-20210716231618892

接着查看他的DefaultSqlSession.class接口实现类发现,也是调用了一个getMapper的方法,然后返回了一个对象。让我们接着向下查看

image-20210716231752468

接着发现到了Configuration.class的文件下

image-20210717223005573

接着就到了MapperRegistry.class下,可以发现其实是通过mapperRegistry的对象,它里面是一个knownMappers的HashMap,用于存储配置文件中的mappers标签的每个mapper接口

image-20210717222316852
这里通过JDK动态代理,帮mapper接口生成代理实现类
image-20210717223851321
image-20210717223920636

10、Mapper对象调用执行用户方法

image-20210717224539971
Mapper对象调用方法执行其实走的是MapperProxy的invoke方法
image-20210717224639881

11、在执行增删改查成功的前提下,提交事务,未成功,则需要回滚事务

12、关闭SQLSession

其实在方法执行的时候还应该有更为详细的步骤,还要注意缓存的的存在,一级缓存会自动开启,二级缓存需要手动开启,在执行方法时首先要查看二级缓存中是否有对应的结果,然后查看一级缓存后,没有则再进行数据库访问,接着关闭数据库连接,返回到数据库池中,然后取到了结果就需要执行最后一步关闭SqlSession。

  • 12
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈陈不会敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值