mybatis中${}与#{}的区别,以及应用场景
Posted 永旗狍子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 动态参数时需要注意,用$而不是#
以上是关于mybatis中${}与#{}的区别,以及应用场景的主要内容,如果未能解决你的问题,请参考以下文章
2016.5.28 Mybatis 框架 Hilbernate 与Mybatis 本质区别和应用场景