mybatis源码解析
总结: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中的存储位置