MP 启动注入 SQL 原理分析
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 原理分析相关推荐
- Mybatis Plus启动注入 SQL 原理分析
1) 问题: xxxMapper 继承了 BaseMapper<T>, BaseMapper 中提供了通用的 CRUD 方法, 方法来源于 BaseMapper, 有方法就必须有 SQL, ...
- 第 3 章 MybatisPlus 注入 SQL 原理分析
第 3 章 MybatisPlus 注入 SQL 原理分析 思考问题 我们编写的 UserMapper 继承了 BaseMapper<T>,就拥有了基本的增删改查功能,这是因为 BaseM ...
- web安全入门(第四章-1)SQL注入的原理分析
1.SQL注入本质 注入攻击的本质,是把用户输入的数据当作代码执行这有两个条件: 第一个是用户能够控制输入 第二个是原本程序要执行的代码,拼接里用户输入的数据然后执行sql注入就是针对sql语句的注入 ...
- Mybatis解析动态sql原理分析
前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...
- sql注入的原理分析
1.知识点一:什么是sql注入? 用户输入的内容被网站当做数据库语句进行执行.关键点:输入的内容 一定要是[数据库语句]. 用户输入的内容: 我们输入的内容. 在一个网站上能够输入的地方: 1 ...
- springiocxml方式注入对象原理分析
尤其是注解版本,都看懂了没有,你们最好都建立maven工程,不要建单独的java项目,这个项目建好了之后说一下,直接把pom文件copy过来,pom文件里面不是有依赖信息吗,你们都不要去写了,写比较浪 ...
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...
- Spring Boot(四):Spring Boot启动原理分析
文章目录 Spring Boot启动原理分析 一.依赖导入原理 二.Spring Boot包扫描原理 三.Spring Boot自动配置原理 Spring Boot启动原理分析 一.依赖导入原理 父项 ...
- SpringMVC源码分析_1 SpringMVC容器启动和加载原理
SpringMVC源码分析_1 SpringMVC启动和加载原理 ...
最新文章
- 现在的位置就是对的啊,意思就是当鼠标放上去的时候,停止滚动,鼠标离开,继续滚动(跑马灯项目功能)...
- python字符串与文本处理技巧(2):大小写敏感搜索、最短匹配、多行匹配、Unicode标准化
- 一些移动端开发的细节记录
- 【Android OpenGL ES 开发 (一)】使用c++开发opengles 与 日志功能 及 加载assets
- 解压ubi文件_请问为什么AM3352 NAND FLASH UBI文件系统挂载失败?
- Make Fcitx Work In Sublime-Text-3
- angular 和 backbone 区别
- [算法题] 安排会议室——贪心算法的应用
- 机器人顶会RSS 2021各奖项出炉,CMU华人博士生摘得最佳论文
- SQLServer 2008 下载地址(微软官方网站)
- 485通讯( 详解 )
- 不符合直接升级win11?教你怎么直接安装win11系统
- 20165219 《Java程序设计》实验二(Java开发环境的熟悉)实验报告
- 6月13日云栖精选夜读:数梦工场完成A轮7.5亿融资 三个维度构建“新型互联网”
- 用上柔宇「办公神器套装」,我一天就写了三天的稿子
- PMP试题 | 每日一练,快速提分 8.6
- 生产排故_ORA-01000: maximum open cursors exceeded
- 电源常识-差模干扰共模干扰
- 性能测试之tcpcopy引流工具介绍
- 什么是跨境电商ERP?
热门文章
- 文件字符串变量插入linux,Linux Shell脚本实现在文件指定的行插入字符串
- mysql 失效转移_MySQL基于MHA的FailOver过程
- Linux下ARM开发环境搭建
- (优秀文章保存)Quartz优秀文章保存
- Form表单中method=post/get'的区别
- DataWorks百问百答01:数据同步该用什么资源组
- 如何在一周内上线50个用户增长策略
- AutoScaling 成本优化模式升级--混合实例策略
- PostgreSQL PostGIS 的5种空间距离排序(knn)算法
- 阿里巴巴1682亿背后的“企业级”高效持续交付