[SSM][7][MyBatis的解析和运行原理]

第 7 章 MyBatis的解析和运行原理

MyBatis的运行过程分为两大步

  1. 读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory
  2. SqlSession的执行过程

7.1 构建SqlSessionFactory过程

SqlSessionFactoryMyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心接口SqlSession,所以要先创建SqlSessionFactory,为此要提供配置文件和相关的参数。

MyBatis采用了Builder模式去创建SqlSessionFactory,在实际中可以通过SqlSessionF actoryBuilder去构建,其构建分为两步。

  1. 通过XMLConfigBuilder解析配置的XML文件,读出所配置的参数,并将读取的内容存入Configuration 类对象中。
  2. 使用Confinguration 对象去创建SqlSessionFactory

7.1.1 构建Configuration

SqlSessionFactory构建中,Configuration是最重要的,它的作用是:

  • 读入配置文件,包括基础配置的XML和映射器XML(或注解)。
  • 初始化一些基础配置,比如MyBatis的别名等,一些重要的类对象(比如插件、映
    射器、Object工厂、typeHandlers对象等)。
  • 提供单例,为后续创建SessionFactorγ服务,提供配置的参数。
  • 执行一些重要对象的初始化方法。

Configuration是通过XMLConfigBuilder去构建的,首先它会读出所有XML配置的信息,然后把它们解析并保存在Configuration单例中。它会做如下初始化:

  • properties 全局参数。
  • typeAliases 别名。
  • Plugins 插件。
  • objectFactory 对象工厂。
  • objectWrapperFactory 对象包装工厂。
  • reflectionFactory 反射工厂。
  • settings 环境设置。
  • environments 数据库环境。
  • databaseldProvider 数据库标识。
  • typeHandlers 类型转换器。
  • Mappers 映射器。

它们都会以类似typeHandler注册那样的方法被存放到Configuration单例中,以便未来将其取出。

7.1.2 构建映射器的内部组成

XMLConfigBuilder解析XML时,会将每一个SQL和其配置的内容保存起来。一般而言,在MyBatis中一条SQL和它相关的配置信息是由3个部分组成的,它们分别是MappedStatementSqlSourceBoundSql

  • MappedStatement的作用是保存一个映射器节点(select|insert|delete|update)的内容。它是一个类,包括许多我们配置的SQLSQLid、缓存信息、resultMapparameterTyperesultTyperesultMaplanguageDriver等重要配置内容。
  • SqlSource是提供BoundSql对象的地方,它是MappedStatement的一个属性。它的作用是根据上下文和参数解析生成需要的SQL
  • BoundSql是一个结果对象,也就是SqlSource通过解析得到的SQL和参数

对于最终的参数和SQL 都反映在BoundSql类对象上,在插件中往往需要拿到它进而可以拿到当前运行的SQL和参数,从而对运行过程做出必要的修改,来满足特殊的需求

BoundSql会提供3个主要的属性:parameterMappingsparameterObjectsql

  1. parameterObject为参数本身,可以传递简单对象、POJO或者Map@Param注解的参数
  2. parameterMappings是一个List,它的每一个元素都是ParameterMapping对象。对象会描述参数,参数包括属性名称、表达式、javaTypejdbcTypetypeHandler等重要信息
  3. sql属性就是书写在映射器里面的一条被SqlSource解析后的SQL

7.2 SqlSession运行过程

7.2.1 映射器(Mapper)的动态代理

略(没看懂)

7.2.2 SqlSession下的四大对象

SqlSession的执行过程是通过ExecutorStatementHandlerParameterHandlerResultSetHandler来完成数据库操作和结果返回的

  • Executor代表执行器,由它调度StatementHandlerParameterHandlerResultSetHandler
    等来执行对应的SQL。其中StatementHandler是最重要的。
  • StatementHandler的作用是使用数据库的Statement执行操作
  • ParameterHandler是用来处理SQL参数的。
  • ResultSetHandler是进行数据集ResultSet的封装返回处理的,它相当复杂,好在我们不常用它。

7.2.3 SqlSession的运行

SqlSession是通过执行器Executor调度StatementHandler来运行的。而StatementHandler经过3步

  • prepared预编译SQL
  • parameterize设置参数
  • query/update执行SQL

其中,parameterize是调用parameterHandler的方法设置的,而参数是根据类型处理器typeHandler处理的。query/update方法通过ResultSetHandler进行处理结果的封装,如果是update语句,就返回整数,否则就通过typeHandler处理结果类型,然后用ObjectFactory提供的规则组装对象,返回给调用者