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

    他们之间的区别用最直接的话来说就是:#相当于对数据 加上 双引号,$相当于直接显示数据。

    1、#对传入的参数视为字符串,也就是它会预编译,select * from user where name = #{name},比如我传一个csdn,那么传过来就是 select * from user where name = 'csdn';

    2、$将不会将传入的值进行预编译,select * from user where name=${name},比如我穿一个csdn,那么传过来就是 select * from user where name=csdn;

    3、#的优势就在于它能很大程度的防止sql注入,而$则不行。比如:用户进行一个登录操作,后台sql验证式样的:select * from user where username=#{name} and password = #{pwd},如果前台传来的用户名是“wang”,密码是 “1 or 1=1”,用#的方式就不会出现sql注入,而如果换成$方式,sql语句就变成了 select * from user where username=wang and password = 1 or 1=1。这样的话就形成了sql注入。

    4、MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

    字符串替换
    默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
    ORDER BY ${columnName}
    这里MyBatis不会修改或转义字符串。

    重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

    ——转载自:https://blog.csdn.net/qq_24916847/article/details/83501199

    今天MyBatis的用动态SQL做一个带不同条件的排序功能,一直没有注意到#{}与${}的问题,今天终于遇到了。SQL语句如下:

    select * from goods 

    <if test="orderArgs!=null">

        order by #{orderArgs}

    </if>

    结果没有任何效果。最后把 #{} 改成 ${},结果正确。

    此时才发现#{}与${}的不同之处。

    动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现。
    select * from goods order by  #{orderArgs}; 
    #{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

    select * from goods order by ?;  #{}在代入参数时,自动在参数前后加上字符串,最终形成的SQL语句就成了:

    select * from goods order by "price",参数本来是列名,现在变成了一个字符串,结果自然不正确了。

    那么我们使用 ${}的时候

    select * from goods order by ${orderArgs}; 

    ${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句
    selecxt * from goods order by price
    预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了,加了双引号,参数变成了一个字符串。
    综上所得, ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。


    这是 #{} 和 ${} 我们能看到的主要的区别,除此之外,还有以下区别:
    #方式能够很大程度防止sql注入。
    $方式无法防止Sql注入。
    $方式一般用于传入数据库对象,例如传入表名.
    一般能用#的就别用$.
    所以我们在使用mybatis的时候,尽量的使用#方式!!!这是大家要注意的地方。

    ——转载自:https://blog.csdn.net/dange_h/article/details/79196451

  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/scorates/p/11185353.html
Copyright © 2011-2022 走看看