mybatis中的#{}和${}区别

Posted zxf160

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis中的#{}和${}区别相关的知识,希望对你有一定的参考价值。

一、总结:

     #{ }:占位符,防止sql注入

     ${ }:sql拼接符号

 

二、分析:

    动态sql是mybatis的强大的特性之一。mybatis在对sql语句进行预编译之前会对sql进行动态解析,解析为一个BoundSql对象,也是在此处对动态SQL进行处理。

    在动态SQL解析中,#{ }和${ }不同:

    #{ }解析为JDBC预编译语句(PreparedStatement)的参数标记符

    例如:

  1. select * from user where name = #{name}  

三、使用

      1、能使用#{ } 不使用${ }

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

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

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

字符串替换

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}

这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

mybatis本身的说明:

  1. String Substitution
  2. By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this:
  3. ORDER BY ${columnName}
  4. Here MyBatis won‘t modify or escape the string.
  5. NOTE It‘s not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or always perform your own escapes and checks.



 

1. 使用#{}格式的语法在mybatis中使用Preparement语句来安全的设置值,执行sql类似下面的:

  1. 1
  2. 2
  3. PreparedStatement ps = conn.prepareStatement(sql);
  4. ps.setInt(1,id);

 

这样做的好处是:更安全,更迅速,通常也是首选做法。

2. 不过有时你只是想直接在 SQL 语句中插入一个不改变的字符串。比如,像 ORDER BY,你可以这样来使用:

  1. 1
  2. ORDER BY ${columnName}

 

此时MyBatis 不会修改或转义字符串。

这种方式类似于:

 

    1. Statement st = conn.createStatement();
    2. ResultSet rs = st.executeQuery(sql);



以上是关于mybatis中的#{}和${}区别的主要内容,如果未能解决你的问题,请参考以下文章

关于mybatis中的#{},和${} 的区别

mybatis中的#{}和${}区别

Mybatis中的#{}和${}的区别?

mybatis中的#和$的区别?

mybatis中的#和$的区别

Mybatis中的 # 和 $ 的区别