MP 启动注入 SQL 原理分析

文章目录

  • 一、MybatisPlus需要sql语句吗?
    • 解答:需要
      • 1.1. 问题:为什么MybatisPlus看不到sql语句?
      • 1.2. 分析:继承关系
      • 1.3. 假设:操作数据库一定有sql
  • 二、通过现象看本质
    • 2.1. 测试案例
    • 2.2. debug调试运行
    • 2.2.1. employeeMapper的本质
    • 2.2.2. MapperProxy中的对象
    • 2.2.3. sqlSessionFactory中的对象
    • 2.2.4. configuration对象
    • 2.2.5. 方法对应关系
    • 2.2.6. MP在启动的时候
    • 2.2.7. 当我们调用方法的时候
  • 三、源码分析:
    • 3.1. 根据方法找到类
    • 3.2 断点调试
    • 3.3. 接着调用addDeleteMappedStatement
    • 3.4. 调用injectDeleteByIdSql
    • 3.5. sqlSource拼接完成
    • 3.5. sqlSource拼接完成,继续调用删除方法

一、MybatisPlus需要sql语句吗?

解答:需要

1.1. 问题:为什么MybatisPlus看不到sql语句?

1.2. 分析:继承关系

  • xxxMapper继承了BaseMapper,BaseMapper提供了通用的CRUD方法,

1.3. 假设:操作数据库一定有sql

  • 方法来源于BaseMapper,有方法就必须有SQL,因为Mybatis最终还是需要通过SQL语句里操作数据库。

二、通过现象看本质

2.1. 测试案例

@Testpublic void testCommonSelect() {//1. 根据主键ID查询Integer idPK = 1;Employee employee = employeeMapper.selectById(idPK);System.out.println(employee);}

2.2. debug调试运行

employeeMapper就是一个接口,但是我们拿到的对象是一个代理对象,这个JDK动态代理

2.2.1. employeeMapper的本质

  • 就是org.apache.ibatis.binding.MapperProxy@4362d7df

2.2.2. MapperProxy中的对象

  • MapperProxy中sqlSeaaion有一个sqlSessionFactory

2.2.3. sqlSessionFactory中的对象

  • 在sqlSessionFactory中有一个重要的对象configuration

2.2.4. configuration对象

  • 这个对象是mybatis的全局配置对象,它包含了所有的配置信息。
  • 在configuration里面有一个mappendStatements对象,它里面每一个都是一个mappendStatement

    其实,每一个都是一个mapperdStatement都表示Mapper接口的一个方法与Mapper映射文件中的一个sql语句。

2.2.5. 方法对应关系

  • 在BaseMapper定义的每一个方法,都会有一条sql语句与之对应mapperdStatement。

2.2.6. MP在启动的时候

  • 就会分析已经把我们BaseMapper里面的每一个方法,,将来索要执行的sql语句,都帮我们构造好了,并且都帮我们都保存到了configuraion里面的MappedStatements中的MappedStatement了。

2.2.7. 当我们调用方法的时候

  • 它就会回到configuration里面找到我们的MappedStatements,然后根据调用方法的名字,再去找到对应的sql语句,在其执行。

    本质
    在控制台,在实例化employeeMapper这个bean的时候,都调用了addMappedStatement这个方法,来添加一个addMappedStatement,而每一个addMappedStatement对应着mapper文件中的每一个方法
DEBUG 07-13 18:57:00,780 Autowiring by type from bean name 'employeeMapper' via property 'sqlSessionFactory' to bean named 'sqlSessionFactoryBean'  (AbstractAutowireCapableBeanFactory.java:1349)

三、源码分析:

3.1. 根据方法找到类

根据addMappedStatement,找到此方法的类AutoSqlInjector SQL 自动注入器,

这个java文件

这个.class文件

3.2 断点调试

  • 在.class文件中的addMappedStatement方法上打断点,dubug运行,当F8走到此方时,参数包括sqlSource 等都是前面传过来的,因此,我们需要往前推



3.3. 接着调用addDeleteMappedStatement

3.4. 调用injectDeleteByIdSql

3.5. sqlSource拼接完成

3.5. sqlSource拼接完成,继续调用删除方法

  • 接下来就去调用addDeleteMappedStatement进行具体操作

MP 启动注入 SQL 原理分析相关推荐

  1. Mybatis Plus启动注入 SQL 原理分析

    1) 问题: xxxMapper 继承了 BaseMapper<T>, BaseMapper 中提供了通用的 CRUD 方法, 方法来源于 BaseMapper, 有方法就必须有 SQL, ...

  2. 第 3 章 MybatisPlus 注入 SQL 原理分析

    第 3 章 MybatisPlus 注入 SQL 原理分析 思考问题 我们编写的 UserMapper 继承了 BaseMapper<T>,就拥有了基本的增删改查功能,这是因为 BaseM ...

  3. web安全入门(第四章-1)SQL注入的原理分析

    1.SQL注入本质 注入攻击的本质,是把用户输入的数据当作代码执行这有两个条件: 第一个是用户能够控制输入 第二个是原本程序要执行的代码,拼接里用户输入的数据然后执行sql注入就是针对sql语句的注入 ...

  4. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

  5. sql注入的原理分析

    1.知识点一:什么是sql注入? 用户输入的内容被网站当做数据库语句进行执行.关键点:输入的内容 一定要是[数据库语句]. 用户输入的内容: 我们输入的内容. 在一个网站上能够输入的地方:     1 ...

  6. springiocxml方式注入对象原理分析

    尤其是注解版本,都看懂了没有,你们最好都建立maven工程,不要建单独的java项目,这个项目建好了之后说一下,直接把pom文件copy过来,pom文件里面不是有依赖信息吗,你们都不要去写了,写比较浪 ...

  7. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...

  8. Spring Boot(四):Spring Boot启动原理分析

    文章目录 Spring Boot启动原理分析 一.依赖导入原理 二.Spring Boot包扫描原理 三.Spring Boot自动配置原理 Spring Boot启动原理分析 一.依赖导入原理 父项 ...

  9. SpringMVC源码分析_1 SpringMVC容器启动和加载原理

                                                                    SpringMVC源码分析_1 SpringMVC启动和加载原理     ...

