MyBatis源码剖析

一、概述

MyBatis之所以受到众多开发者的青睐,源于其使用方便、简单的特点。这篇我们从源码的角度来剖析下MyBatis的实现原理。


二、源码剖析

我们用上篇简单的案例,通过debug模式来探究下Mybatis的底层实现,首先先观察下测试类,如下图

简单解析下:该方法第26行通过我们输入的sqlMapConfig.xml来获取了一个InputStream对象,接着用这个InputStream对象通过SqlSessionFactoryBuilder来创建一个SqlSessionFactory对象,紧接着再创建SqlSession,通过SqlSession获取Mapper,然后执行sql语句,这便是用MyBatis的简单步骤了。下面我们通过debug模式来深入探究下。

我们将断点打在第28行,如下图

然后继续往下执行,进入build()方法,如下图

该方法首先创建了一个XMLConfigBuilder对象,然后利用该对象调用parse方法得到一个Configuration对象,如下图

MyBatis的所有配置信息都会被实例化成Configuration对象,例如:properties,settings,typeAliases等等信息在Configuration对象中都有对应的字段与之匹配。

接着代码继续往下执行,进入parseConfiguration(parser.evalNode("/configuration"));方法,如下图

以上方法中可以看出,主要是对xml配置文件的解析,将解析的内容封装到Configuration对象中,具体解析步骤感兴趣的读者朋友可以自行研究,我们这里主要解析第119行:MapperElement(root.evalNode("mappers"))。如下图:

我们主要看第373行,代码进入该方法,如下图

进入configurationElement(parser.evalNode("/mapper"))方法里面,如下图

该方法会将mapper.xml文件的标签进行解析封住成MappedStatement对象存入Configuration对象里面,接下来代码继续执行,进入bindMapperForNamspace(),该方法主要是将MappedStatement和namespace绑定。接下来就是创建SqlSessionFactory

如上图,直接new DefaultSqlSessionFactory()。

分析完以上MappedStatement封装和SqlSessionFactory的创建,接下来我们分析调用流程。首先看下openSession这个方法,该方法的实现如下图的方法

上图的方法主要根据配置创建的一个事务,注意默认事务是不提交的,然后根据参数创建指定的Executor,最后返回一个DefaultSqlSession对象,代码继续执行到sqlSession.getMapper(CzhUserDao.class),其底层调用的方法如下图所示

通过上图我们可以看出,该方法根据我们传入的类,创建了一个动态代理对象,紧接着代码走到userDao.findAll()方法,其内部执行方法如下图所示

方法进入cachedMapperMethod()方法,该方法会先去methodCache里面get一下,如果能get到值,便直接返回,get不到就创建一个MapperMethod对象放入缓存,接着return mapperMethod.exexute(),我们观察下execute方法,如下图

方法走到如图所示的地方,继续往下

代码走到selectList方法

selectList方法,先确定好MappedStatement对象,然后执行query方法,query方法先对sql的参数进行一个拼接,然后继续调用query方法

最后会执行doQuery方法获取值,然后将值返回

分析到这里myBatis持久层框架主要做的事情我们已经基本分析完毕。


三、小结

本篇我们对MyBatis的底层执行流程进行了简单的分析。他首先将xml配置封装成Configuration对象,然后将Mapper文件封住成MappedStatement对象,通过<K,V>的形式存进configuration对象里,然后通过getMapper(calss clazz)为对应的接口创建一个动态代理的对象,最终通过Execute来执行,获取数据库的值。


感兴趣的读者朋友可以 关注本公众号,和我们一起学习探究。



本人因所学有限,如有错误之处,望请各位指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值