MyBatis学习(七)

67 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第37天,点击查看活动详情

MyBatis源码初步

前面已经将MyBatis中的一些基础功能进行了讲解,并能够将MyBatis应用起来了,接下来深入到MyBatis框架中,看下MyBatis的一些源码设计。

从API入手

我们再来看下应用中使用MyBatis的形式,如下:

List<User> userList = userMapper.queryUserBySchoolName(userParam);

其中userMapper是我们写的接口,MyBatis帮我们进行实例化。它帮我们省下了很多代码,包括

  • 建立和获取数据库连接
  • SQL语句映射
  • 参数转换和语句预处理
  • 结果集转换成实体类 image.png 从打印的日志来看,MyBatis的使用分为了两个阶段:
  • 第一阶段:MyBatis初始化阶段。该阶段用来完成 MyBatis运行环境的准备工作,只在 MyBatis启动时运行一次。
  • 第二阶段:数据读写阶段。该阶段由数据读写操作触发,将根据要求完成具体的增、删、改、查等数据库操作。 image.png

初始化阶段

MyBatis的初始化是从静态代码块开始的,初始化会在整个项目启动时开始执行,主要用来完成配置文件的解析、数据库的连接等工作。
前面说过MyBatis的操作数据库的入口是SqlSession,如果我们单机使用的话是需要手动将配置文件传递给MyBatis的,它的由SqlSessionFactory获取,而SqlSessionFactory又是从SqlSessionFactoryBuilder获得,如下。我们需要首先获取配置文件的流,或者自己构建配置对象,之后传递给SqlSessionFactoryBuilder,通过build方法,构建出我们需要的工厂类。

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

build方法内容如下: 1669534846818.jpg 其中最重要的方法是xml配置的构建,它做了以下两个步骤:

  • 生成了一个 XMLConfigBuilder 对象,并调用了其 parse 方法,得到一个Configuration对象(因为 parse方法的输出结果为 Configuration对象)。
  • 调用了 SqlSessionFactoryBuilder 自身的 build 方法,传入参数为上一步得到的Configuration对象。 追到源码中可以看到如下的代码: image.png 进入每个子方法可以看出,解析出的相关信息都放到了 Configuration类的实例中。因此 Configuration 类中保存了配置文件的所有设置信息,也保存了映射文件的信息。可见Configuration类是一个非常重要的类。
    最终,XMLConfigBuilder对象的 parse方法返回了一个 Configuration对象。
    通过 XMLConfigBuilder 对象的 parse 方法获得了 Configuration 对象后,SqlSessionFactoryBuilder 自身的 build 方法接受 Configuration 对象为参数,返回了SqlSessionFactory对象。这样主函数中SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream)这一句的解析就结束了。
    通过上面的追踪,MyBatis 的初始化阶段已经分析完毕。在初始化阶段,MyBatis 主要进行了以下几项工作。
  • 根据配置文件的位置,获取它的输入流 InputStream。
  • 从配置文件的根节点开始,逐层解析配置文件,也包括相关的映射文件。解析过程中不断将解析结果放入 Configuration对象。
  • 以配置好的 Configuration对象为参数,获取一个 SqlSessionFactory对象。