源码:https://github.com/mybatis/mybatis-3
总体
org.apache.ibatis.session.defaults.DefaultSqlSession
selectOne-->selectList-->selectList
org.apache.ibatis.executor.BaseExecutor
query-->query
重要模块
1. SQL解析(生成mysql可以直接执行的语句)
MappedStatement ms = configuration.getMappedStatement(statement);
BoundSql boundSql = ms.getBoundSql(parameter);
MapperBuilderAssistant#addMappedStatement()
(最终映射解析完成的MappedStatement放入map,在实际执行sql时使用)
Configuration#addMappedStatement
org.apache.ibatis.scripting.xmltags.DynamicSqlSource#getBoundSql(入参默认为null)
org.apache.ibatis.builder.SqlSourceBuilder#parse
org.apache.ibatis.parsing.GenericTokenParser#parse(解析AutoId = #{autoId,jdbcType=BIGINT}里的数据,然后填充)
2.SqlSessionFactory生成:org.apache.ibatis.session.SqlSessionFactoryBuilder#build(java.io.Reader, java.util.Properties)
org.apache.ibatis.session.SqlSessionFactoryBuilder#build(java.io.Reader, java.lang.String, java.util.Properties)
org.apache.ibatis.builder.xml.XMLConfigBuilder#parse
org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration(解析配置,核心逻辑)
- 重要配置列举
//对应SqlSessionFactoryBean.setPlugins()
pluginElement(root.evalNode("plugins"));
//对应SqlSessionFactoryBean.setDataSource()
environmentsElement(root.evalNode("environments"));
//mapper文件映射
mapperElement(root.evalNode("mappers"));
3.mapper文件映射:org.apache.ibatis.builder.xml.XMLConfigBuilder#mapperElement
org.apache.ibatis.session.Configuration#addMapper
org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#parse
org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#loadXmlResource(核心逻辑)
org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#parseStatement(核心逻辑)
4.xml文件解析:org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#loadXmlResource
1.XMLMapperBuilder#parse
2.XMLMapperBuilder#configurationElement(高层mybatis标签解析--namespace、parameterMap、resultMap、sql、select|insert|update|delete等)
3.XMLMapperBuilder#buildStatementFromContext(List<XNode> list)
4.buildStatementFromContext-->parseStatementNode(标签一一解析)
1.XMLIncludeTransformer#applyIncludes(解析include标签)
2.XMLStatementBuilder#processSelectKeyNodes(解析selectKey)
3.动态标签解析:
XMLLanguageDriver#createSqlSource()-->XMLScriptBuilder.parseScriptNode()-->parseDynamicTags-->nodeHandlers-->handler.handleNode()
使用的部分技术
localCache缓存
- 启用:输入配置的useCache选项
- 刷新:flushCacheRequired配置,即输入配置的flushCache选项
- 执行查询时,先看缓存中是否存在,存在则直接取用(BaseExecutor#handleLocallyCachedOutputParameters),否则再去查数据库(BaseExecutor#queryFromDatabase),从数据库取出后,同时写入缓存
//在递归查询时使用缓存提升性能,递归的第一次刷新缓存,之后不再刷新
if (queryStack == 0 && ms.isFlushCacheRequired()) {
clearLocalCache();
}