Mybatis 3.5 原理分析(一)
2021-06-01 19:56:06 5 举报
Mybatis 3.5 原理分析
作者其他创作
大纲/内容
返回List
new XMLConfigBuilder()
SimpleExecutor
建造者模式解析配置文件获取配置文件对象
DefaultSqlSessionFactory
build(config)
newInstance(sqlSession)获取MapperProxy实例
拦截器3
处理结果集
代理工厂,生成代理对象
得到默认执行器SimpleExecutor
getMapper( )
关联映射
实现了InvocationHandler接口,用于增强目标对象
返回默认执行器
简单映射
MapperStatment
Configuration
获取代理对象时序图
executor.query(...):二级缓存开启
返回执行器Executor
返回 Configuration
得到默认会话工厂对象DefaultSqlSessionFactory
执行SQL时序图
返回MapperProxy实例
ResultMapping
其他模块
参数映射
DefaultResultSetHandler
全局配置对象
目标对象
核心层
返回 DefaultSqlSessionFactory
SQ执行
Mapper注册表
doQuery(...)
缓存存在返回,不存在继续向下执行
获取默认会话工厂对象
默认会话工厂
事务
new Configuration()
ps.execute()执行sql
BaseExecutor
ParameterMappeing
MapperProxy
1.调用parse()方法解析全局配置文件和所有mapper映射器文件2.获取到Configuration对象3.存储Mappedstatement对象信息到Map中,用于调用mapper方法时匹配4.解析命名空间,用MapperProxyFactory包装存储到Map中,用于获取代理对象
动态SQL
缓存
Executor
得到全局配置对象Configuration
数据库
MapperRegistry
反射
参数处理
DefaultSqlSession
默认会话
接口层
基础层
结果映射
MapperMethod
拦截器1
SqlSessionFactoryBuilder
调用JDBC执行SQL语句StatementHandler
缓存使用装饰器模式拦截器使用责任链模式
PreparedStatementHandler
StatementHandler.query(..)
1.execute(sqlSession)2.根据标签类型,进入不同分支【命令模式】3.executeForMany(sqlSession)
Mybatis架构图
创建会话时序图
BatchExecutor
1.获取Configuration2.创建PreparedStatementHandler、parameterHandler、resultSetHandler3.获取Conection4.SQL预编译:获取PreparedStatement5.处理参数:parameterize()
invoke( )
executor.query(...):未开启二级缓存
resultSetHandler.handleResultSets(ps)
映射的输出参数
返回执行器DefaultSqlSession
建造者模式获取全局配置对象XMLConfigBuilder
执行器通过命令模式执行对应方法Executor
根据接口全限定名获取工厂类实例
SqlSession
映射参数输入
延迟加载
返回代理对象
MapperProxyFactory
默认会话实现用于获取Mapper代理对象
1.根据执行器类型创建执行器2.根据cacheEnabled判断是否开启二级缓存,开启则使用缓存执行器包装,默认二级缓存开启。3.拦截器包装执行器,使用动态代理对执行器进行一层层增强
建造者模式获取会话工厂
建造者模式获取会话工厂SqlSessionFactoryBuilder
openSession( )
1.获取BoundSql2.创建Cachekey3.query():先从一级缓存中获取4.执行queryFromDatabase(...)查询5.存入一级缓存
获取Environment对象
1.根据Environment配置获取事务工厂2.工厂模式创建事务tx
ReuseExecutor
执行器,实际执行SQL
获取mapper接口的代理对象MapperProxy
加载配置文件build(InputStream inputStream)
配置解析
属性映射
日志
获取会话工厂时序图
XMLConfigBuilder
数据源/连接池
openSessionFromDataSource( )
根据类全限定名+方法名获取对应的MappedStatement对象
拦截器2
通过JDK动态代理生成代理对象
CachingExecutor
this.delegate.queryCursor
配置文件对象存储配置文件内容
0 条评论
下一页