分析mybatis中 #{} 和${}的區別

分析方法:app

在 GenericTokenParser這個類的parse方法的這一行下個斷點調試一下就明白了  ide

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;
}

#{} 的處理以下:
@Overridepublic String handleToken(String content) {  parameterMappings.add(buildParameterMapping(content));  return "?";   返回個問號拼接到SQL裏,問號的值後邊set進去,因此就避免了注入}
相關文章
相關標籤/搜索