提示1:本文需在掌握动态代理基础后浏览,如果动态代理需要回顾可以看我的另一篇博客

提示2:本文以我之前写的工程为模板进行讲解,工程结构及代码可以看我的另一篇博客

1. 说在前头

2. sqlSessionFactoryBuilder的build()过程:解析mybatis配置文件得到拥有Configuration属性的DefaultSqlSessionFactory对象。先梳理一下大体流程,然后再进行源码分析

2.1 mybatis配置文件读取后作为IO输入流会作为参数调用SqlSessionFactoryBuild类的build方法;

2.2 mybatis配置文件输入流会被转为XMLConfigBuild对象的XPathParser类型parser属性,便于解析;

2.3 XMLConfigBuilder的parseConfiguration方法解析parser属性,也就是解析mybatis配置文件的各个标签,如environments、mappers标签;

2.4 主要是mappers标签的解析,一般mappers标签内使用package标签扫描整个dao包,最终在MapperRegistry类中执行addMappers方法,根据包名找到以 .class 结尾的字节码文件并得到接口的Class对象,将其放入knowMappers对象中。在放入knowMappers对象时会校验 .class 是否接口,是接口会放入knowMappers中,不是接口不会放入。

2.5 然后执行MapperAnnotationBuilder的loadXmlResource方法,根据Dao接口名加载对应mapper的xml文件,所以接口名和xml文件要同名,加载后解析xml文件;然后会在MapperBuilderAssistant类的setCurrentNamespace方法中检查mapper的xml文件namespace是否和接口名一致,不一致会抛出异常。

2.6 mapper文件校验通过后,执行XMLMapperBuilder类的configurationElement方法解析mapper文件各个标签,最终在XMLStatementBuilder类的parseStatementNode方法解析mapper文件的各个select | insert | update | delete标签得到mappedStatement对象。

总结:最主要就是XMLConfigBuilder的parseConfiguration方法对mybatis配置文件各个标签节点的解析以及XMLMapperBuilder类的configurationElement方法对mapper文件xxDao.xml解析生成mappedStatement对象。

3. sqlSession.getMapper以及执行Dao接口方法的过程,先梳理一下大体流程,然后再进行源码分析

3.1 getMapper方法最终会进入MapperProxyFactory的newInstance方法,返回一个动态代理对象;

3.2 执行Dao方法时,则会进入动态代理对象MapperProxy的invoke方法,会将Method类型对象结合接口以及Configuration对象得到包含SqlCommand和MethodSignature的MapperMethod对象;

3.3 然后会执行MapperMethod的execute方法;紧接着调用DefaultSqlSession的selectList方法,最终会根据sqlCommand的name从Configuration类的mappedStatements属性得到对应的mappedStatement;

3.4 然后执行BaseExecutor的query方法,接着执行SimpleExecutor的doQuery方法,最终执行PreparedStatementHandler的query方法。

总结:最主要就是三点:①通过MapperProxyFactory得到动态代理对象;②Method对象转为包含sqlCommand和MethodSignature属性的MapperMethod对象;③根据MappedMethod对象的信息得到MappedStatement,进而确定最终要执行的sql语句。

mybatis中getMapper是怎么通过动态代理得到dao接口的实现类并执行mapper文件sql语句的相关推荐

  1. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

    Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题 参考文章: (1)Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代 ...

  2. spring中aop默认使用jdk动态代理,springboot2以后默认使用cglib来实现动态代理详解

    Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里: 真的假的?查阅文档 刚看到这个说法的时候,我是保持怀疑态度的. 大家都知道 Spring5 之前的版本 AOP ...

  3. java用tkmapper分组查询_tk.mybatis 中的通用Mapper自定义SQL语句

    前言 今天就是想写点什么,其实还有很多没写的东西呢!笔记里边好多东西都挺好的,经验加实践总结出来的.就是都没有系统的整理,至于原因吧,有很多,最重要的一点就是我有点懒.今天写个最简单的东西,现在的开发 ...

  4. Mybatis映射文件SQL语句模糊查询,#和$的区别和注意事项

    Mybatis映射文件SQL语句模糊查询 1. "%"#{value}"%" 在参数中不需要添加 %_ 推荐使用 2. '%${value}%' 在参数中不需要 ...

  5. 在Oracle中不通过存储过程一次执行多条SQL语句Oracle PL/SQL

    PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL ...

  6. oracle多条sql语句常量,如何在Oracle中一次执行多条sql语句

    有时我们需要一次性执行多条sql语句,而用来更新的sql是根据实际情况用代码拼出来的 解决方案是把sql拼成下面这种形式: begin update TB_VG set seq = 1, vessel ...

  7. mysql数据库中查询第几条到第几条数据_在 mysql 数据库中,从查询结果的第四条记录开始选取5条记录,下面 sql 语句正确的是( )...

    [单选题]同一种货物,在同一线路上或平行线路上作相对方向的运送,而与对方运程的全部或一部分发生重迭交错的运输被称为( ). [多选题]水闸一般由()三部分组成 [单选题]在一个常规的统计表内,非必需包 ...

  8. mybatis plus 执行 原始的sql 语句

    mybatis plus 执行sql_正怒月神的博客-CSDN博客_mybatis-plus 执行sql废话不多.mapper@Select("${sqlStr}") List&l ...

  9. 去除 IDEA 中 XML 文件 SQL 语句的黄色背景

    环境 IDEA 19.1.2 macOS 10.15.3 去除 IDEA 中 XML 文件 SQL 语句的黄色背景 在使用 IDEA 中的 Mapper.xml 写 SQL 语句时,SQL 语句后面会 ...

最新文章

  1. 公司成立两周年感言_对我的副项目成立一周年的一些反思
  2. see的口语高频用法
  3. 《XNA高级编程:Xbox 360和Windows》1-2
  4. 聊一聊Flutter Engine线程管理与Dart Isolate机制
  5. 通过引入switch表达式来增强Java switch语句
  6. wordpress CAS
  7. GMTC2019|闲鱼-基于Flutter的架构演进与创新
  8. 单元测试——Winfrom
  9. 利用SPA(SQL Performance Analyzer)对比两个SQL Tuning Set
  10. Linux如何验证AP6212(AP6236)的bluetooth功能
  11. 24个基本指标精粹讲解(22)--ADR
  12. Facebook大数据技术架构的演进路线
  13. 你也可以看懂,量子力学的困惑,测不准原理 薛定谔的猫 !
  14. (六) 数据结构 - 快速排序
  15. 常见的通讯协议总结(USART、IIC、SPI、485、CAN)
  16. 泛微oa流程表单之请假单(判断请假结束时间不能小于等于请假开始时间)
  17. 极客星球 | 前端工程化之路的探索与实践
  18. 杨月江计算机导论答案,计算机导论课程实验教学大纲-计算机学院-华北科技学院.doc...
  19. STM32阿波罗F767开发板资源介绍
  20. 【机器学习与算法】python手写算法:Cart树

热门文章

  1. 【PP生产订单】入门介绍(十一)
  2. VOFM例程开发实现定价增强
  3. ABAP检查日期and时间合法性的函数
  4. SAP HR模块的基础数据表和增强配置
  5. 22、Power Query-文本字符的精确提取
  6. PL/SQL Developer使用技巧、快捷键
  7. IDOCALE常用tcode
  8. 回港二次上市,会是内容社区平台的更优选吗?
  9. salt return mysql_mysql中储存salt返回结果
  10. linux vsftpd用法,Linux_LINUX系统下vsftpd 命令详解,FTP命令是Internet用户使用最频 - phpStudy...