mybatis三个阶段
2020-03-17 11:14:44 0 举报
AI智能生成
登录查看完整内容
mybatis三个阶段
作者其他创作
大纲/内容
第一阶段
解析配置文件,完成SqlSessionFactory的创建
创建XmlConfigeBuilder,解析配置文件的configuration节点
propertiesElement(root.evalNode(\"properties\"))
Properties settings = settingsAsProperties(root.evalNode(\"settings\"))
typeAliasesElement(root.evalNode(\"typeAliases\"))解析类的别名
pluginElement(root.evalNode(\"plugins\"))解析插件
objectFactoryElement(root.evalNode(\"objectFactory\"))
objectWrapperFactoryElement(root.evalNode(\"objectWrapperFactory\"))
reflectorFactoryElement(root.evalNode(\"reflectorFactory\"))
environmentsElement(root.evalNode(\"environments\"))
databaseIdProviderElement(root.evalNode(\"databaseIdProvider\"))
typeHandlerElement(root.evalNode(\"typeHandlers\"))
解析mappers节点下的mapper.xml文件
先查找子节点是否包含package子节点,如果没有会走else下面的方法
获取<mapper>节点的resource、url或mClass属性互斥判断,实例化XMLMapperBuilder解析mapper映射文件
解析mapper节点
获取mapper节点的namespace属性
解析cache节点(重要)
获取cache节点的type属性,默认为PERPETUAL,根据结果去获取Cache接口实现
读取eviction属性,既缓存的淘汰策略,默认LRU,根据结果获取装饰器
读取flushInterval属性,既缓存的刷新周期
读取size属性,既缓存的容量大小
读取readOnly属性,既缓存的是否只读
读取blocking属性,既缓存的是否阻塞
通过builderAssistant创建缓存对象,并添加至configuration
解析resultMap节点(重要)
获取id、type、extends、autoMapping、
从别名注册中心获取entity的class对象
记录子节点中的映射结果集合,List<ResultMapping> resultMappings,利用建造者模式创建的ResultMapping加入到resultMappings中
解析sql节点
解析解析select、insert、update、delete节点
创建XmlStatementBuilder对象,解析sql语句节点
获取sql节点id
获取sql节点的各个属性
解析。。。。节点
通过builderAssistant实例化MappedStatement,并注册至configuration对象
注册mapper接口
获取命名空间
通过命名空间获取mapper接口的class对象
将mapper接口添加到mapper注册中心
实例化Mapper接口的代理工程类,并将信息添加至knownMappers
Configuration属性
loadedResources加载过的mapper.xml文件:Set<String>
mapperRegistry mapper接口的代理中心
config 全局配置
MapperProxyFactory
mapperInterface mapper接口的Class对象
内有两个核心方法,有个类MappedProxy
里面核心方法
第二阶段
获取sqlsession
从数据源获取数据库连接
获取mybatis配置文件中的environment对象
从environment获取transactionFactory对象
创建事务对象
根据配置创建executor
创建DefaultSqlSession
获取mapper
根据mapper接口获取接口对应的动态代理实现
从knownMappers里找到接口类的MapperProxyFactory对象,调用它的newInstance方法,创建代理对象
第三阶段
调用mapper的具体方法,并返回结果
会调用MapperProxy的增强目标方法
先查询缓存中是否有MapperMethod,若没有创建并返回
SqlCommond
MethodSignature
根据sql语句类型以及接口返回的参数选择调用不同的方法
通过参数解析器解析参数,并将入参转化为map
交给子集DefaultSession类处理,从configuration中获取要执行的sql语句的配置信息
通过executor执行语句,并返回指定的结果集
BoundSql boundSql = ms.getBoundSql(parameter)获取sql语句信息包含?、参数等信息
拼接缓存的key值
针对调用存储过程的结果处理
缓存未命中,从数据库加载数据
真正从数据库获取数据的方法queryFromDatabase,方法里的doQuery方法是去查询的
创建StatementHandler对象
创建RoutingStatementHandler对象,根据由statmentType来指定真实的StatementHandler
(StatementHandler) interceptorChain.pluginAll(statementHandler);//加入插件
创建Statement对象
获取connection对象的动态代理,添加日志能力;
通过不同的StatementHandler,利用connection创建(prepare)Statement
使用parameterHandler处理占位符
从boundSql中获取sql语句的占位符对应的参数信息
遍历这个参数列表,把参数设置到PreparedStatement中
为statment中的占位符绑定参数
通过statementHandler对象调用ResultSetHandler将结果集转化为指定对象返回
ps.execute()
public List<Object> handleResultSets(Statement stmt)
用于保存结果集对象List<Object> multipleResults = new ArrayList<>()
statment可能返回多个结果集对象,这里先取出第一个结果集
获取结果集对应resultMap,本质就是获取字段与java属性的映射规则
获取当前结果集对应的resultMap
根据映射规则(resultMap)对结果集进行转化,转换成目标对象以后放入multipleResults中
对ResultSet进行映射,映射结果暂存在resultHandler中
简单映射处理handleRowValuesForSimpleResultMap
读取resultSet中的一行记录并进行映射,转化并返回目标对象getRowValue
final MetaObject metaObject = configuration.newMetaObject(rowValue)
获得属性值
获得属性名称
将暂存在resultHandler中的映射结果,填充到multipleResults
![mybatis三个阶段](https://www.processon.com/chart_image/template/thumb/5e7040a4e4b0afae726c131b.png?tid=5e6cf190e4b09b0f79ea52a0)
收藏
0 条评论
回复 删除
下一页