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

     

    1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
    如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username=”111″, 如果传入的值是id,则解析成的sql为where username=”id”.
    2、$将传入的数据直接显示生成在sql中。
    如:where username=${username},如果传入的值是111,那么解析成sql时的值为where username=111;
    如果传入的值是;drop table user;,则解析成的sql为:select id, username, password, role from user where username=;drop table user;
    3、#方式能够很大程度防止sql注入,$方式无法防止Sql注入。
    4、$方式一般用于传入数据库对象,例如传入表名.
    5、一般能用#的就别用$,若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。
    6、在MyBatis中,“${xxx}”这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。
    ========================================================
     
    1.${}模糊查询存在SQL注入的例子:(${}未编译,只是对其进行拼接,相当于Statement)
    2.bind + #{} 模糊查询 防止SQL注入 (#{}进行预编译,传递的参数不进行编译,只作为参数,相当于PreparedStatement)
     
     
    在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。
    #{}:相当于JDBC中的PreparedStatement
    ${}:是输出变量的值
    简单说,#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。
    =========================================================
     
    ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。
     
    #{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,比如ps.setInt(0, parameterValue),#{item.name}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于param.getItem().getName()。
    ======================================
    动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现
    select * from user where name = #{name};
    #{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:
    select * from user where name = ?;
     
    那么我们使用 ${}的时候
    select * from user where name = ${name};
    ${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句
    select * from user where name = “dato”;
    预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。
    综上所得, ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS (数据库管理系统)中。
    这是 #{} 和 ${} 我们能看到的主要的区别,除此之外,还有以下区别:
    • #方式能够很大程度防止sql注入。
    • $方式无法防止Sql注入。
    • $方式一般用于传入数据库对象,例如传入表名
    • 一般能用#的就别用$.
    所以我们在使用mybatis的时候,尽量的使用#方式!!!这是大家要注意的地方
    ============================================================
     
    【结论】在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。
  • 相关阅读:
    ASP.NET在禁用视图状态的情况下仍然使用ViewState对象【转】
    Atcoder Regular Contest 061 D Card Game for Three(组合数学)
    Solution 「CERC 2016」「洛谷 P3684」机棚障碍
    Solution 「CF 599E」Sandy and Nuts
    Solution 「洛谷 P6021」洪水
    Solution 「ARC 058C」「AT 1975」Iroha and Haiku
    Solution 「POI 2011」「洛谷 P3527」METMeteors
    Solution 「CF 1023F」Mobile Phone Network
    Solution 「SP 6779」GSS7
    Solution 「LOCAL」大括号树
  • 原文地址:https://www.cnblogs.com/weigy/p/12313298.html
Copyright © 2011-2022 走看看