mybatis 3.4.6源码深度解析(一)

1 概述

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

1.1 环境搭建

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

1.2 项目层次结构介绍

从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中的方法

1.3 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()方法
    到这里主要的流程差不多就是这么多,但是里面还有很多其他的解析有兴趣的自己可以去看看
    mebatis配置文件解析图

猜你喜欢

转载自blog.csdn.net/Y1230601/article/details/83586303