Mybatis源码分析
2024-03-22 18:29:48 0 举报
mybatis源码流程详细分析,从加载mybatis源码配置,到加载mapper.xml中sql语句,到sqlSession创建,到执行具体的sql语句,包含全流程
作者其他创作
大纲/内容
负责解析mybatis配置文件,返回Configuration对象
build
加载xml中的信息,并创建代理对象
mapperRegisty
解析sql语句
parse
prepare
XMLStatementBuilder
seqNo: 1.2.2.8.2.1.5.1 构建XMLStatementBuilderMapperBuilderAssistant builderAssistantXNode context 当前要解析的SQL语句节点
parseStatementNode() 解析SQL语句节点
解析配置文件中的<typeHandler>节点,加载自定义的typeHandler
org.apache.ibatis.session.Configuration#newResultSetHandler
CachingExecutor
Executor delegateTransactionalCacheManager tcm
List<E> query
MapperBuilderAssistant
String currentNamespace 当前mapper的空间名称String resource mapper文件路径Cache currentCache 当前mapper的cache配置
setCurrentNamespace(String currentNamespace)MappedStatement addMappedStatement
1. 初始化XpathParser2. 使用documentBuilder基于InputSource创建document对象
execute
1. 解析并加载mybatis资源配置文件2. 创建SqlSessionFactory
typeAliases
BaseExecutor
Transaction transactionExecutor wrapperConfiguration configuration
List<E> queryFromDatabaseConnection getConnection
org.apache.ibatis.plugin.InterceptorChain#pluginAll
addMapper
BaseBuilder
seqNo: 1.1.2 初始化ConfigurationConfiguration configurationTypeAliasRegistry typeAliasRegistryTypeHandlerRegistry typeHandlerRegistry
resolveClass(String alias) 解析Class
MapperAnnotationBuilder
SimpleExecutor
List<E> doQuery
prepareStatement
解析配置文件中的<environments>节点,加载transactionFactory和dataSource
使用Configuration保存所有解析到的属性和配置
parseConfiguration
创建statement
doQuery
XmlStatementBuilder
加载mybatis-config.xml配置文件
XMLConfigBuilder
Configuration
typeHandlerElement
java.lang.reflect.Proxy#newProxyInstance
XMLMapperBuilder
1.2.2.8.2 parse() 解析具体的mapper文件1.2.2.8.2.1 configurationElement(XNode context) 解析具体的mapper文件的mapper节点1.2.2.8.2.1.1 cacheRefElement(XNode context) 解析cache-ref节点1.2.2.8.2.1.2 cacheElement(XNode context) 解析cache节点1.2.2.8.2.1.3 resultMapElements(List<XNode> list) 解析resultMap节点1.2.2.8.2.1.4 sqlElement(List<XNode> list) 解析mapper中sql节点1.2.2.8.2.1.5 buildStatementFromContext(List<XNode> list) 解析select|insert|update|delete等节点1.2.2.8.2.2 bindMapperForNamespace
org.apache.ibatis.plugin.InterceptorChain#addInterceptor
org.apache.ibatis.plugin.Interceptor#plugin
DefaultResultSetHandler
List<Object> handleResultSets
XmlMapperBuilder
mapperElement
seqNo: 1.1 构建XMLConfigBuilderXPathParser parser
1.2 Configuration parse()1.2.2 parseConfiguration(XNode root) 解析mybatis-config.xml的Configuration节点1.2.2.1 propertiesElement(XNode context) 解析properties节点1.2.2.2 settingsAsProperties(XNode context) 解析settings节点1.2.2.3 loadCustomVfs(Properties props) 解析VFS1.2.2.4 typeAliasesElement(XNode parent) 解析typeAliases节点1.2.2.5 settingsElement(Properties props) 设置Configuration的一些默认配置1.2.2.6 environmentsElement(XNode context) 解析environments环境变量1.2.2.7 typeHandlerElement(XNode parent) 解析类型处理器节点1.2.2.8 mapperElement(XNode parent) 解析mapper节点
SqlSessionFactory
seqNo: 2 构建SqlSession
SqlSession openSession() 开启会话
封装了要执行的方法的sql语句,参数和返回值类型等信息
getConnection
创建XMLStatementBuilder解析具体的SQL语句节点
创建新的执行器
2.1.2
PreparedStatementHandler
Executor executorMappedStatement mappedStatementRowBounds rowBoundsBoundSql boundSqlResultSetHandler resultSetHandler
resolveMappedStatement
创建JdbcTransaction
2.1.1
XMLLanguageDriver
seqNo: 1.2.2.8.2.1.5.1.1
SqlSource createSqlSource 解析SQL语句
扫描所有的接口文件,并遍历获取接口信息
org.apache.ibatis.session.Configuration#newParameterHandler
创建XmlConfigBuilder的过程中初始化Conffiguration
开启会话
解析配置mappper.xml等sql配置文件,缓存接口和sql的对应关系
org.apache.ibatis.plugin.Plugin#wrap
执行具体mapper接口流程
Executor newExecutor 创建执行器StatementHandler newStatementHandler 创建SQL语句执行处理器
SqlSessionFactoryBuilder
seqNo: 1 构建SqlSessionFactoryBuilder
build(InputStream inputStream)
传入package name,进行扫描或dao接口文件
解析配置文件中的<configuration>节点
openSessionFromDataSource
org.apache.ibatis.session.Configuration#newStatementHandler
创建并初始化Configuration
parseStatementNode
创建连接
被装饰的目标对象执行方法时,都会执行Plugin的invoke方法,并被当前Plugin中的interceptor进行拦截
MappedStatement
seqNo: 1.2.2.8.2.1.5.1.1.1 SqlSource sqlSource sql语句SqlCommandType sqlCommandType sql语句类型
org.apache.ibatis.plugin.Plugin#invoke
cachingExecutor
org.apache.ibatis.session.Configuration#addInterceptor
XpathParser
queryFromDatabase
解析mybatis配置文件的时候,将配置的interceptor添加到interceptorChain的拦截器链中
DefaultSqlSessionFactory
MapperProxy
baseExecutor
seqNo: 2.1Configuration configuration 全局配置对象
SqlSession openSessionFromDataSource
拦截并执行被调用的接口方法
获取被解析的sql语句
query
settingsProperties
org.apache.ibatis.session.Configuration#newExecutor
XMLScriptBuilder
SqlSource parseScriptNode()MixedSqlNode parseDynamicTags(XNode node)
获取xml文件路径
创建XPathParser获取指定的XNode
environmentsElement
MixedSqlNode
seqNo: 1.2.2.8.2.1.5.1.1.1 List<SqlNode> contents
boolean apply(DynamicContext context)
解析配置文件并保存到Configuration中
SqlSourceBuilder
seqNo: 1.2.2.8.2.1.5.1.1.1 构建SqlSourceBuilder
SqlSource parse
openSession
RawSqlSource
seqNo: 1.2.2.8.2.1.5.1.1.1 SqlSource
String getSql
DefaultSqlSession
Configuration configurationExecutor executorboolean autoCommit 是否自动提交boolean dirty
T selectOne(String statement)
invoke
创建XMLMapperBuilder解析mapper节点
JdbcTransactionFactory
seqNo: 2.1.1
Transaction newTransaction
解析配置文件中的<typeAliases>节点,加载类别名信息
DynamicContext
seqNo: 1.2.2.8.2.1.5.1.1.1 StringJoiner sqlBuilder = new StringJoiner(\" \")
遍历interceptorChain中的所有interceptor,基于当前interceptor创建Plugin并创建代理对象对目标对象进行装饰
XPathParser
seqNo: 1.1.1 构建XPathParserXPath xpathProperties variables;Document document
1.2.1 evalNode(String expression)
JdbcTransaction
Connection connection 数据库连接DataSource dataSource 数据源TransactionIsolationLevel level 事务隔离级别boolean autoCommit 是否自动提交
Connection getConnection() 获取数据连接
mybatis添加拦截器并执行拦截流程
解析mapper节点
使用languageDriver创建sqlSrouce
MapperMethod
org.apache.ibatis.builder.xml.XMLConfigBuilder#pluginElement
StaticSqlSource
seqNo: 1.2.2.8.2.1.5.1.1.1 String sql 解析出来的SQL语句List<ParameterMapping> parameterMappings 参数映射集合
解析配置文件中的<settings>节点,加载mybatis的配置信息
propertiesElement
0 条评论
下一页