mybatis中#{}与${}的区别以及模糊查询

动态 sql 是 MyBatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 MyBatis 会对其进行动态解析。MyBatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}。

#{}和${}的区别

(1) #{}是预编译处理动态解析之后会将传入的变量加上双引号,$ {}是字符串替换不会加双引号。

(2) MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用PreparedStatement的set方法来赋值;MyBatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。

(3) 使用 #{} 可以有效的防止SQL注入,提高系统安全性。

(4) 使用Preparedstatement的预编译机制。预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。而预编译机制则可以很好的防止SQL注入。在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。


<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE password = #{password}
</select>

假如传入密码为123456,在解析时就会解析成SELECT id,name,password FROM user WHERE password = “123456”(带双引号)

<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE password = ${password}
</select>

假如传入密码为123456,在解析时就会解析成SELECT id,name,password FROM user WHERE password = 123456(不带双引号)

使用mysql中mybatis的模糊查询

千万千万不要写成

<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE name LIKE "%#{password}%" 
</select>

因为动态解析完之后数据库得到的sql是这样的 SELECT id,name,password FROM user WHERE name LIKE “%“小”%”,毫无疑问这样的sql语句肯定是错误的。

下面这才是正确的写法:

<select id="selectUser" parameterType="int" resultType="user">
  SELECT id,name,password FROM user WHERE name LIKE concat("%",${password},"%") 
</select>

假如传入name为 ,在动态解析之后会变成 SELECT id,name,password FROM user WHERE name LIKE “%小%”,会将数据库中名字中包含 的信息查询出来

concat函数

CONCAT(字串1, 字串2, 字串3, …): 将字串1、字串2、字串3,等字串连在一起。

参考文章:https://www.cnblogs.com/liaowenhui/p/12217959.html

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值