MyBatis源码
2021-04-17 16:16:25 1 举报
MyBatis源码
作者其他创作
大纲/内容
创建mapper注解构造器
解析节点
xmlParser.parse()
可重复使用执行器
child.getStringAttribute(\"resource\")child.getStringAttribute(\"url\")child.getStringAttribute(\"class\")
objectFactoryElement(root.evalNode(\"objectFactory\"));objectWrapperFactoryElement(root.evalNode(\"objectWrapperFactory\"));reflectorFactoryElement(root.evalNode(\"reflectorFactory\"));
addMappers(mapperClass);
判断SQL语句类型
解析插件(比如分页插件)(设计模式: 责任链模式)
typeAliasesElement(root.evalNode(\"typeAliases\"))
从一级缓存中获取查询结果
child.getName()等于\"package\"
执行数据库连接查询
switch (ms.getStatementType())
查询集合
找到mapper对应的class文件
setDefaultImplementations()
加入二级缓存
settingsElement(settings);
根据mapper接口名获取 xml文件并解析
parser.parse()
最终均通过configuration.add()添加到configuration中
解析数据库厂商
case STATEMENT简单SQL语句
替换占位符为\"?\"
resultMapElements(context.evalNodes(\"/mapper/resultMap\"))
解析crud节点后创建mapperStatment对象
创建StatementHandler
propertiesElement(root.evalNode(\"properties\"))
ms.getConfiguration()
loadCustomVfs(settings)
for循环
sqlSource.getBoundSql(parameterObject)
child.getStringAttribute(\"name\")
sqlFragments
builderAssistant保存当前namespace
dataSourceElement(child.evalNode(\"dataSource\"))
将cache装饰到Serialized缓存序列化和反序列化存储
配置文件信息解析成Configuration
case CALLABLE存储过程语句
builderAssistant
(ParameterHandler) interceptorChain.pluginAll(parameterHandler);
组装动态Sql
处理结果集
把插件加载到InterceptorChain责任链中
解析select | insert |update |delete节点
configuration.getEnvironment()
parameterMapElement(context.evalNodes(\"/mapper/parameterMap\"))
设置settings 和默认值
解析paramterMap节点
(List<E>) localCache.getObject(key)
二级缓存的实现原理? 通过责任链模式进行层层叠加,并且在每一层用装饰器模式实现不同的逻辑。
setStandardDecorators(cache)
configurationElement(parser.evalNode(\"/mapper\"))
执行chain内的自定义插件
interceptor.plugin(target)
获得连接
addMapper(mapperClass)
所用日志的具体实现(未指定时将自动查找)
session.close()
创建DefaultResultSetHandler
configuration.getMappedStatement(statement)
mapperElement(root.evalNode(\"mappers\"));
typeAliases
interceptorChain.pluginAll(executor)
loadXmlResource()
handler.parameterize(stmt)
(LoggingCache)delegate.getObject(key)
把配置信息加载到Configuration中(设计模式: 构造者模式)
执行SQL语句
创建一个SQL执行器对象
设置二级缓存
创建缓存对象
简单的sql执行器对象
解析构造器
获得Key
sqlMapper.openSession()
build(parser.parse())
连接数据源
将LRUCache 装饰到Scheduled负责定时清空缓存
configuration.addLoadedResource(resource)
keyMap.get(key)
创建ResultSetHandler
new SqlSessionFactoryBuilder().build(reader)
Resources.getResourceAsReader(resource)
解析Mapper路径
解析别名节点
builderAssistant.setCurrentNamespace(namespace)
缓存节点加入到Configuration
设置默认的缓存实现类
new LoggingCache(cache)
调用所有的拦截器对象plugin方法
new SerializedCache(cache)
cacheElement(context.evalNode(\"cache\"))
获取JDBC事务工厂
创建typeAliases集合
(SynchronizedCache)delegate.getObject(key)
(PerpetualCache)delegate.getObject(key)
statementParser.parseStatementNode()
获取环境变量
(ResultSetHandler) interceptorChain.pluginAll(resultSetHandler)
创建一个xmlStatement的构建器对象
sqlElement(context.evalNodes(\"/mapper/sql\"))
resource
获得连接池
获取Configuration中的责任链
创建缓存Key
typeAliasRegistry
有需要时进行序列化
for (Class<?> mapperClass : mapperSet)
getConnection(statementLog)
获得Configuration对象
获得缓存
new ScheduledCache(cache)
解析cache节点
获得参数内容
把当前的简单的执行器包装成一个CachingExecutor
调用LoggingCache链
不为null
object == null ? null : deserialize((byte[]) object)
将cache装饰到Logging缓存命中日志
通过执行器去执行我们的sql对象
调用SynchronizedCache链
解析 properties节点
加载自定义的虚拟文件系统应用程序(VFS)
resultSetHandler.handleResultSets(ps)
关闭连接
for (XNode child : parent.getChildren())
判断executorType类型
cache.get(key)
通过Key查询缓存
解析resultMap节点
批量执行器
new SynchronizedCache(cache)
new CachingExecutor(executor)
parseConfiguration(parser.evalNode(\"/configuration\"))
ms.getBoundSql(parameterObject)
解析xml的
创建Handler
environmentsElement(root.evalNode(\"environments\"));
log.debug
二级缓存中获取数据(责任链模式)
创建自定义工厂
loadCustomLogImpl(settings)
pluginElement(root.evalNode(\"plugins\"))
缓存中是否获得值
打印日志
创建DefaultParameterHandler
创建ParameterHandler
Sql预处理
逐个节点执行SQL语句拼接
typeHandlerRegistry
session.selectOne()
结果集是否为null
databaseIdProviderElement(root.evalNode(\"databaseIdProvider\"))
configuration
settingsAsProperties(root.evalNode(\"settings\"))
ps.execute()
解析mybatis环境
transactionManagerElement(child.evalNode(\"transactionManager\"))
cacheRefElement(context.evalNode(\"cache-ref\"))
解析缓存引用
通过statement在全局配置类中获取MappedStatement
typeHandlerElement(root.evalNode(\"typeHandlers\"))
(SerializedCache)delegate.getObject(key)
child.getName()不等于\"package\"
为null从数据库中查询
parser
创建XMLConfigBuilder对象
逐个mapper解析
rootSqlNode.apply(context)
未获得值通过查询数据库去查询
解析mybatis-config.xml的节点
for (Interceptor interceptor : interceptors)
把Key预先存到一级缓存中占位
创建一个MapperProxyFactory 把Mapper接口保存到工厂类中
解析Sql节点
configuration.addMappers(mapperPackage);
调用LrcCache链
添加映射包到configuration
(StatementHandler) interceptorChain.pluginAll(statementHandler)
把Sql语句与参数集组装到SqlSource中
解析处理器节点
获得Statement对象
调用SerializedCache链
获得SqlSession后执行SQL语句以selectOne语句为例
case PREPARED复杂SQL语句
buildStatementFromContext(context.evalNodes(\"select|insert|update|delete\"))
把资源保存到我们Configuration
(LruCache)delegate.getObject(key)
parser.parse()
解析setting节点
获得事务工厂
创建缓存
0 条评论
下一页