在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 动态参数时需要注意,用$而不是#

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