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节点的各个属性
根据sql节点的名称获取SqlCommandType(INSERT, UPDATE, DELETE, SELECT)
解析。。。。节点
通过builderAssistant实例化MappedStatement,并注册至configuration对象
注册mapper接口
获取命名空间
通过命名空间获取mapper接口的class对象
将mapper接口添加到mapper注册中心
实例化Mapper接口的代理工程类,并将信息添加至knownMappers
Configuration属性
loadedResources加载过的mapper.xml文件:Set<String>
sqlFragments mapper文件中的sql元素key为namespace+id,Map<String, XNode>
keyGenerators 为insert或update配置的keyGenerator节点,key为namepace+id Map<String, KeyGenerator>
resultMaps文件中配置的所有的ResultMap的节点,key为namespace+id Map<String, ResultMap>
parameterMaps key为namespace+id Map<String, ParameterMap>
caches 文件中配置的二级缓存节点 key为namespace+id Map<String, Cache>
mappedStatements mapper文件中的增删改查注册中心 Map<String, MappedStatement>
mapperRegistry mapper接口的代理中心
config 全局配置
Map<Class<?>, MapperProxyFactory<?>> knownMappers mapper接口与MapperProxyFactory的关系
MapperProxyFactory
mapperInterface mapper接口的Class对象
Map<Method, MapperMethod> methodCache
内有两个核心方法,有个类MappedProxy
里面核心方法
第二阶段
获取sqlsession
从数据源获取数据库连接
获取mybatis配置文件中的environment对象
从environment获取transactionFactory对象
创建事务对象
根据配置创建executor
创建DefaultSqlSession
获取mapper
根据mapper接口获取接口对应的动态代理实现
从knownMappers里找到接口类的MapperProxyFactory对象,调用它的newInstance方法,创建代理对象
第三阶段
调用mapper的具体方法,并返回结果
会调用MapperProxy的增强目标方法
先查询缓存中是否有MapperMethod,若没有创建并返回
SqlCommond
MethodSignature
mapperMethod.execute(sqlSession, args)调用excute方法执行sql
根据sql语句类型以及接口返回的参数选择调用不同的方法
通过参数解析器解析参数,并将入参转化为map
result = sqlSession.selectOne(command.getName(), param)
交给子集DefaultSession类处理,从configuration中获取要执行的sql语句的配置信息
通过executor执行语句,并返回指定的结果集
BoundSql boundSql = ms.getBoundSql(parameter)获取sql语句信息包含?、参数等信息
拼接缓存的key值
query(ms, parameter, rowBounds, resultHandler, key, boundSql)
针对调用存储过程的结果处理
缓存未命中,从数据库加载数据
真正从数据库获取数据的方法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
Object rowValue = createResultObject(rsw, resultMap, lazyLoader, null)
final MetaObject metaObject = configuration.newMetaObject(rowValue)
foundValues = applyPropertyMappings(rsw, resultMap, metaObject, lazyLoader, null) || foundValues
获得属性值
获得属性名称
metaObject.setValue(property, value)
将暂存在resultHandler中的映射结果,填充到multipleResults
收藏
0 条评论
下一页
为你推荐
查看更多