MyBatis-MappedStatement什么时候生成?QueryWrapper如何做到动态生成了SQL?

通过XML配置的MappedStatement

这部分MappedStatement主要是由MybatisXMLMapperBuilder进行解析,核心逻辑如下:

通过注解配置的MappedStatement

核心逻辑就在这个里面了:

继承BaseMapper的MappedStatement

我们看看这个类,里面就提供了一些默认的方法:

然后得到这个方法列表以后就进行了MappedStatement的注册:

QueryWrapper如何生效?


可以很清晰的看到QueryWrapper这个参数给我们内置了名称ew。那么怎么根据我们QueryWrapper里面的条件生成SQL的?答案就在这个getBoundSql里面:

可以看到当参数为QueryWrapper的时候其实Map里面有两个参数但是这两个参数都指向同一个对象,在创建DynamicContext会将传过来的参数存储在private final ContextMap bindings里面:

前面我们提到继承BaseMapper的MappedStatement注册,这里面其实又根据不同的CommandType生成了不同的动态SQL语句。

并且根据动态SQL创建了SqlSource:

上面创建的SqlSource 在使用QueryWrapper进行查询的时候会被用到,现在我们就有了参数和SqlSource,接下来就是生成真正的SQL:

我们看到Context#getSql 的时候就已经拿到了Sql:

所以这个核心逻辑就RootSqlNode.apply()做很多操作:

我们看看里面的逻辑,很清晰的看到针对不动的Node进行了不同的处理,这个时候生成了我们最终的SQL并且完成了字段和属性的绑定,底层是通过Ognl去实现的:

接着往下走,返回之前已经生成了ParaMeterMappings,生成了预编译的SQL:

后面就是把真正的值填进去执行查询操作了。

相关推荐
JSON_L8 分钟前
Fastadmin中实现敏感词管理
数据库·php·fastadmin
不是起点的终点1 小时前
【实战】Python 一键生成数据库说明文档(对接阿里云百炼 AI,输出 Word 格式)
数据库·python·阿里云
2301_813599553 小时前
Go语言怎么做秒杀系统_Go语言秒杀系统实战教程【实用】
jvm·数据库·python
NCIN EXPE8 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台8 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路8 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家8 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE8 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow128 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO8 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库