mybatis执行流程
2024-11-14 01:21:10 0 举报
mybatis主体流程
作者其他创作
大纲/内容
Plugin.invoke
SqlSessionFactoryBuilder().build(resourceAsStream);
如果是代理类的handler可以进行拦截则可以进行sql日志打印
InterceptorChain.pluginAll(statementHandler);
1.根据inputStream解析成了document对象2.创建全局配置对象Configuration对象
target=CachingExecutor
返回结果
buildStatementFromContext(context.evalNodes(\"select|insert|update|delete\"));
mapperElement(root.evalNode(\"mappers\"));
propertiesElement(root.evalNode(\"properties\"));
configuration.addMapper(mapperInterface);
结果集处理器
1.初始化了动态SQL标签处理器2.解析动态SQL:(1)将带有${}号的SQL信息封装到TextSqlNode 。(2)将带有#{}号的SQL信息封装到StaticTextSqlNode将动态SQL标签中的SQL信息分别封装到不同的SqlNode中
new一个StatementHandler实例
parseConfiguration(parser.evalNode(\"/configuration\"));
Y
解析<sql>子标签,也就是SQL片段
创建执行器对象
1.从configuration对象中获取environment对象2.获得事务工厂对象并构建事务对象
loadXmlResource();
解析</settings>标签
获取代理后(增加日志功能)的Connection对象
解析</mappers>标签 加载映射文件流程主入口
如果目标对象有实现被拦截的接口,生成代理对象并返回,没有直接返回原对象。
解析</properties>标签
cacheRefElement(context.evalNode(\"cache-ref\"));
ps.execute();
委托给BaseExecutor执行
handler.parameterize(stmt);
将mapper接口以及它的代理对象存储到一个Map集合中,key为mapper接口类型,value为代理对象工厂
statementParser.parseStatementNode();
结果集处理
wrap 将目标对象,基于JDK动态代理生成代理对象
interceptorChain.pluginAll(executor);
判断mapper中的方法类型:INSERT、UPDATE、DELETE、SELECT
拦截器插件
N
是否解析过该mapper接口
获取数据源对象和工厂对象
将指定mapper接口以及它的代理对象存储到一个Map集合中
重点!!!!
sqlElement(context.evalNodes(\"/mapper/sql\"));
。。。。。。。
二级缓存是否有
getConnection(statementLog);
是否解析过mapper映射文件
interceptor.plugin(target);
configurationElement(parser.evalNode(\"/mapper\"));
(1)创建事务对象 (2)创建了执行器对象cachingExecutor (3)创建了DefaultSqlSession对象
循环遍历
代理对象调用方法
插件机制:对核心对象进行拦截创建StatementHandler代理对象
ms.getBoundSql(parameterObject);
environmentsElement(root.evalNode(\"environments\"));
创建Statement对象(可能是一个SimpleStatement
sqlSession.getMapper(UserMapper.class)
JDK动态代理生成代理对象
执行真正的数据库操作调用
是否是package标签
执行代理逻辑
获取绑定的SQL语句
build(parser.parse());
解析mapper的子标签resource、url、class等属性
解析<cache-ref>子标签
StatementHandler
PageHelp分页拦截
settingsAsProperties(root.evalNode(\"settings\"));
mapperProxy.findUserById(1);
构建拦截器
MyPlugin.intercept
没有缓存结果,则从数据库查询结果
通过构建者助手,创建MappedStatement对象
sqlSessionFactory.openSession();
解析<select>\\<insert>\\<update>\\<delete>子标签
parser.parse();
一级缓存是否有
1.从Map集合中获取Mapper代理对象工厂2.通过MapperProxyFactory生产MapperProxy3.通过MapperProxy产生Mapper代理对象
xmlParser.parse();
使用XPATH解析XML配置文件,将配置文件封装到Configuration对象
。。。。。。
创建SqlSource,解析SQL,封装SQL语句(未参数绑定)和入参信息
1.获取结果映射类 2. 别名处理,获取返回值对应的Java类型 3.获取ResultMap
参数化处理
resultSetHandler.handleResultSets(ps);
做分页拦截补充组装需要拦截的sql语句
判断为select
解析</environments>标签
0 条评论
下一页