网易首页 > 网易号 > 正文 申请入驻

Mybatis的SqlSession执行sql过程

0
分享至


上一篇分析了SqlSession执行sql的过程,其中并没有分析sql是从哪里来的,今天就来仔细分析下。

Sql来源

从上一篇的最后一步执行sql那里倒推sql的来源,源码主要过程如下图:

可以看到最后是通过BoundSql直接获取的sql,然后往前倒推最后发现是通过MappedStatement的getBoundSql方法返回的。MappedStatement在之前分析mapper的时候知道一个执行sql对应一个MappedStatement对象,它封装有mybatis中需要执行一条sql的所有信息,所以从这里获取也是理所应当的。

MappedStatement的getBoundSql方法

那么就来看下MappedStatement的getBoundSql方法吧,源码如下图:

首先是右边MappedStatement的getBoundSql方法,这次改了下sql传递了两个参数,但是对程序基本没什么影响。可以看到BoundSql是通过SqlSource创建的,通过debug知道是DynamicSqlSource对象。

左边是DynamicSqlSource的getBoundSql方法,可以先看后面的创建BoundSql对象,是通过SqlSource初始化的,而创建SqlSource对象需要的第一个参数是通过context.getSql()得到的。

而在getBoundSql方法第一步是初始化了context,从上图的debug可以看到目前context的信息,bindings属性已经通过初始化把参数设置进去,而sqlBuilder还是一个空字符串。关键代码就在当前打断点的“rootSqlNode.apply(context);”这行代码。

从上图可以看到rootSqlNode是一个MixedSqlNode对象,MixedSqlNode对象的apply方法是遍历属性contents的所有元素并执行它们的apply方法,可以看到contents只有一个TextSqlNode对象的元素。所以最终来到TextSqlNode对象。

TextSqlNode对象的text属性保存的就是还没有进行处理的sql。

TextSqlNode处理sql

TextSqlNode处理sql的源码如下图:

右侧是TextSqlNode的apply方法,参数context就是上一步需要的context,他里面包含有请求参数,从上一张源码图可以知道它的属性sqlBuilder此时还是一个空字符串,而apply就是去拼接sqlBuilder。

apply方法首先创建了一个GenericTokenParser对象,GenericTokenParser对象有三个属性openToken、closeToken、handler。其中openToken、closeToken分别对应字符串”${”、”}”,而handler的属性context对应传递进来的context,injectionFilter属性是TextSqlNode的injectionFilter。apply第二行代码“context.appendSql(parser.parse(text));”可以看出来parser.parse(text)就是生成sql的代码。其中text是TextSqlNode中没有处理的原始sql。

所以sql生成在GenericTokenParser的parse方法,parse方法的关键源码如上图左侧。主要步骤分析如下:

1、从sql找到第一个“${”位置start,获取到元素sql(text)的字符数组src;

2、把src从开始到start处的字符拼接到结果builder上,也就是把“${”的内容拼接到结果上;

3、从start+2的位置开始找“}”的位置end,从src数组里取出“${”、“}”之间的字符组成字符串并根据字符串从hander中取出字符串对应的参数值。并把值拼接到结果builder上。

最后还有一点代码没有截取到“start = text.indexOf(openToken, offset);

} while (start > -1);”也就是第4步。

