yangna123的gravatar头像
yangna1232019-06-03 14:05:19

菜鸟问题:Mybatis中#{}和#{}有什么区别?最好举例说明下

问题描述

select * from table1 where column = #{param}

select * from table1 where column = ${param}

有什么区别?最近g刚学Mybatis遇到的。

所有回答列表(7)
kai1008的gravatar头像
kai1008 LV96月4日

第一种:select * from table1 where column = ?

第二种:select * from table1 where column = ‘你’

java小不点的gravatar头像
java小不点 LV106月4日

#{}和${}都是用来动态传递参数,区别在于比如说动态传入表名时

select * from #{user}

则相当于

select  * from 'user'

select * from ${user}

相当于

select  from user

简单来说传入String类型的数据时用#{},当传表名或者列名时用${}

 

has gone的gravatar头像
has gone LV56月4日

#{}是占位符,相当于原来的?

如果是对象类型,解析要符合ognl表达式

可以进行JavaType与jdbcType的自动转换

可以防止sql注入

${}是原封不动的字符串拼接

如:select * from user where username like '%${username}%'

拼接结果:select * from user where username like '%王%'

如果是对象类型,解析要符合ognl表达式

不能进行JavaType与jdbcType的自动转换

不能防止sql注入。

除了模糊查询建议都使用#{}。

最代码人间蒸发的gravatar头像
最代码人间蒸发 LV136月5日

楼上正解!!!

matintalorr的gravatar头像
matintalorr LV86月6日

1.优先使用#{paramName,jdbcType=VARCHAR} 写法,除了可以防止sql注入以外,它还能在参数里含有单引号的时候自动转义,

而${paramName}由于是类似于拼接sql的写法,不具备此功能。

2.注意,使用 #{paramName,jdbcType=VARCHAR} 写法的时候,模糊查询的写法为:'%'||#{paramName,jdbcType=VARCHAR}||'%'

TomMother的gravatar头像
TomMother LV66月13日

  #{} 和 ${} 在预编译中的处理是不一样的。#{} 在预处理时,会把参数部分用一个占位符 ? 代替,变成如下的 sql 语句:

select * from user where name = ?;

而 ${} 则只是简单的字符串替换,在动态解析阶段,该 sql 语句会被解析成

select * from user where name = 'zhangsan';
liyunfei456的gravatar头像
liyunfei456 LV26月26日

1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'.

 2 $是将传入的数据直接显示生成sql语句,eg:select id,name,age from student where id =${id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1.

 3 使用#可以很大程度上防止sql注入。(语句的拼接)

 4 但是如果使用在order by 中就需要使用 $.

 5 在大多数情况下还是经常使用#,但在不同情况下必须使用$. 

相关问答
    最近浏览
    tracy_lee LV13昨天
    月亮月亮月亮星星
    liangxiang LV67月17日
    月亮星星星星
    12555555 LV57月16日
    月亮星星
    yangdong LV127月15日
    月亮月亮月亮
    1105570390 LV67月12日
    月亮星星星星
    最美不过爱人 LV17月11日
    星星
    6358137147月10日
    暂无贡献等级
    renkai721 LV47月9日
    月亮
    zuimao LV27月9日
    星星星星
    顶部客服微信二维码底部
    >扫描二维码关注最代码为好友扫描二维码关注最代码为好友