.

一、解析xml:
> org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream, java.lang.String, java.util.Properties)
> org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
> org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration
> org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement "environments"
> org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement "mappers" "package/resource/url/class"
> org.apache.ibatis.builder.xml.XMLMapperBuilder.parse
> org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement
> org.apache.ibatis.builder.xml.XMLMapperBuilder.parameterMapElement "/mapper/parameterMap"
> org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements "/mapper/resultMap"
> org.apache.ibatis.builder.xml.XMLMapperBuilder.sqlElement(java.util.List<org.apache.ibatis.parsing.XNode>) "/mapper/sql"
> org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(java.util.List<org.apache.ibatis.parsing.XNode>) "select|insert|update|delete" 构建statement
> org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode 将mapper里写的sql转化为statement
↓创建statement sql语句RawSqlSource对象,将#{}转为?,并将#{}里的参数名存在对象中
↓关于${}:封装为DynamicSqlSource
> org.apache.ibatis.scripting.LanguageDriver.createSqlSource(org.apache.ibatis.session.Configuration, org.apache.ibatis.parsing.XNode, java.lang.Class<?>)
> org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseScriptNode > org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(java.lang.String, org.apache.ibatis.mapping.SqlSource, org.apache.ibatis.mapping.StatementType, org.apache.ibatis.mapping.SqlCommandType, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.Class<?>, java.lang.String, java.lang.Class<?>, org.apache.ibatis.mapping.ResultSetType, boolean, boolean, boolean, org.apache.ibatis.executor.keygen.KeyGenerator, java.lang.String, java.lang.String, java.lang.String, org.apache.ibatis.scripting.LanguageDriver, java.lang.String)
↑以上是解析xml文件,解析出statement,SqlSource ↓以下是将mapper接口和命名空间绑定
> org.apache.ibatis.builder.xml.XMLMapperBuilder.bindMapperForNamespace
> 二、openSession操作:
> org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource
> org.apache.ibatis.transaction.TransactionFactory.newTransaction(javax.sql.DataSource, org.apache.ibatis.session.TransactionIsolationLevel, boolean)
> org.apache.ibatis.session.Configuration.newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)
> org.apache.ibatis.session.defaults.DefaultSqlSession new 三、getMapper:
> org.apache.ibatis.binding.MapperRegistry.getMapper
> org.apache.ibatis.binding.MapperProxyFactory.newInstance(org.apache.ibatis.session.SqlSession)
↓jdk动态代理
> org.apache.ibatis.binding.MapperProxy
> org.apache.ibatis.binding.MapperProxyFactory.newInstance(org.apache.ibatis.binding.MapperProxy<T>) 四、查询:
> org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(java.lang.String, java.lang.Object)
> org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)
> org.apache.ibatis.session.defaults.DefaultSqlSession.wrapCollection
↑封装参数
↓关于绑定参数名@Param:
> org.apache.ibatis.session.Configuration.getMappedStatement(java.lang.String)
> org.apache.ibatis.executor.BaseExecutor.query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)
↓通过SqlSource,解析出sql,解析成?,得到参数
> org.apache.ibatis.mapping.MappedStatement.getBoundSql
> org.apache.ibatis.executor.BaseExecutor.queryFromDatabase
> org.apache.ibatis.executor.SimpleExecutor.doQuery
> org.apache.ibatis.executor.SimpleExecutor.prepareStatement 拼装sql的parameter查询条件 ****
> org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters 将得到的参数设置到对应的顺序,还包括JdbcType等 ****
> org.apache.ibatis.executor.statement.StatementHandler.query 执行查询
> java.sql.Statement.execute(java.lang.String) 提交查询
> org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets 处理结果集

.

MyBatis源码部分简单地解析的更多相关文章

  1. MyBatis 源码分析 - 映射文件解析过程

    1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...

  2. Spring mybatis源码篇章-MybatisDAO文件解析(二)

    前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-MybatisDAO文件解析(一) 默认加载mybatis主文件方式 XMLConfigBuilder ...

  3. Spring mybatis源码篇章-MybatisDAO文件解析(一)

    前言:通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-SqlSessionFactory 加载指定的mybatis主文件 Mybatis模板文件,其中的属性 ...

  4. Mybatis 源码之Plugin类解析

    public class Plugin implements InvocationHandler { private Object target; //目标对象 private Interceptor ...

  5. MyBatis 源码分析 - 配置文件解析过程

    * 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...

  6. 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根 ...

  7. MyBatis 源码分析 - 插件机制

    1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...

  8. MyBatis 源码分析 - 缓存原理

    1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...

  9. MyBatis 源码分析 - 内置数据源

    1.简介 本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑.搞懂这些数据源的实现,可使大家对数据源有更深入的认识.同时在配置这些数据源时,也会更清楚每种属性的意义和用途.因此,如果大家想知其 ...

随机推荐

  1. 使用kibana或postman操作Elasticsearch的常用命令

    前言服务器:CentOS-6.7 运行系统:windows10 JDK版本:1.8 Elasticsearch版本:5.6.6 插件:kibana.elasticsearch-head 工具:post ...

  2. FreeSWITCH调用第三方TTS 使用tts_commandline

    FreeSWITCH 支持调用第三方TTS命令,本身已经搭好了框架,只需要配置即可用. 下面写一下步骤,以免忘记,也希望给你带来帮助. 第一步:编译模块mod_tts_commandline,并加载. ...

  3. json字符串转换成json增删查改节点

    一.功能实现 1.节点树查询: 按ID查询树 2.节点新增: http://host/tree_data/node/${treeId} in: {node: {key: ..., ...}, pare ...

  4. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 显示代码:变量赋值

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. eclipse 快速隐藏所有方法的代码块

    java开发中往往一个class文件中会有很多方法,一个方法的实现代码有时候特别长 我个人就喜欢把无关的方法代码全部隐藏起来,只打开当前需要编辑的代码就行了(不喜欢看导航视图,容易头晕) Ctrl+s ...

  6. TensorFlow基础二(Shape)

    首先说明tf中tensor有两种shape,分别为static (inferred) shape和dynamic (true) shape,其中static shape用于构建图,由创建这个tenso ...

  7. android原始sqlite中query的复杂用法

    android直接执行sql是execSQL(String sql). 这个方法可以执行任意sql语句.但是改变这个不够灵活. query这个方法可以很好的解决这个问题. 执行query查询指定的数据 ...

  8. C++面试常见问题——04链表的逆序与合并

    链表的逆序与合并 链表的逆序 已知一个链表的头指针为head,将该链表逆序. #include<iostream> using namespace std; struct Node{ in ...

  9. 「CF1303C Perfect Keyboard」

    前置芝士 图的遍历:通过DFS或者BFS遍历全图. 前向星:用来存边,但是在本题用也可以用一个二维数组解决. 具体做法 先从判断YES和NO开始,可以发现如果一个字母与三个及以上不同的字母相邻时肯定是 ...

  10. 收藏 40 2 CPD (广告合作方式)

    CPD,Cost per day的缩写,意思是按天收费,是一种广告合作方式. 在实际的广告合作中根据行业不同还包括Cost per Download的缩写含义,意思是依据实际下载量收费.   “CPD ...