最新文章

  1. 现在的位置就是对的啊,意思就是当鼠标放上去的时候,停止滚动,鼠标离开,继续滚动(跑马灯项目功能)...
  2. python字符串与文本处理技巧(2):大小写敏感搜索、最短匹配、多行匹配、Unicode标准化
  3. 一些移动端开发的细节记录
  4. 【Android OpenGL ES 开发 (一)】使用c++开发opengles 与 日志功能 及 加载assets
  5. 解压ubi文件_请问为什么AM3352 NAND FLASH UBI文件系统挂载失败?
  6. Make Fcitx Work In Sublime-Text-3
  7. angular 和 backbone 区别
  8. [算法题] 安排会议室——贪心算法的应用
  9. 机器人顶会RSS 2021各奖项出炉,CMU华人博士生摘得最佳论文
  10. SQLServer 2008 下载地址(微软官方网站)
  11. 485通讯( 详解 )
  12. 不符合直接升级win11?教你怎么直接安装win11系统
  13. 20165219 《Java程序设计》实验二(Java开发环境的熟悉)实验报告
  14. 6月13日云栖精选夜读:数梦工场完成A轮7.5亿融资 三个维度构建“新型互联网”
  15. 用上柔宇「办公神器套装」,我一天就写了三天的稿子
  16. PMP试题 | 每日一练,快速提分 8.6
  17. 生产排故_ORA-01000: maximum open cursors exceeded
  18. 电源常识-差模干扰共模干扰
  19. 性能测试之tcpcopy引流工具介绍
  20. 什么是跨境电商ERP?

热门文章

  1. 文件字符串变量插入linux,Linux Shell脚本实现在文件指定的行插入字符串
  2. mysql 失效转移_MySQL基于MHA的FailOver过程
  3. Linux下ARM开发环境搭建
  4. (优秀文章保存)Quartz优秀文章保存
  5. Form表单中method=post/get'的区别
  6. DataWorks百问百答01:数据同步该用什么资源组
  7. 如何在一周内上线50个用户增长策略
  8. AutoScaling 成本优化模式升级--混合实例策略
  9. PostgreSQL PostGIS 的5种空间距离排序(knn)算法
  10. 阿里巴巴1682亿背后的“企业级”高效持续交付