目录
- Demo:动态SQL
- 1. Xml中Sql节点解析——存储到SqlSource对象
- 2. Sql执行——通过调用SqlSource.getBoundSql得到动态处理过的Sql
-
- 1. SqlNode.apply处理动态内容
- 2. SqlSourceParser.parse替换#符号为?
Demo:动态SQL
="countByMap" resultType="int">
select count(id) from person
AND id = #{id}
AND name = ${name}
AND description = #{description}
【框架大集合|【MyBatis详解】——动态SQL解析与执行原理】传参Map:id=1,name=ss
1. Xml中Sql节点解析——存储到SqlSource对象
- 在【MyBatis详解】——从Xml配置解析到SQL执行过程
的配置解析——SQL解析阶段,
XMLScriptBuilder调用了parseScriptNode方法:
- 此SqlSource被解析为动态sql,所以为DynamicSqlSource类型;其rootSqlNode祖节点为MixedSqlNode类型,即一个3个子节点的数组:
文章图片
第1个子节点为静态sql类型:
文章图片
同样的第3个子节点为静态sql类型:
文章图片
关键看第2个子节点,为WhereSqlNode类型:
文章图片
在Where节点中,又包括了两个if标签的内容,都被保存为StaticTextSqlNode静态sql类型。
- 注意此时的#和$符号都还没用被替换掉
- if标签为true或者false的节点都被保存了下来
文章图片
- 在【MyBatis详解】——从Xml配置解析到SQL执行过程
的Executor执行SQL阶段,在StatementHandler被创建的过程中,有一个getBoundSql的步骤:
然后将调用上一步得到的SqlSource的getBoundSql方法:
- 解析if等动态标签,只有test条件为true时,才append对应sql
- 把$符号替换为参数,直接拼接sql
文章图片
- SqlNode
节点解析时的工具类,简单理解就是xml中的每个标签,如update,trim,if标签
其实现类包括
文章图片
实现动态Sql的关键就是 各个SqlNode的 apply方法;
以IfSqlNode为例,如果满足条件,则append标签中的内容,并返回true:
文章图片
而StaticTextSqlNode类型静态sql,则直接append
文章图片
文章图片
最终得到的是JDBC格式的SQL,实现动态Sql的关键是各个SqlNode的 apply方法。
推荐阅读
- #|Mybatis的if else妙用(Choose标签使用)
- java|如何在 ACK 中使用 MSE Ingress
- Redis|Redis实现分布式锁
- spring|springAOP 通过注解实现 日志打印
- java|java基础巩固16
- 抖音|java 抖音开放平台 code token等
- 抖音开发|抖音开放平台入门教程之获取抖音授权,根据授权换取token,根据token调用接口示例!
- java|抖音开放平台, 企业号私信订阅服务 java(公开的)
- 面试|秋招已至,抓紧备一波蚂蚁金服、字节跳动、阿里等大厂面试,冲刺金九银十!!