MyBatis源码小科普
文件解析与加载
- SqlSessionFactoryBuilder是mybatis加载的入口
- XMLConfigBuilder加载properties, settings, plugins等, 以及最重要的mappers. 并将解析结果设置到Configuration中
- mapper解析到MapperRegistry, 使用MapperProxyFactory存储对应type的mapper代理
- 其他分别解析到Configuration的cache, ResultMapResolver, CacheRefResolver, sqlFragments, incompleteResultMaps等变量
- 解析之后通过MapperBuilderAssistant绑定命名空间
- SqlSessionFactoryBuilder最终返回DefaultSqlSessionFactory
SQL执行
- 通过DefaultSqlSessionFactory#openSession方法创建DefaultSqlSession, 同时初始化Transaction与Executor(默认SampleExecutor), 并在Executor中设置拦截器, 清空线程异常
- 调用DefaultSqlSession相关crud方法. 或者getMapper
- getMapper: 从MapperRegistry中通过Jdk的代理实例化一个Mapper的实现类, 并使用InvocationHandler来invoke, 注入SqlSession等
- 通过MapperMethod再根据crud类型调用DefaultSqlSession对应的crud方法
- DefaultSqlSession相关crud方法
- 通过Configuration返回对应MappedStatement, 包含sql语句(无参数), resultType, parameterType, keyGenerator, databseId, 等
- Executor调用对应方法, 传入MappedStatement, 参数等
- Executor调用StatementHandler, 并交给jdbc执行最终的sql
- 使用DefaultResultSetHandler解析返回的ResultSet
- Executor关闭相关资源, 返回结果, 结束处理
缓存
插件
设计模式
- Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder
- 工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
- 单例模式,例如ErrorContext和LogFactory;
- 代理模式,Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
- 组合模式,例如SqlNode和各个子类ChooseSqlNode等;
- 模板方法模式,例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;
- 适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
- 装饰者模式,例如Cache包中的cache.decorators子包中等各个装饰者的实现;
- 迭代器模式,例如迭代器模式PropertyTokenizer;