mybatis--sqlSession脉络

源码: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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值