分析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进去,所以就避免了注入
}