MyBatis框架的使用主要包含如下步骤:
- 获取SqlSessionFactory对象;
- 获取SqlSession对象;
- 获取接口的代理对象(MapperProxy);
- 执行增删改查方法。
1. 根据配置文件创建SqlSessionFactory对象
具体创建流程如下图所示:
其中,第8步和第9步的DefaultSqlSession应改为DefaultSqlSessionFactory。
Configuration对象封装了所有配置文件的详细信息,包括全局配置文件和SQL映射文件,且解析器会将SQL映射文件中每一个增删改查标签封装为一个MappedStatement对象,并存放在Configuration对象中。
总结:解析全局配置文件和SQL映射文件的所有信息,保存在Configuration对象中,并返回包含Configuration对象的DefaultSqlSessionFactory实例。
2. 创建SqlSession对象
具体创建流程如下图所示:
总结:创建包含Executor和Configuration对象的DefaultSqlSession对象,注意Executor对象创建时会经过拦截器对其进行重新封装。
3. 获取接口的代理对象(MapperProxy)
具体创建流程如下图所示:
总结:代理对象MapperProxy中包含有DefaultSqlSession实例,即同时包含有Executor和Configuration对象。
4. 查询操作工作流程
以查询为例,其具体工作流程如下图所示:
查询流程图如下:
总结:
- StatementHandler对象,用于处理SQL语句预编译、设置参数等相关工作;
- ParameterHandler对象,用于设置SQL语句的预编译参数;
- ResultSetHandler对象,用于处理结果集;
- TypeHandler对象,则在整个过程中,进行数据库类型和JavaBean类型之间的映射。
5. 运行原理总结
/**
* 总结:
* 1、根据配置文件(全局配置和SQL映射文件)初始化Configuration对象
* 2、创建包含Configuration和Executor对象的DefaultSqlSession实例
* Executor:根据全局配置文件中的defaultExecutorType创建出对应的Executor对象
* 3、DefaultSqlSession.getMapper() : 获取Mapper接口对应的MapperProxy
* 4、MapperProxy里面包含DefaultSqlSession对象
* 5、执行增删改查方法:
* 1)、调用DefaultSqlSession的增删改查(Executor)
* 2)、会创建一个StatementHandler对象。
* (同时也会创建出ParameterHandler和ResultSetHandler)
* 3)、调用StatementHandler预编译参数以及设置参数值
* 使用ParameterHandler来给SQL设置参数
* 4)、调用StatementHandler的增删改查方法;
* 5)、ResultSetHandler封装结果
* 注意:
* 四大对象创建时都需要interceptorChain.pluginAll(parameterHandler);
*
* @throws IOException
*/