mybatis中${}与#{}的区别,以及应用场景

在MyBatis 的映射配置文件中,动态传递参数有两种方式:

总结:

 

(1)${} 拼接符     动态解析 -> 编译 -> 执行      变量替换后,${} 对应的变量不会加上单引号 ''             使用 ${} 时,要注意何时加或不加单引号,即 ${} 和 '${}'

(2)#{} 占位符  动态解析 -> 预编译 -> 执行      变量替换后,#{} 对应的变量自动加上单引号 ''

1. ${}相当于直接显示数据,预编译的时候表示拼接sql字符串。

${attribute} 属于字符串拼接SQL,而非预编译占位符,会有注入攻击问题,不建议在常规SQL中使用,常用于可解决动态生降序问题。

public List<User> selectAllUsers1(User user); // ${name} ${id} 可获取user中的属性值
public List<User> selectAllUsers2(@Param("rule") String rule); //必须使用@Param否则会作为属性解析
<select id="selectAllUsers1" resultType="user">
	SELECT * FROM t_users 
    WHERE name = '${name}' or id = ${id} <!-- 拼接name和id,如果是字符类型需要用单引号:'${name}' -->
</select>
<select id="selectAllUsers2" resultType="user">
	SELECT * FROM t_users 
  	ORDER BY id ${rule} <!-- 拼接 asc | desc -->
</select>

2.#{}相当于对数据加上双引号,预编译的时候表示一个占位符号(?)。

如图所示:预编译后,会动态解析成一个参数标记符?

总结:

  • #{} 这种取值是编译好SQL语句再取值
  • ${} 这种是取值以后再去编译SQL语句

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值