zoukankan      html  css  js  c++  java
  • mybatis中#{}和${}的区别

    mybatis本身的说明:

    String Substitution
    
    By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this:
    
    ORDER BY ${columnName}
    Here MyBatis won't modify or escape the string.
    
    NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or always perform your own escapes and checks.

    从上文可以看出:

    1. 使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值,执行sql类似下面的:

    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setInt(1,id);

    这样做的好处是:更安全,更迅速,通常也是首选做法。

    2. 不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:

    ORDER BY ${columnName}

    此时MyBatis 不会修改或转义字符串。

    这种方式类似于:

        Statement st = conn.createStatement();
           
          ResultSet rs = st.executeQuery(sql);

    这种方式的缺点是: 以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的 SQL 注入攻击,因此要么不允许用户输入这些字段,要么自行转义并检验。

    参考文献:

    【1】http://mybatis.github.io/mybatis-3/sqlmap-xml.html

    【2】https://mybatis.github.io/mybatis-3/zh/sqlmap-xml.html


    作者:Kei
    出处:http://www.cnblogs.com/ikei/
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

     
  • 相关阅读:
    [你必须知道的.NET]第二十五回:认识元数据和IL(中)
    [技术速递]体验微软开源范例Oxite
    一本去繁存精的设计书《C# 3.0设计模式》
    [你必须知道的.NET]第二十四回:认识元数据和IL(上)
    泛型KMP算法
    实现语音视频录制(demo源码)
    AutoResetEvent 的诡异行为
    调用非托管dll常出现的bug及解决办法
    如何实现离线文件?
    广播与P2P通道(上) 问题与方案
  • 原文地址:https://www.cnblogs.com/ikei/p/7212507.html
Copyright © 2011-2022 走看看