mybatis $和#

Posted king西阳

tags:

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

1. $

  将传入的数据直接显示生成在sql中,不会修改或转义字符串。如:order by $id$,如果传入的值是111,那么解析成sql时的值为order by 111,  如果传入的值是id,则解析成的sql为order by id.所以$方式一定程度上无法防止Sql注入。  

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

  mybatis排序时使用order by,其后面的动态参数也应使用$,但一般不建议这样使用,会存在潜在的sql注入风险。

  ${}等效$$,不会修改或转义字符串,类似以下执行:

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

 

2. #

  将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".相对使用$方式能够很大程度防止sql注入。

  #{}等效##,这样使用的sql能够预编译,能在内存中保存sql语法,不用重新组装sql语法,类似以下执行:

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

一般情况下,建议能用#的就别用$。

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

mybatis学习(39):动态sql片段

mybatis动态sql片段与分页,排序,传参的使用

MyBatis动态SQL标签用法

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

mybatis动态sql之利用sql标签抽取可重用的sql片段

[mybatis]动态sql_sql_抽取可重用的sql片段