Mybatis原理
MyBatis的解析和运行原理
MyBatis 的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqISessionFactory,第二部分是SqISession的执行过程。
构建SqlSessionFactory
过程
- 通过
org.apache.ibatis.builder.xm1.XMLConfigBuilder
解析配置的XML文件,读出配置参数,并将读取的数据存入这个org.apache.ibatis.session.Configuration
类中。注意,MyBatis
几乎所有的配置都是存在这里的。 - 使用
Confinguration
对象去创建SqISessionFactory
。MyBatis
中的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。
