zoukankan      html  css  js  c++  java
  • 分析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进去,所以就避免了注入
    }
     
  • 相关阅读:
    ELK 一些截图
    AD域
    NPOI
    搭建harbor
    【【【【日常问题记录】】】】
    golang yaml配置文件解析
    golang操作mysql使用总结
    【转】mysql优化步骤
    【转】Mysql事务,并发问题,锁机制
    golang curl
  • 原文地址:https://www.cnblogs.com/fsqsec/p/11461372.html
Copyright © 2011-2022 走看看