【源码】Mybatis源码解读全过程
2023-06-16 17:55:53 0 举报
【源码】Mybatis源码解读全过程
作者其他创作
大纲/内容
parse方法
builder.pare()
SqlSessionFactory
2.2
……
2
获取入参类型
根据StatementType生成对应的Handler
handleResultSets方法
1
创建分词解析器GenericTokenParser
获取BoundSql
query
构造方法
创建ParameterMappingTokenHandler
xml中sql占位符填充具体参数
步骤2后返回Configuration为入参,build方法:创建DefaultSqlSessionFactory
解析各个类型的标签,主要关注buildStatementFromContext
获取结果映射类型
GenericTokenParser.parse解析#{},获得sql会调用ParameterMappingTokenHandler的handleToken完成处理
parseStatementNode
判断是否已经加载;从根标签开始解析
buildStatementFromContext
继承
设置默认StatementType为Prepared,该参数指定了后面的JDBC处理时,采用哪种Statement
getFirstResultSet方法:这里是获取第一个结果集,将传统JDBC的ResultSet包装成一个包含结果列元信息的ResultSetWrapper对象
实例化Statement
返回Configuration
成员变量:statementType
创建SqlSource,解析SQL,封装SQL语句(未参数绑定)和入参信息
openSession方法
// 获取入参类型 String parameterType = context.getStringAttribute(\"parameterType\"); // 别名处理,获取入参对应的Java类型 Class<?> parameterTypeClass = resolveClass(parameterType); // 获取ResultMap String resultMap = context.getStringAttribute(\"resultMap\"); // 获取结果映射类型 String resultType = context.getStringAttribute(\"resultType\");// 设置默认StatementType为Prepared,该参数指定了后面的JDBC处理时,采用哪种Statement StatementType statementType = StatementType.valueOf(context.getStringAttribute(\"statementType\
SimpleExecutor.prepareStatement方法
执行解析:sqlSourceParser.parse
new XPathParser:解析xml成document
SqlSourceBuilder
DefaultResultSetHandler
执行过程
入口
MappedStatement
2.2.2
子流程1:设置参数:prepareStatement
DefaultSqlSessionFactory
代码1private void parseConfiguration(XNode root) { try { this.propertiesElement(root.evalNode(\"properties\")); Properties settings = this.settingsAsProperties(root.evalNode(\"settings\")); this.loadCustomVfs(settings); this.loadCustomLogImpl(settings); this.typeAliasesElement(root.evalNode(\"typeAliases\")); this.pluginElement(root.evalNode(\"plugins\")); this.objectFactoryElement(root.evalNode(\"objectFactory\")); this.objectWrapperFactoryElement(root.evalNode(\"objectWrapperFactory\")); this.reflectorFactoryElement(root.evalNode(\"reflectorFactory\")); this.settingsElement(settings); this.environmentsElement(root.evalNode(\"environments\")); this.databaseIdProviderElement(root.evalNode(\"databaseIdProvider\")); this.typeHandlerElement(root.evalNode(\"typeHandlers\")); this.mapperElement(root.evalNode(\"mappers\")); } catch (Exception var3) { throw new BuilderException(\"Error parsing SQL Mapper Configuration. Cause: \
部分具体方法
1.从Configuration获取MappedStatement2.调用executor.query方法进行数据库操作
PreparedStatementHandler
SimpleExecutor
通过构建者助手,创建MappedStatement对象
query方法(继承来自BaseExecutor的)
configurationElement
SqlSession
定义各种方法
DefaultSqlSession
Executor
selectList
具体各种CRUD方法
BaseBuilder
query方法
创建数据源;创建Executor执行器;创建DefaultSqlSession
来自MappedStatement成员变量SqlSource
创建Configuration
environmentsElement:数据库环境解析
instantiateStatement方法2.2.2
doquery方法(来自SimpleExecutor自己实现的)
XMLConfigBuilder
BaseExecutor(抽象)
2.1
创建RoutingStatementHandler,用来处理Statement
3.2.处理结果集:resultSetHandler.handleResultSets(ps)
实现接口
ResultSetHandler
实例化Statement:statement = instantiateStatement(connection);
2.3
addMappedStatement方法
RoutingStatementHandler
启动项目
SqlSource
XMLStatementBuilder解析时创建
成员变量:Configuration
Configuration
实现
3.1.执行sql:PreparedStatement.execute()
new()
XMLStatementBuilder
设置参数:handler.parameterize(stmt);
放入Configuration
3.handler.query方法
获取Configuration对象
openSessession创建DefalutSqlSession并传入Configuration
executor.query
SqlSessionFactoryBuilder
成员变量:SqlSource
queryFromDatabase查询
XMLMapperBuilder
解析xml标签,最重要的两个是
业务查询
2.2.1
build方法
prepare方法2.2.1
创建sql信息解析器SqlSourceBuilder
parse方法(代码1)
2.1获取连接Connection connection = this.getConnection(s);为空时通过DefaultSqlSessionFactory.openSessession获取
3
mapperElement:mapper.xml解析
启动过程
将解析后的SQL语句还有入参绑定到一起封装到BoundSql对象中
getBoundSql
CallableStatementHandler
SimpleStatementHandler
处理结果
getBoundSql方法
BaseStatementHandler(抽象类)
返回StaticSqlSource
parameterize方法
handleResultSets
MapperBuilderAssistant
成员变量:ParameterMap parameterMap
成员变量:List<ResultMap> resultMaps
DynamicSqlSource
0 条评论
下一页