在mybatis接口mapper文件中引用传入的参数是通过#{param}或者${param}来使用的。

1.数据类型匹配

#:<mark>会进行预编译,而且进行类型匹配</mark>

$:<mark>不进行数据类型匹配</mark>

2.实现方式

#:用于<mark>变量替换</mark>

$:实质上是<mark>字符串拼接</mark>

3. # 和 $ 的使用场景

  • 变量的传递
    <mark>必须使用#</mark>,使用#{}就等于使用了PrepareStatement这种占位符的形式,提高效率。
    <mark>可以防止sql注入等等问题。</mark>
    #方式一般用于传入<mark>添加</mark>,<mark>修改</mark>的值或<mark>查询</mark>,<mark>删除</mark>的where条件 id值
    select * from t_user where name = #{param}

  • $只是只是简单的字符串拼接,
    <mark>要特别小心sql注入问题</mark>,
    <mark>对应非变量部分,只能用$。</mark>
    <mark>$方式一般用于传入数据库对象,</mark>
    比如这种
    group by 字段 ,
    order by 字段,
    表名,
    字段名

    <mark>没法使用占位符的就需要使用${}</mark>
    select count(*), from t_user group by ${param}

  • 能同时使用 #$ 的时候,最好用 #