模糊搜索 Mybatis里$与#的区别

88 阅读1分钟

模糊搜索 Mybatis里$与#的区别 #占位符的特点

  1. MyBatis处理 #{ } 占位符,使用的 JDBC 对象是PreparedStatement 对象,执行sql语句的效率更高。

  2. 使用PreparedStatement 对象,能够避免 sql 注入;使得sql语句的执行更加安全。

  3. #{ } 常常作为列值使用;位于sql语句中等号的右侧;#{ } 位置的值与数据类型是相关的。 $占位符的特点

  4. MyBatis处理 ${ } 占位符,使用的 JDBC 对象是 Statement 对象,执行sql语句的效率相对于 #{ } 占位符要更低。

  5. ${ } 占位符的值,使用的是字符串连接的方式,有 sql 注入的风险,同时也存在代码安全的问题。

  6. ${ } 占位符中的数据是原模原样的,不会区分数据类型。

  7. 占位符常用作表名或列名;这里推荐在能保证数据安全的情况下使用{ } 占位符常用作表名或列名;这里推荐在能保证数据安全的情况下使用 { }。

#和两者含义不同 #会把传入的数据都当成一个字符串来处理,会在传入的数据上面加一个双引号来处理。 而则是把传入的数据直接显示在sql语句中,不会添加双引号。

两者的实现方式不同 (1)$作用相等于是字符串拼接

(2)#作用相当于变量值替换

#和使用场景不同 (1)在sql语句中,如果要接收传递过来的变量的值的话,必须使用#。因为使用#是通过PreparedStement接口来操作,可以防止sql注入,并且在多次执行sql语句时可以提高效率。 (2)只是简单的字符串拼接而已,所以要特别小心sql注入问题。对于sql语句中非变量部分,那就可以使用,比如,比如方式一般用于传入数据库对象(如传入表名)。 (3)如果在sql语句中能同时使用#和$的时候,最好使用#。