mybatis-3.5.2源码分析
2020-04-30 14:39:15 63 举报
mybatis-3.5.2源码分析
作者其他创作
大纲/内容
调用Plugin.wrap决定是否生产代理Plugin实现了InvocationHandler
StatementHandler
ParameterHandler
Statement
详细流程
handleResultSets
DynamicSqlSource
MapperProxy
sqlSession.selectList()获取mapperStatement
sql语句中是否包含#{}
InterceptorChain interceptorChain解析并实例化插件然后保存到InterceptorChain中
mappedStatement
SqlSession
N
ResultSetHandler
包装当前target并生成代理对象返回
MapperProxy.invoke()>MapperMethod.execute()>executeForMany()>DefaultSqlSession.selectList()>BaseExecutor.query()>SimpleExecutor.query()>query()>queryFromDatabase()>SimpleExecutor.doQuery()>configuration.newStatementHandler()
SqlSource
resultMap
总流程
Executor
Mybatis拦截器详细流程(StatementHandler为例)
knownMappers.get()从knownMappers中获取工厂类
parameterize
sql id全路径比如:com.crady.mapper.UserMapper.selectAll
StaticTextSqlNode
获取CachingExecutor所有接口并匹配是否在Map中
MappedStatement
mapperProxyFactory.newInstance()通过工厂类获取实例
三、执行过程
newInstance()根据创建的映射代理生产最终代理对象
MapperRegistry
rollback
keyGenerator
DefaultResultSetHandler.handleResultSets()处理结果利用反射创建结果集返回
//获取sql语句的方法public String getSql() { returnsqlBuilder.toString().trim();}
id(namespace+id)
Y
MixedSqlSource
query
是否有缓存?
Mybatis拦截器拦截点
执行自定义拦截器的plugin方法
DynamicContext
sqlSession.getMapper获取Mapper代理类
ifSqlNode
执行查询时调用Configuration.newStatementHandler
prepare
1:1
configuration.newStatementHandler()>newRoutingStatementHandler()>new PreparedStatementHandler()>super()>configuration.newParameterHandler()
MapperProxyFactory主要用来创建mapper接口的实际代理调用sql语句时实际调用的是这个代理对象
getBoundSql()获取sql语句#{}都已经解析成?
new MapperProxy()创建映射代理,该类实现了InvocationHandler最终执行sql都会执行invoke()
获取RoutingStatementHandler所有接口并匹配是否在Map中
update
HashSet<String> loadedResources注册xml文件,文件夹+文件名比如:sqlmapper/UserMapper.xml表示对应的xml已经解析并且存储接口注册信息,以namespace+接口全限定名比如:namespace:com.crady.mapper.UserMapper
DefaultSqlSessionFactory.openSessionFromDataSource()>configuration.newExecutor()
MapperProxyFactory
分页起点offset
完整例子:-1524961915:4209224624:com.crady.mapper.UserMapper.selectAll:0:2147483647:select
sqlSource
PreparedStatementHandler.query()
id(namespace+\".\"+id)
userMapper.selectAll()
String text
TrimSqlNode
mapperProxy.invoke()获取mapperMethod
whereSqlNode
Mybatis拦截器作用点
获取DefaultResultSetHandler所有接口并匹配是否在Map中
setParameters
forEachSqlNode
handleOutputParameters
MixedSqlNode
DefaultSqlSession.getMapper()使用默认的sqlSession获取实例
RawSqlSource
configuration.getMapper()
MapperMethod
mapperMethod.execute()
TextSqlNode
commit
获取DefaultParameterHandler所有接口并匹配是否在Map中
SimpleExecutor.doquery()调用模版方法查询数据,根据configuration获取statementHandler
通过SqlSessionFactory配置文件解析
。。。
Configuration
一、配置解析
String sql=\"\"
获取mapper代理对象
List<SqlNode> context
1:N
parameterMap
缓存key(以:分割)CacheKey
checksum
二、创建代理
PreparedStatement.execute()执行查下获取结果
调用interceptorChain.pluginAll获取Executor代理
BaseExecutor.queryFromDatabase()从数据库查下数据,如果查询到则放到本地缓存中
hashcode
MapperRegistry mapperRegistry
分页获取的记录数limit
configuration.newStatementHandler()>newRoutingStatementHandler()>new PreparedStatementHandler()>super()>configuration.newResultSetHandler()
一级缓存key
系统运行环境比如:development
BaseExecutor.query()根据mapperStatement获取绑定sql
查询一级缓存,默认一级缓存开启,在BaseExecutor.localCache中查询是否存在缓存
getBoundSql()获取sql语句#{}都已经解析成?${}都需要替换成实际参数
查询参数
mapperRegistry.getMapper()
StringBuilder value
getParameterObject
StringJoiner sqlBuilder
解析<plugins>节点生成InterceptorChain对象并保存在Configuration中
0 条评论
下一页