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

  • 相关阅读:
    基于SPA的网页授权流程(微信OAuth2)
    用CSS3制作尖角标签按钮样式
    关于WebAPI跨域踩到的一点坑
    .net webapi跨域方法整理
    使用 JavaScript 截屏
    关于anguar2微信支付问题
    sql操作语句
    mysql5.7初始化密码报错 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before
    linux上安装mysql5.7
    git 常用命令
  • 原文地址:https://www.cnblogs.com/scorates/p/11185353.html
Copyright © 2011-2022 走看看