mybatis源码分析
2020-04-23 16:17:42 105 举报
AI智能生成
登录查看完整内容
mybatis源码分析
作者其他创作
大纲/内容
mybatis源码分析
获取SqlSessionFactory对象
new SqlSessionFactoryBuilder()
this.configuration = configuration;
this.typeAliasRegistry = this.configuration.getTypeAliasRegistry();
this.typeHandlerRegistry = this.configuration.getTypeHandlerRegistry();
this.environment = environment;
parser.parse()解析全局配置文件
parseConfiguration
propertiesElement解析<properties>元素
Properties defaults = context.getChildrenAsProperties();添加子元素内容至defaults
defaults =Resources.getResourceAsProperties(resource)读取外部properties文件内容至defaults
parser.setVariables(defaults);XPathParser添加变量信息
configuration.setVariables(defaults)
settingsAsProperties解析<settings>元素mybatis全局设置
Properties props = context.getChildrenAsProperties();获取子元素内容
metaConfig.hasSetter(String.valueOf(key)校验子元素是否合法
typeAliasesElement解析<typeAliases>元素类型别名
pluginElement解析<plugIns>元素插件
获取拦截器child.getStringAttribute(\"interceptor\");
获取属性child.getChildrenAsProperties()
创建拦截器实例Interceptor interceptorInstance = (Interceptor) resolveClass(interceptor).getDeclaredConstructor().newInstance();\u00A0
添加拦截器至configuration全局变量中 configuration.addInterceptor(interceptorInstance)
objectFactoryElement解析<objectFactory>元素
objectWrapperFactoryElement解析<objectWrapperFactory>元素
reflectorFactoryElement解析<reflectorFactory>元素
settingsElement将<settings>元素内容填充至configuration对象中
将<settings>元素配置的全局属性添加至configuration中
configuration.setCacheEnabled(booleanValueOf(props.getProperty(\"cacheEnabled\
configuration.setMapUnderscoreToCamelCase(booleanValueOf(props.getProperty(\"mapUnderscoreToCamelCase\
....
databaseIdProviderElement解析<databaseIdProvider>元素数据库厂商标识
typeHandlerElement解析<typeHandlers>元素
mapperElement解析<mappers>元素
package
configuration.addMappers(mapperPackage)
MapperRegistry->addMappers(packageName);
addMapper(mapperClass);
MapperAnnotationBuilder->parse()解析Mapper接口中定义的注解
MapperAnnotationBuilder->loadXmlResource();加载xml映射文件
InputStream inputStream = type.getResourceAsStream(\"/\" + xmlResource);
MapperAnnotationBuilder->parseStatement(method);
MapperBuilderAssistant->addMappedStatement
mapper
resourceurl
Resources.getResourceAsStream(resource)加载资源文件为流
XMLMapperBuilder->parse()解析<mapper>元素
configurationElement
namespace
cacheRefElement解析cache-ref属性
cacheElement解析cache属性
parameterMapElement/mapper/parameterMap
builderAssistant.addParameterMap
resultMapElements/mapper/resultMap
sqlElement/mapper/sql
buildStatementFromContextselect|insert|update|delete
XMLStatementBuilder->parseStatementNode();
解析xml元素
MappedStatement statement = statementBuilder.build();
configuration.addMappedStatement(statement);
bindMapperForNamespace
builderAssistant.getCurrentNamespace()
configuration.addLoadedResource(\"namespace:\" + namespace);
configuration.addMapper(boundType);
parsePendingResultMaps
parsePendingCacheRefs
parsePendingStatements
class
Resources.classForName(mapperClass);
获取SqlSession对象
DefaultSqlSessionFactory->openSession()
DefaultSqlSessionFactory->openSessionFromDataSource
configuration.getEnvironment()获取环境变量
tx = transactionFactory.newTransaction();创建事务
BatchExecutor执行器不仅重用语句还会执行批量更新
ReuseExecutor执行器会重用预处理语句(PreparedStatement)
SimpleExecutor普通的执行器
CachingExecutorsetting中开启二级缓存(cacheEnabled=true)
获取接口代理对象 MapperProxy
DefaultSqlSession->getMapper(Class<T> type)
Configuration->getMapper
MapperRegistry->getMapper
(MapperProxyFactory<T>) knownMappers.get(type)
mapperProxyFactory.newInstance(sqlSession)
执行增删改查方法
MapperProxy->invoke()进入代理对象invoke方法
Object上定义的方法直接执行
MapperMethod->execute
command.getType()INSERT|UPDATE|DELETE|SELECT
executeForMany
method.convertArgsToSqlCommandParam
paramNameResolver.getNamedParams(args)
DefaultSqlSession->configuration.getMappedStatement(statement)
wrapCollection()参数统一封装为map
executor.query执行器查询
MappedStatement->ms.getBoundSql(parameterObject)
query
先查询缓存
delegate.query
BaseExecutor->queryFromDatabase
doQuery
ms.getConfiguration();
StatementHandler handler = configuration.newStatementHandler();
StatementHandler statementHandler = new RoutingStatementHandler
STATEMENT:SimpleStatementHandler
PREPARED:PreparedStatementHandler
CALLABLE:CallableStatementHandler
BaseStatementHandler->
this.parameterHandler = configuration.newParameterHandler创建参数处理器
(ParameterHandler) interceptorChain.pluginAll(parameterHandler);
this.resultSetHandler = configuration.newResultSetHandler创建结果处理器
resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);
(StatementHandler) interceptorChain.pluginAll(statementHandler);
Connection connection = getConnection(statementLog);
JdbcTransaction->transaction.getConnection();获取数据库连接
dataSource.getConnection()从连接池获取connection
connection.setAutoCommit(desiredAutoCommit);设置事务
BaseStatementHandler->prepare
instantiateStatement
PreparedStatementHandler->String sql = boundSql.getSql()connection.prepareStatement(sql)
setStatementTimeout
setFetchSize
return statement
handler.parameterize(stmt);
RoutingStatementHandler->delegate.parameterize(statement);
PreparedStatementHandler->parameterHandler.setParameters((PreparedStatement) statement);
PreparedStatementHandler->PreparedStatement ps = (PreparedStatement) statement; ps.execute();
resultSetHandler.handleResultSets(ps); 处理参数
0 条评论
回复 删除
下一页