目标:
从整体上了解mybaits
框架,并通过debug
过程分析启动过程中涉及到的一些关键节点。如果需要了解sql执行过程的整体情况,可以了解下我的另外一篇mybatis SQL执行流程分析(原理)
mybaits 相比原生jdbc 有了哪些改进
如果您不是很明白为啥不直接用jdbc 而是要用mybatis,建议您阅读这篇文章 看看原始的jdbc访问数据库方式,和使用mybatis
框架访问数据库方式的差异。我们会发现框架给人带来了很大的方便。主要是下面几点
- 连接获取和释放
- SQL统一存取
- 传入参数映射和动态SQL
- 结果映射和结果缓存
MyBatis框架整体设计
接口层
负责和应用层之间做交互,提供api接口给到用户调用,执行常见的增删改查,我们常见的mapper
接口实际就是该层的。
数据处理层
- 通过传入参数,构建动态SQL语句;
- SQL语句的执行以及封装查询结果集成List
框架支撑层
- 事务管理机制
- 连接池管理机制
- 缓存机制
- SQL语句的配置方式
主要构件及其相互关系
- SqlSession:作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能;
- Executor:MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护;
- StatementHandler:封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
- ParameterHandler:负责对用户传递的参数转换成JDBC Statement 所需要的参数;
- ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
- TypeHandler:负责java数据类型和jdbc数据类型之间的映射和转换;
- MappedStatement:MappedStatement维护了一条<select|update|delete|insert>节点的封装;
- SqlSource:负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回;
- BoundSql:表示动态生成的SQL语句以及相应的参数信息;
- Configuration:MyBatis所有的配置信息都维持在Configuration对象之中;
MyBatis初始化机制
初始化入口
我们都知道使用mybatis的时候回有一个配置文件mybatis-config.xml ,mybait框架的初始化也是从这个配置文件开始的。
如果你是用的spring的话,在spring的配置文件中往往会有初始化sqlSessionFactory的过程。而在实例化sqlSessionFactory的过程中就会解析我们前面提到的配置文件(mybatis-config.xml),也是我们需要重点分析的部分。
核心配置文件的解析
//解析配置
private void parseConfiguration(XNode root) {
try {
//分步骤解析
//1.properties
propertiesElement(root.evalNode("properties"));
//2.类型别名
typeAliasesElement(root.evalNode("typeAliases"));
//3.插件
pluginElement(root.evalNode("plugins"));
//4.对象工厂
objectFactoryElement(root.evalNode("objectFactory"));
//5.对象包装工厂
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
//6.设置
settingsElement(root.evalNode("settings"));
// read it after objectFactory and objectWrapperFactory issue #631
//7.环境
environmentsElement(root.evalNode("environments"));
//8.databaseIdProvider
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
//9.类型处理器
typeHandlerElement(root.evalNode("typeHandlers"));
//10.映射器
mapperElement(root.evalNode("mappers"));
}