MyBatis的解析和运行原理

MyBatis 的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqISessionFactory,第二部分是SqISession的执行过程。

构建SqlSessionFactory过程

  1. 通过org.apache.ibatis.builder.xm1.XMLConfigBuilder解析配置的XML文件,读出配置参数,并将读取的数据存入这个org.apache.ibatis.session.Configuration类中。注意,MyBatis 几乎所有的配置都是存在这里的。
  2. 使用Confinguration对象去创建SqISessionFactoryMyBatis中的SqISessionFactory是一个接口,而不是实现类,为此 MyBatis 提供了一个默认的SqISessionFactory’实现类,我们一般都会使用它org.apache.ibatis.session.defaults.DefaultSqlSessionFactory

这种创建的方式就是一种 Builder模式。对于复杂的对象而言,直接使用构造方法构建是有困难的,这会导致大量的逻辑放在构造方法中,由于对象的复杂性,在构建的时候,我们更希望一步步有秩序的来构建它,从而降低其复杂性。这个时候使用一个参数类总领全局,例如,Configuration类,然后分步构建,例如,DefaultSqSessionFactory类,就可以构建一个复杂的对象,例如,SqlSessionFactory。

构建Configuration

在SqlSessionFactory构建中,Configuration是最重要的,它的作用如下。

  • 读入配置文件,包括基础配置的XML文件和映射器的XML文件。
  • 初始化基础配置,比如 MyBatis 的别名等,一些重要的类对象,例如,插件、映射器、ObjectFactory 和typeHandler对象。
  • 提供单例,为后续创建SessionFactory 服务并提供配置的参数。
  • 执行一些重要的对象方法,初始化配置信息。

映射器的内部组成

映射器由3个部分构成

  • MappedStatement,它保存映射器的一个节点( select|insert|delete|update)。包括许多我们配置的SQL、SQL的id、缓存信息、resultMap、parameterType、resultType、languageDriver等重要配置内容。
  • SqlSource,它是提供BoundSql对象的地方,它是MappedStatement的一个属性。
  • BoundSql,它是建立SQL和参数的地方。它有3个常用的属性:SQL、parameterObject、parameterMappings。
image-20220404144713702