mybatis 3.4.6源码深度解析之调用主流程

文章目录

1 概述

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集,其通过XML配置的方式消除了绝大部分JDBC重复代码以及参数的设置,结果集的映射。作为开发人员,为了更好地学习和,有必要深入研究了解优秀框架的源码和mybatis的设计思路,以便更好的借鉴。同时,可以通过研究源码,可以更好的领会设计模式的精髓。

2 环境搭建

可以从git源码链接上面下载mybatis源码,然后倒入idea,源码上面我这边使用的是3.4.6版本的源码

3 项目层次结构介绍

从MyBatis代码实现的来看,个人认下MyBatis主要包含以下这些核心部件:

  • SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
  • Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
  • StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
  • ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所需要的参数,
  • ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
  • TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换
  • MappedStatement MappedStatement维护了一条<select|update|delete|insert>节点的封装,
  • SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql 表示动态生成的SQL语句以及相应的参数信息
  • Configuration MyBatis所有的配置信息都维持在Configuration对象之中。
  • MapperProxyFactory 接口代理工厂类这个类主要是试用jdk代理 mapper的实现 以实现调用SqlSession,接口类名称对应配置文件的nameSpace的值,等标签的id 对应方法名称
    它们之间的关系(图片是盗来的):
    关系图
    如果MapperProxyFactory也要加到上面这张图上去的话,应该是要放在最上面了,这个是相当于就是自动实现mapper接口然后在调用sqlsession中的方法

4 mybatis解析配置文件时序图

mybatis是通过XML配置的方来定制化 SQL、存储过程以及高级映射等。所以首先他要解析相关mapper配置文件并将解析相互来的的结果放在Configuration类中。个人认为主要的一些放在如下(类名.方法):

  • SqlSessionFactoryBuilder.build() 参数是配置文件(这个配置是mybatis的配置不是我们开发经常要写sql文件配置)的InputStream,功能是调用XMLConfigBuilder.parse()获取Configuration,然后创建DefaultSqlSessionFactory对象
  • XMLConfigBuilder.parse() 参数是配置文件(这个配置是mybatis的配置不是我们开发经常要写sql文件配置)的InputStream,功能是调用XPathParser.evalNode()获取XNode节点,然后调用XMLConfigBuilder.parseConfiguration解析节点。解析节点是通过不同的节点调用不同的方法解析并肩解析的结果保存到Configuration中。在解析中最主要还是解析我们的sql配置文件,它是在XMLConfigBuilder.mapperElement中解析
  • MLConfigBuilder.mapperElement() 参数是Xnode节点这里,功能主要是调用XMLMapperBuilder.parse方法这个方法才是重点解析每个我们开发经常要写的sql文件等。
  • XMLMapperBuilder.parse() 参数这个才是我们开发经常要写sql配置,功能主要是解析我们的sql文件,这里面又分为解析我们常常用到的、,,,,等标签,解析好后调用configuration.addMappedStatement方法将MappedStatement对象保存到mappedStatements这个map中,key就是namespace加标签的id。其实一般我们在使用SSM框架的时候也就是从这里开始的。mybaris-spring里面是从这里开始的。有兴趣的可以去看一下 mybaris-spering里面的SqlSessionFactoryBean.buildSqlSessionFactory()方法
    到这里主要的流程差不多就是这么多,但是里面还有很多其他的解析有兴趣的自己可以去看看
    解析时序图

5 mybatis 调用时序图

前面已经将配置文件解析完成,后面是就是调用相关方法操作数据库了,selectList和selectOne其实都是调用selectList方法查询的(只是selectOne判断查询的list返回的条数是不是一条,否则抛出TooManyResultsException异常),而且不管是集成mybatis-spring还是直接看3mybatis源码,都是通过sqlSession里面方法来操作。这个相当于是 1.2的细化吧
mybatis调用时序图-sqlSession调用
下面就对这张图中个人觉得比较重要的解释一下:

  • CachingExecutor ------ 这个是mybatis二级缓存执行类,默认时开启的,虽然它默认时开启的,但是他还是要在每个nameSpace配置文件中添加真正的存储引擎,否则它会直接去调执行器去操作数据库,而且他是基于nameSpace的,所以网上也有很多人说不建议使用二级缓存(也就是因为它基于nameSpace的原因,比如有一个userMapper里面全是用户的操作,并且其他地方没有对用户的操作那是没有问题的,反之就会有问题。)
  • SimpleExecutor ------ 这个是执行者类,这个有很多种,包括ReuseExecutor,BatchExecutor这三种,这个是可以通过配置选择不同的执行器的。默认的也就是常用的就是SimpleExecutor它们继承至BaseExecutor,其中的delegate. query()和queryFromDatabase方法都是父类的方法,doQuery()才是调用不同执行器的方法,来操作数据库。这里面还有一个总要的方法就是prepareStatement()方法,这个方法是回去数据库连接,并且预执行sql语句,并将查询的参数设置进去
  • PreparedStatementHandler ------ 这个类是实际去设置参数,并且获取数据库返回的数据,并且将参数传给DefaultResultSetHandler,将数据库返回的数据封装成我们设置的数据。

猜你喜欢

转载自blog.csdn.net/csdn_lulinwei/article/details/108657872