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中${}与#{}的区别,以及应用场景的主要内容,如果未能解决你的问题,请参考以下文章

hibernate与mybatis的区别和应用场景

2016.5.28 Mybatis 框架 Hilbernate 与Mybatis 本质区别和应用场景

深入浅出MyBatis:MyBatis与Spring集成及实用场景

mybatis 和 hibernate 本质区别和应用场景

Hibernate 与 mybatis 区别

hibernate与mybatis的区别