Mybatis映射文件配置中$和#的区别

在配置Mybatis映射文件mapper的时候,使用parameterType向SQL语句传参,会发现引入参数的时候用到了#和$这两个符号,那么#和$到底有什么区别呢?

当使用#{parameterName}引入参数的时候,Mybatis会把这个参数认为是一个字符串,在拼接SQL的时候其实首先是一个问号(?),然后查询的时候,将参数引入到问号(?)之中。比如,select * from emp where name = #{name},这样的一个SQL,解析以后是select * from emp where name = ?,由于是#{name}的方式引入,那么就将问号(?)替换成#{name}的值,比如传进一个字符串"yedward",那么最终的查询SQL是select * from emp where name = 'yedward'。

当使用${parameterName}引入参数的时候,Mybatis会将这个参数直接拼到SQL中去,就没有上面那种问号(?)。比如,select * from emp #{whereClause},此时如果#{whereClause}传入的是"where name = 'yedward'",那么就直接将这个拼接上去,为:select * from emp where name = 'yedward'。

结合起来看一个例子:

映射文件中配置的SQL如下:

select * from emp where age < #{age} 
<if test="orderByClause != null">
    order by ${orderByClause}
</if>

假设age = 18, orderByClause = "empid"。

那么,通过log4j打印出来的SQL是:select * from emp where age < ? order by empid。

如果将映射文件修改为下面这样:

select * from emp where age < #{age} 
<if test="orderByClause != null">
    order by #{orderByClause}
</if>

那么,通过log4j打印出来的SQL是:select * from emp where age < ? order by ?,并且由于#会传进一个字符串,运行的时候select * from emp where age < '18' order by 'empid',这样运行的时候更会报错。

还有下面这样一个例子:

Mybatis Mapper示例

图1:Mybatis Mapper示例

所以,对于什么时候用#,什么时候用$,如上图1所示,我觉的在直接拼接规则的时候可以用$,规则已经有了,只是传递参数进去,那么可以用#。

本文标题:Mybatis映射文件配置中$和#的区别

本文链接:http://yedward.net/?id=234

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章