当前位置:首页 > database > mybatis > 正文内容

mybatis源码解析

淙嶙7年前 (2018-08-24)mybatis1139
总结:1.存放流程 注解中取sql放入sqlSource,sqlSource放入MappedStatement,MappedStatement放入configuration[SqlSessionFactory中的属性]。创建sqlSession时,configuration赋予sqlSession。
      2.获取流程 从sqlSession的configuration取出MappedStatement,MappedStatement取出sqlSource,最后从sqlSource获取sql。
#创建SqlSessionFactory
>org.apache.ibatis.session.SqlSessionFactoryBuilder#build(java.io.InputStream)
  >org.apache.ibatis.session.SqlSessionFactoryBuilder#build(java.io.InputStream, java.lang.String, java.util.Properties)
    >org.apache.ibatis.builder.xml.XMLConfigBuilder#parse
      >org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration
        >org.apache.ibatis.builder.xml.XMLConfigBuilder#mapperElement
          >org.apache.ibatis.session.Configuration#addMapper
            >org.apache.ibatis.binding.MapperRegistry#addMapper
              >org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#parse
                >org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#parseStatement
                  >org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#getSqlSourceFromAnnotations
                    >java.lang.reflect.Method#getAnnotation  #获取注解中的sql
                    >org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#buildSqlSourceFromStrings
                      >org.apache.ibatis.scripting.xmltags.XMLLanguageDriver#createSqlSource(org.apache.ibatis.session.Configuration, java.lang.String, java.lang.Class<?>)
                        >org.apache.ibatis.scripting.defaults.RawSqlSource#RawSqlSource(org.apache.ibatis.session.Configuration, java.lang.String, java.lang.Class<?>)
                          >org.apache.ibatis.builder.SqlSourceBuilder#parse #sqlSource = sqlSourceParser.parse(sql, clazz, new HashMap<String, Object>());#将sql存入sqlSource
                   #sqlSource的存储       
                  >org.apache.ibatis.builder.MapperBuilderAssistant#addMappedStatement(...)
                    >org.apache.ibatis.session.Configuration#addMappedStatement #sqlSource 放入MappedStatement,MappedStatement放入configuration。


    >org.apache.ibatis.session.SqlSessionFactoryBuilder#build(org.apache.ibatis.session.Configuration)
        >org.apache.ibatis.session.defaults.DefaultSqlSessionFactory
#创建session
>org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSession()
  >org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSessionFromDataSource
    >org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#getTransactionFactoryFromEnvironment
    >org.apache.ibatis.transaction.TransactionFactory#newTransaction(javax.sql.DataSource, org.apache.ibatis.session.TransactionIsolationLevel, boolean)
    >org.apache.ibatis.session.Configuration#newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)
    >org.apache.ibatis.session.defaults.DefaultSqlSession  #configuration 放入 sqlSession

#创建Mapper
>org.apache.ibatis.session.defaults.DefaultSqlSession#getMapper
  >org.apache.ibatis.session.Configuration#getMapper
    >org.apache.ibatis.binding.MapperRegistry#getMapper
      >org.apache.ibatis.binding.MapperProxyFactory#newInstance(org.apache.ibatis.session.SqlSession)
        >org.apache.ibatis.binding.MapperProxyFactory#newInstance(org.apache.ibatis.binding.MapperProxy<T>)#Mapper代理工厂
          >java.lang.reflect.Proxy#newProxyInstance #生成一个代理对象
#执行查询
>org.apache.ibatis.binding.MapperProxy#invoke
  >org.apache.ibatis.binding.MapperProxy#cachedMapperMethod //放入缓存
  >org.apache.ibatis.binding.MapperMethod#execute
    >org.apache.ibatis.binding.MapperMethod.MethodSignature#convertArgsToSqlCommandParam
    >org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object)
      >org.apache.ibatis.session.defaults.DefaultSqlSession#selectList(java.lang.String, java.lang.Object)
        >org.apache.ibatis.session.defaults.DefaultSqlSession#selectList(java.lang.String, java.lang.Object)
          >org.apache.ibatis.session.defaults.DefaultSqlSession#selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)
            >org.apache.ibatis.session.Configuration#getMappedStatement(java.lang.String)
              >org.apache.ibatis.executor.Executor#query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler)
                >org.apache.ibatis.mapping.MappedStatement#getBoundSql
                  >org.apache.ibatis.mapping.SqlSource#getBoundSql #从sqlSource中取出sql
                >org.apache.ibatis.executor.CachingExecutor#query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)
                  >org.apache.ibatis.executor.BaseExecutor#query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)
                    >org.apache.ibatis.executor.BaseExecutor#queryFromDatabase
                      >org.apache.ibatis.executor.SimpleExecutor#doQuery #使用SimpleExecutor
                        >org.apache.ibatis.executor.statement.RoutingStatementHandler#query
                          >org.apache.ibatis.executor.statement.PreparedStatementHandler#query #执行execute
                            >org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleResultSets #结果集

sql信息再configuration中的存储位置

相关文章

mybatis中${} 和#{} 区别

mybatis中${} 和#{} 区别

{} : 占位符${} : 拼接符 区别 {}: 为参数占位,为预编译中的 “?”;${}: 为字符串拼接串,在(预)编译时直接替换成实际的变量 在执行sql的过程中,#{}是在动态解...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。