Mybatis2 解析流程
2023-08-18 13:01:15 17 举报
Mybatis
作者其他创作
大纲/内容
依赖
把解析成功的mapper添加到loadedResources
DefaultSqlSession#insert/delete/...执行对应方法
configuration#newExecutor(tx)创建执行器
读取 mapper 信息,构建 MapperBuilderAssistant映射器助手对象
DefaultSqlSession#commit
new SqlSourceBuilder(configuration)#parse解析sql和参数
初始化
transactionFactory#newTransaction获取事务
把以上信息设置到 Environment 对象,并保存到configuration对象
对象工厂objectFactory
实现
executor#commit
executor#query/update用执行器执行
环境信息environment
结果映射resultMaps
StatementHandler#prepare准备语句
DefaultSqlSession#getMapper得到被代理的类XxxDao
connection#commit()
JdbcTransactionFactoryJDBC事务
InvocationHandlerjava动态代理的接口
connection#repareStatement
语言驱动注册机languageRegistry
knownMappers#new MapperProxyFactory()注册代理工厂实例
自定义插件拦截器interceptorChain
// 执行接口方法userDao.insertUserInfo(user);
类型注册机typeAliasRegistry
6. SQL信息封为 MappedStatement 并注册到 configuration
二级缓存caches
// 获取映射器对象IUserDao userDao = sqlSession.getMapper(IUserDao.class);
用 XMLMapperBuilder进行mapper的文件解析
1. user_name userName 映射解析2. 字段对应类的 javaType3. javaType 对应的 typeHandler4. 得到 ResultMapping 集合
XxxDao#select/insert/delete执行代理类方法
设置数据库连接信息,使用 MetaObject 动态获取信息
调用buildParameterMapping
PooledConnection池化数据源
transaction#commit
DataSourceFactory数据源工厂
XMLConfigBuilder#environmentsElement解析XML数据源环境信息
new Configuration()
5. LanguageDriver#createSqlSource语言驱动器,解析XML得到sql
判断是否已加载该mapper文件到loadedResources
DataSource得到数据源
environment#getTransactionFactory()事务工厂
映射语句信息注册机mappedStatements
// 解析xml文件,从构建 SqlSessionFactory 工厂Reader resourceAsReader = Resources.getResourceAsReader(\"mybatis-config-datasource.xml\");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader);
结束
1. id 解析2. 参数解析 parameterType3. 结果类型解析 resultType4. 命令解析 select/inset/...
MapperProxy#invoke拦截每个方法的执行
PreparedStatement#execute
具体实现
MapperRegistry绑定到映射注册机
已加载Mapper记录器loadedResources
configuration#getEnvironment()获取环境数据源环境
knownMappers#get(type)获取MapperProxyFactory
MapperProxy#new实例映射器代理类
Proxy#newProxyInstance执行代理
// 开启 SessionsqlSession = sqlSessionFactory.openSession();
继承
SimpleExecutor
configuration#newStatementHandler初始化并得到语句处理器
ParameterMappingTokenHandler#buildParameterMapping解析sql语句参数类型,封装parameterMappings 参数映射信息
StatementHandler#query/update执行
类型处理器注册机typeHandlerRegistry
mapperProxyFactory#newInstance得到代理类
transactionManager#type读取type属性
// 提交事务sqlSession.commit();
解析 mapper.xml select/insert/update/selete 等标签
通过 typeAliasRegistry 根据 type获取所需要的事务
GenericTokenParser#parse解析sql语句#{}占位符,替换成?
build()开始正式解析
resultSetHandler#handleResultSets结果封装处理器
TransactionFactory得到事务工厂实例
维护的信息
读取
XMLMapperBuilder#configurationElement#resultMapElements解析 resultMap 属性
Configuration信息,该实例会贯穿整个流程
对象包装器工厂objectWrapperFactory
SqlSessionFactoryBuilder
开始
加载&解析XML
映射注册机MapperRegistry
通过xml读取dataSource的type,传给 typeAliasRegistry得到需要哪种池化技术
new XMLStatementBuilder()#parseStatementNode 解析每个标签内容
UnpooledDataSource池化数据源
mybatis-config-datasource.xml
XMLConfigBuilder#mapperElement解析XML的mapper属性
get获取
DefaultSqlSessionFactory#openSession开启session会话得到DefaultSqlSession
解析 mapper resource 所对应的 mapper.xml 文件
StatementHandler#parameterize准备参数
0 条评论
回复 删除
下一页