第 7 章 MyBatis的解析和运行原理
MyBatis的运行过程分为两大步
- 读取配置文件缓存到
Configuration对象,用以创建SqlSessionFactory SqlSession的执行过程
7.1 构建SqlSessionFactory过程
SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心接口SqlSession,所以要先创建SqlSessionFactory,为此要提供配置文件和相关的参数。
MyBatis采用了Builder模式去创建SqlSessionFactory,在实际中可以通过SqlSessionF actoryBuilder去构建,其构建分为两步。
- 通过
XMLConfigBuilder解析配置的XML文件,读出所配置的参数,并将读取的内容存入Configuration类对象中。 - 使用
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个部分组成的,它们分别是MappedStatement、SqlSource和BoundSql
MappedStatement的作用是保存一个映射器节点(select|insert|delete|update)的内容。它是一个类,包括许多我们配置的SQL、SQL的id、缓存信息、resultMap、parameterType、resultType、resultMap、languageDriver等重要配置内容。SqlSource是提供BoundSql对象的地方,它是MappedStatement的一个属性。它的作用是根据上下文和参数解析生成需要的SQLBoundSql是一个结果对象,也就是SqlSource通过解析得到的SQL和参数

对于最终的参数和SQL 都反映在BoundSql类对象上,在插件中往往需要拿到它进而可以拿到当前运行的SQL和参数,从而对运行过程做出必要的修改,来满足特殊的需求
BoundSql会提供3个主要的属性:parameterMappings、parameterObject和sql
parameterObject为参数本身,可以传递简单对象、POJO或者Map、@Param注解的参数parameterMappings是一个List,它的每一个元素都是ParameterMapping对象。对象会描述参数,参数包括属性名称、表达式、javaType、jdbcType、typeHandler等重要信息sql属性就是书写在映射器里面的一条被SqlSource解析后的SQL
7.2 SqlSession运行过程
7.2.1 映射器(Mapper)的动态代理
略(没看懂)
7.2.2 SqlSession下的四大对象
SqlSession的执行过程是通过Executor、StatementHandler、ParameterHandler和ResultSetHandler来完成数据库操作和结果返回的
Executor代表执行器,由它调度StatementHandler、ParameterHandler、ResultSetHandler
等来执行对应的SQL。其中StatementHandler是最重要的。StatementHandler的作用是使用数据库的Statement执行操作ParameterHandler是用来处理SQL参数的。ResultSetHandler是进行数据集ResultSet的封装返回处理的,它相当复杂,好在我们不常用它。
7.2.3 SqlSession的运行

SqlSession是通过执行器Executor调度StatementHandler来运行的。而StatementHandler经过3步
prepared预编译SQLparameterize设置参数query/update执行SQL
其中,parameterize是调用parameterHandler的方法设置的,而参数是根据类型处理器typeHandler处理的。query/update方法通过ResultSetHandler进行处理结果的封装,如果是update语句,就返回整数,否则就通过typeHandler处理结果类型,然后用ObjectFactory提供的规则组装对象,返回给调用者