.

一、解析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. 第十六节:Linq用法大全(四)

    1. OfType 获取集合中中指定类型元素. , , , , , "aaa", "bbb" }; int max = obj.OfType<int> ...

  2. #P2010 回文日期 的题解

    题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日期.显然:一个日期只有 ...

  3. C语言 1字节signed char的范围为什么是-128~127?

    参考 1. 关于 -128 ,+128,-0,+0,-1 的反码补码 | 博客园 2. 八位二进制数为什么表示范围(-128~~+127)理解 | 博客园 无符号单字节范围 无符号单字节unsigne ...

  4. word2vec词向量处理英文语料

    word2vec介绍          word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集 ...

  5. java.io.IOException: java.io.FileNotFoundException: /tmp/tomcat.2457258178644046891.8080/work/Tomcat/localhost/innovate-admin/C:/up/154884318438733213952/sys-error.log (没有那个文件或目录)

    环境: Ubuntu18 vue+elementUI 实现文件的上传 报错信息: MultipartFile.transferTo(dest) 报 FileNotFoundException java ...

  6. centos将uwsgi添加为系统服务

    如果退出ssh 链接, 都会导致uwsgi进程关闭 这时, 我们需要进行管理软件管理uwsgi进行的运行, centos系统中我们采用 systemd, 让我们的项目变为系统服务 第一步: 首先 vi ...

  7. shell脚本中执行sql命令

    1.mysql 数据库表信息 2.shell脚本(a.sh)信息 #!/bin/sh mysql -u root << myInsert insert into test.t values ...

  8. 布线问题&魔法花园_最短路径

    布线问题 问题描述:印刷电路板将布线区域划分成n×m个方格阵列,精确的电路布线问题要求确定连接方格a到方格b的最短布线方案:布线时,电路只能沿着直线或直角(方格)布线:已经布线的方格被锁定,即不允许其 ...

  9. nacos集群配置

    一.    环境准备 Nacos 依赖 java环境来运行.如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用: 64 bit OS,支持 Lin ...

  10. redhat 7.6 安装 inotify-tools 文件监控工具 搭配rsync

    1.解压inotify-tools tar -zxvpf inotify-tools-3.14.tar.gz 2.cd 到解压的目录 3../configure  编译,然后失败,提示checking ...