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

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

问题描述

select * from table1 where column = #{param}

select * from table1 where column = ${param}

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

所有回答列表(7)
kai1008的gravatar头像
kai1008  LV9 2019年6月4日

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

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

java小不点的gravatar头像
java小不点  LV10 2019年6月4日

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

select * from #{user}

则相当于

select  * from 'user'

select * from ${user}

相当于

select  from user

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

 

has gone的gravatar头像
has gone  LV6 2019年6月4日

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

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

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

可以防止sql注入

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

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

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

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

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

不能防止sql注入。

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

人间蒸发的gravatar头像
人间蒸发  LV23 2019年6月5日

楼上正解!!!

matintalorr的gravatar头像
matintalorr  LV10 2019年6月6日

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

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

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

TomMother的gravatar头像
TomMother  LV7 2019年6月13日

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

select * from user where name = ?;

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

select * from user where name = 'zhangsan';
liyunfei456的gravatar头像
liyunfei456  LV2 2019年6月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 在大多数情况下还是经常使用#,但在不同情况下必须使用$. 

相关问答
最近浏览
不会码代码的椰子  LV2 2022年2月21日
bubu31313 2021年8月20日
暂无贡献等级
迷茫的菜鸟 2021年7月16日
暂无贡献等级
明光aabb 2021年7月5日
暂无贡献等级
hyghyg  LV2 2021年3月28日
Kirstwe  LV1 2020年12月9日
759985221  LV8 2020年10月27日
g602270944  LV9 2020年6月16日
一个爱吃黄瓜的人 2020年5月14日
暂无贡献等级
未知错误  LV5 2020年4月16日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友