4、继续找到下一个“${”并拼接。最终组成完整的sql。

实际上GenericTokenParser的parse方法还是比较简单的,就是把传递进来的参数text中openToken、closeToken中间的内容替换成对应的参数。

总结

从之前的分析我们知道一个MappedStatement对应一个sql,那么如何从MappedStatement获取组装好的sql呢,实际上是MappedStatement的属性sqlSource。

而sqlSource实际上是依靠rootSqlNode,在之前我们分析过解析mapper文件是把sql生成了嵌套的各种SqlNode子类。今天就看到他们的使用了。不过今天的算是比较简单的,后面来一个稍微复杂一点的看看sql的解析过程。

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
随着德国4-5巴拉圭,世界杯16强已出3席,欧洲0队,巴西绝杀日本

随着德国4-5巴拉圭,世界杯16强已出3席,欧洲0队,巴西绝杀日本

侃球熊弟
2026-06-30 07:30:21
世界杯:荷兰点球3-4无缘16强!创队史最差战绩 摩洛哥踢加拿大

世界杯:荷兰点球3-4无缘16强!创队史最差战绩 摩洛哥踢加拿大

念洲
2026-06-30 11:55:27
日本出局不可怕,可怕的是赛后森保一的宣言!黄健翔直接点破事实

日本出局不可怕,可怕的是赛后森保一的宣言!黄健翔直接点破事实

十点街球体育
2026-06-30 07:08:13
警方通报:40岁杨某诋毁袁隆平科研成果,被刑拘

警方通报:40岁杨某诋毁袁隆平科研成果,被刑拘

观察者网
2026-06-29 21:36:08
谈成了,白俄罗斯答应中国

谈成了,白俄罗斯答应中国

安安说
2026-06-30 10:31:41
瓜迪奥拉致德国三届世界杯止步,传控战术毁铁血战车

瓜迪奥拉致德国三届世界杯止步,传控战术毁铁血战车

老牛体育解说
2026-06-30 09:17:14
日本球迷挑衅!巴西网友回击:向全世界科普日本二战罪行+731恶行

日本球迷挑衅!巴西网友回击:向全世界科普日本二战罪行+731恶行

念洲
2026-06-29 20:03:58
为何能逆转日本?安切洛蒂一句话救了巴西 无愧老江湖 尽显冠军相

为何能逆转日本?安切洛蒂一句话救了巴西 无愧老江湖 尽显冠军相

萌兰聊个球
2026-06-30 07:42:05
魏敏芝现状:在美国当导演,全家定居夏威夷,如今40岁胖到不敢认

魏敏芝现状:在美国当导演,全家定居夏威夷,如今40岁胖到不敢认

白面书誏
2026-06-29 21:16:24
勇士奇才谈判巴特勒换浓眉!开启组建四巨头:老詹最多2300万年薪

勇士奇才谈判巴特勒换浓眉!开启组建四巨头:老詹最多2300万年薪

罗说NBA
2026-06-30 07:04:20
59岁克洛普怒了:德国绝杀若无效 阿森纳该剥夺冠军+6成进球吹掉

59岁克洛普怒了:德国绝杀若无效 阿森纳该剥夺冠军+6成进球吹掉

我爱英超
2026-06-30 08:54:39
开拓者官方欢迎莫兰特!2换1交易正式完成 杨瀚森利拉德迎新队友

开拓者官方欢迎莫兰特!2换1交易正式完成 杨瀚森利拉德迎新队友

罗说NBA
2026-06-30 09:12:32
电影《四渡》现飞夺卢沟桥?网友:别让这帮高考200分的人拍电影

电影《四渡》现飞夺卢沟桥?网友:别让这帮高考200分的人拍电影

蜜桔娱乐
2026-06-29 11:00:25
人民日报披露案情,抓捕12人,坐实《四渡》被黑

人民日报披露案情,抓捕12人,坐实《四渡》被黑

光影新天地
2026-06-29 20:00:56
12岁男生放学回家后坠亡,此前曾因涉早恋问题被老师公开批评,家长起诉学校索赔92万

12岁男生放学回家后坠亡,此前曾因涉早恋问题被老师公开批评,家长起诉学校索赔92万

大风新闻
2026-06-29 21:07:07
四渡赤水打的是国民党,电影《四渡》居然要和日本IP作战……

四渡赤水打的是国民党,电影《四渡》居然要和日本IP作战……

影视口碑榜
2026-06-29 13:38:35
Papi酱名下公司均已注销

Papi酱名下公司均已注销

鲁中晨报
2026-06-29 14:35:03
受贿数额特别巨大,河北省政协原副主席姜德果被提起公诉

受贿数额特别巨大,河北省政协原副主席姜德果被提起公诉

界面新闻
2026-06-30 10:01:53
中方通告全球,新一轮对日反制开始,高市早苗意识到事情严重了

中方通告全球,新一轮对日反制开始,高市早苗意识到事情严重了

共工之锚
2026-06-30 00:10:13
Shams:灰熊将莫兰特交易至开拓者,换回格兰特和克里斯-穆雷

Shams:灰熊将莫兰特交易至开拓者,换回格兰特和克里斯-穆雷

懂球帝
2026-06-30 04:46:05
2026-06-30 12:27:00
IT乐知
IT乐知
it乐知· 程序员的私房笔记
122文章数 1038关注度
往期回顾 全部

科技要闻

DeepSeek V4正式版要来 高峰期API价格翻倍

头条要闻

牛弹琴:韩国对男足耻辱出局激烈反应 全世界震惊不已

头条要闻

牛弹琴:韩国对男足耻辱出局激烈反应 全世界震惊不已

体育要闻

日本众将掩面痛哭 连续3届先破门却被逆转

娱乐要闻

韩红称要退出公益,多位名人挽留

财经要闻

韩国万亿"芯"基建:存储能否成AI时代油田

汽车要闻

谁懂啊家人们!爹味和班味一点都没,这台底盘最硬国产大猎装太上头!

态度原创

房产
家居
教育
亲子
军事航空

房产要闻

56.8亿!三亚突然开始疯狂卖地!

家居要闻

传奇筑 日常诗

教育要闻

5秒钟搞定一道中考几何题

亲子要闻

全力“迎战”暑期就医高峰 深儿医龙华院区开启“超能模式”

军事要闻

普京最新发声:俄罗斯正处于命运攸关之际

无障碍浏览 进入关怀版