zoukankan      html  css  js  c++  java
  • Mybatis中$和#取数据的区别

    Mybatis配置中,取出map入参的数据一般有两种方式#{key}${key}下面是这两种取值的区别:

      以同样的语句做对比:

    <select id="geUserByParam1" resultType="Map" parameterType="Map">
            select * from t_user t where t.name=#{name} and t.password=#{password}
    </select>
    <select id="geUserByParam2" resultType="Map" parameterType="Map">
            select * from t_user t where t.name=${name} and t.password=${password}
    </select>

      如果传入的name和password参数分别是:admin和123456。

    #{key}取值后执行的sql是select * from t_user t where t.name='admin' and t.password='123456'

    ${key}取值后执行的sql是select * from t_user t where t.name=admin and t.password=123456

    很明显,#{key}取值会自动将值看成是字符串类型,并带上单引号;而${key}取值就是传的值是啥就是啥。由此可见#{key}取值可以防止sql注入,而${key}取值可能会引起sql注入情况。有的时候用模糊查询可能会用到${key}取值,比如:

    <select id="geUserByParam3" resultType="Map" parameterType="Map">
            select * from t_user t where t.name like '%${name}%'
    </select>

    其实这种情况也可以用#{key}来代替的:

    <select id="geUserByParam3" resultType="Map" parameterType="Map">
            select * from t_user t where t.name like concat('%',#{name},'%')
    </select>

    因此建议尽量在开发中用#{key}取值,这样确实可以避免一些问题!

    注意:本文仅代表个人理解和看法哟!和本人所在公司和团体无任何关系!

  • 相关阅读:
    GO語言基礎教程:數組,切片,map
    GO語言視頻教程下載
    GO語言基礎教程:流程控制
    GO語言基礎教程:數據類型,變量,常量
    GO語言基礎教程:Hello world!
    GO語言基礎教程:序章
    騰訊RTX的API開發,給RTX開個天窗
    RTX的api開發實例
    [轉]redis;mongodb;memcache三者的性能比較
    [轉載]史上最强php生成pdf文件,html转pdf文件方法
  • 原文地址:https://www.cnblogs.com/wy697495/p/9752087.html
Copyright © 2011-2022 走看看