zoukankan      html  css  js  c++  java
  • Mybatis 中在传参时,${} 和#{} 的区别

    • 介绍

        MyBatis中使用parameterType向SQL语句传参,parameterType后的类型可以是基本类型int,String,HashMap和java自定义类型。

        在SQL中引用这些参数的时候,可以使用两种方式#{parameterName}或者${parameterName}。

    • #{}

        #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。

          例如:order by #{parameterName} //或取Map中的value#{Key}也是一样操作。

          假设传入参数是“Smith”

          会解析成:order by "Smith"

    • ${} 

        $将传入的数据直接显示生成在sql中。

          例如:order by #{parameterName} //或取Map中的value#{Key}也是一样操作。

          假设传入参数是“Smith”

          会解析成:order by Smith

    • 概念
    1. #方式能够很大程度防止sql注入,$方式无法防止Sql注入。
    2. $方式一般用于传入数据库对象,例如传入表名。
    3. 从安全性上考虑,能使用#尽量使用#来传参,因为这样可以有效防止SQL注入的问题。
    • 重点

       MyBatis排序时使用order by 动态参数时需要注意,用$而不是#!

        例如:ORDER BY ${columnName} //这里MyBatis不会修改或转义字符串,可实现动态传入排序。

        建议:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。

           这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

        附加:Map传入判断条件进行动态排序

      <!-- 
            假设:
            Map<String,Object> map=new HashMap<String,Object>();
            map.put("turn","c.ordinaryPrice"); //以商品的普通价格排序
        -->
        <select id="" parameterType="Map"    resultType="com.entity.Commodity" >
            SELECT *
            FROM commodity c 
            where 1=1  
                 <!-- _parameter.containsKey('键') 作用:判断键是否存在返回值boolean  #{键}取对应的值   !必须三处键值对应,否则取不到值-->
                 <if test="_parameter.containsKey('varietyID')"> 
                    ORDER BY ${turn}
                 </if>
        </select>
  • 相关阅读:
    纯JS实现中国行政区域上下联动选择地址
    java解析中国行政区域并在页面显示实现动态逐级筛选
    使用HttpClient 发送get、post请求,及其解析xml返回数据
    JS实现动态提示文本框可输入剩余字数(类似发表微博数字提示)
    webApi 数据绑定 获取
    EF Code First 常用命令
    [解决WebClient或HttpWebRequest首次连接缓慢问题]
    【转】Entity Framework技术系列之7:LINQ to Entities
    Ajax方法提交整个表单的信息
    【转】MVC中处理Json和JS中处理Json对象
  • 原文地址:https://www.cnblogs.com/wkrbky/p/5869703.html
Copyright © 2011-2022 走看看