Mybatis初始化是一个比较繁琐的过程,通过将配置的XML文件映射为其内部的Configuration对象,
由其统一管理。本文将通过源码跟踪其初始化配置的整个过程,以进一步了解Mybatis内部工作原理。
-
建议大家先将Mybatis源码
git clone [email protected]:mybatis/mybatis-3.git到本地,导入IDE,以便随时查阅。
(Mybatis中注释比较少,可能作者是注释洁癖吧)
-
初始化操作
-
我们可以从SqlSessionTest单元测试的Setup开始
-
MapperConfig.xml文件:
-
初始化入口从SqlSessionFactoryBuilder.build()方法开始
-
XMLConfigBuilder构造器对构建出了Configuration对象, 并作了一定的初始化动作
-
在new Configuration()中已经作了部分初始化, 如类别名注册等
-
接下来就是parser.parse()核心方法
-
属性配置
-
属性可以用于在整个配置文件中动态替换对应的属性
-
类型别名配置
1. 当元素为package时, 该包下的所有JavaBean的别名默认为package.name + [类简单名]。
2. 若JavaBean上存在@Alias注解,则使用@Alias.value()。
- Mybatis内部默认注册了一些常用类型
-
插件配置
-
Mybatis中的plugin即我们熟知的拦截器,这里取为interceptor或许更可读。
Mybatis允许我们在某些核心处理类的某些方法点进行拦截, 如
1. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
2. ParameterHandler (getParameterObject, setParameters)
3. ResultSetHandler (handleResultSets, handleOutputParameters)
4. StatementHandler (prepare, parameterize, batch, update, query)
- 一个简单的实例
- plugin初始化过程
-
对象工厂配置
-
Mybatis允许我们在创建结果对象新实例时,定制一个ObjectFactory,用于创建新对象。
-
一个简单的实例
-
对象工厂初始化过程同plugin类似
-
对象包装工厂
-
ObjectWrapperFactory允许对创建的结果对象进行进一步封装
-
通用设置配置
-
settings的配置将改变Mybatis的运行时行为,其支持的属性配置很多,可见这里。
对应的配置过程为
-
环境配置
-
我们可以使用environment配置不同的环境, 方便切换不同的数据源等。
具体的事务类型和数据源类型,在Configuration对象构造时已经注册。
-
事务工厂,分为JDBC(通过JDBC中的Connection对象管理事务)和
MANAGED(由具体的容器管理事务, 自身并不作事务操作)。如果自己实现事务管理,需要实现接口TransactionFactory
-
在mybatis-spring提供了由Spring容器管理的事务工厂实现, 这样事务管理就交由Spring容器
-
数据源, 分为JNDI,POOLED和POOLED。
如果想用其他的数据源,需实现DataSourceFactory
-
如你想使用c3p0数据源
- 环境配置过程
-
数据库厂商配置
-
有时我们需要为不同的数据库写不同的sql,首先要配置不同的数据库厂商,然后在sql语句上加上databaseId
-
在写sql语句就可以指定databaseId
-
数据库厂商配置过程
-
类型处理器配置
-
类型处理器用于Mybatis预处理PreparedStatement对象时,或从结果集中取值时,都会使用到类型处理器。
Configuration.typeHandlerRegistry内置了一些基本的类型处理器
-
我们可以继承BaseTypeHandler来实现自己的类型处理器
-
定制类型处理器,我们需要指定其对应的Java类型和Jdbc类型,
有XML和注解两种方式。
-
等价的注解配置
-
类型处理器配置过程
-
类型处理器的配置过程类似于类型别名的配置过程
-
Mapper映射配置
-
Mapper解析配置过程主要为
-
Mybatis支持了XML配置SQL mapper,如今,也开始面向接口编程,支持接口定义SQL mapper。
XML式的mapper解析主要是XMLMapperBuilder.parse()方法
-
看看核心的configurationElement方法
-
mapper的解析过程也是比较复杂的,我们可以在另外的文章再论。以上就基本是MyBatis的初始化配置过程。