分析mybatis中 #{} 和${}的区别

分析方法:

在 GenericTokenParser这个类的parse方法的这一行下个断点调试一下就明白了  

builder.append(handler.handleToken(content));

#{} 和${}采用不同的handler来处理。

${}处理如下:
@Override
public String handleToken(String content) {
Object parameter = context.getBindings().get("_parameter");
if (parameter == null) {
context.getBindings().put("value", null);
} else if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) {
context.getBindings().put("value", parameter);
}
Object value = OgnlCache.getValue(content, context.getBindings()); 这里获取到到用户输入的参数值直接拼接到SQL里
String srtValue = (value == null ? "" : String.valueOf(value)); // issue #274 return "" instead of "null"
checkInjection(srtValue);
return srtValue;
}

#{} 的处理如下:
@Override
public String handleToken(String content) {
parameterMappings.add(buildParameterMapping(content));
return "?"; 返回个问号拼接到SQL里,问号的值后边set进去,所以就避免了注入
}
 
posted @   范世强  阅读(397)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2016-09-04 小米范工具系列之十四:小米范网站批量爬虫工具
点击右上角即可分享
微信分享提示