Mybatis中$和#取数据的区别

Posted free time

tags:

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

Mybatis配置中,取出map入参的数据一般有两种方式#{key}${key}下面是这两种取值的区别:

  以同样的语句做对比:

<select id="geUserByParam1" resultType="Map" parameterType="Map">
        select * from t_user t where t.name=#{name} and t.password=#{password}
</select>
<select id="geUserByParam2" resultType="Map" parameterType="Map">
        select * from t_user t where t.name=${name} and t.password=${password}
</select>

  如果传入的name和password参数分别是:admin和123456。

#{key}取值后执行的sql是select * from t_user t where t.name=‘admin‘ and t.password=‘123456‘

${key}取值后执行的sql是select * from t_user t where t.name=admin and t.password=123456

很明显,#{key}取值会自动将值看成是字符串类型,并带上单引号;而${key}取值就是传的值是啥就是啥。由此可见#{key}取值可以防止sql注入,而${key}取值可能会引起sql注入情况。有的时候用模糊查询可能会用到${key}取值,比如:

 

<select id="geUserByParam3" resultType="Map" parameterType="Map">
        select * from t_user t where t.name like ‘%${name}%‘
</select>

 

其实这种情况也可以用#{key}来代替的:

<select id="geUserByParam3" resultType="Map" parameterType="Map">
        select * from t_user t where t.name like concat(‘%‘,#{name},‘%‘)
</select>

因此建议尽量在开发中用#{key}取值,这样确实可以避免一些问题!

 

注意:本文仅代表个人理解和看法哟!和本人所在公司和团体无任何关系!

 

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

数据库框架mybatis使用order by 动态参数及#{}和${}的区别

hibernate 和 mybatis 区别

mybatis javaType 和 jdbcType 区别

ios block和delegate的区别

mybatis中的#和$的区别

mybatis和ibatis的区别