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 动态参数时需要注意,用$而不是#。

  • 相关阅读:
    JQuery文档插件
    MVC3下使用Jquery异步提交数据!
    不错的在线客服插件~
    让火狐和chorme浏览器支持uploadify带Cookie上传
    Socket服务器代码
    Winform控件加载时闪烁的解决方案!
    MVC3 无刷新验证码
    网络时间同步
    关于多线程委托的控件操作
    c# 利用反射动态给实体类对象赋值
  • 原文地址:https://www.cnblogs.com/cdlyy/p/12749199.html
Copyright © 2011-2022 走看看