zoukankan      html  css  js  c++  java
  • mybatis中$和#有什么区别?为什么?

    1.Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${}
    我们经常使用的是#{},是因为这种方式可以防止SQL注入,#{}这种方式SQL语句是经过预编译的,它把#{}中间的参数转义成字符串。
    比如:
    select * from table where name = #{zhangSan}
    预编译后,会动态解析成一个参数标记符?:
    select * from table where name = ?
    而使用${}在动态解析时候,会传入参数字符串
    select * from table where name = ${zhangSan} 
    动态解析时候,会传入参数字符串
    select * from table where name = 'zhangSan'
    总结:
    #{} 这种取值是编译好SQL语句再取值     即    #{}:动态解析 -> 预编译 -> 执行
    ${} 这种是取值以后再去编译SQL语句     即    ${}:动态解析 -> 编译 -> 执行
    #传入的参数在SQL中显示为字符串(当成一个字符串),会对自动传入的数据加一个双引号。
    $传入的参数在SqL中直接显示为传入的值
    ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。
     

    2、#可以防止SQL注入的风险(语句的拼接);但$无法防止Sql注入。

    3、$方式一般用于传入数据库对象,例如传入表名。

    4、大多数情况下还是经常使用#,一般能用#的就别用$;但有些情况下必须使用$,例:MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。

  • 相关阅读:
    565. Array Nesting
    796. Rotate String
    817. Linked List Components
    696. Count Binary Substrings
    SQL语句优化
    java7增强的try语句关闭资源
    java新手自己实现的计算器,有点乱
    java数组
    java创建不存在路径的文件
    class.forName
  • 原文地址:https://www.cnblogs.com/cdlyy/p/12749199.html
Copyright © 2011-2022 走看看