- 动态 sql 是 MyBatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 MyBatis 会对其进行动态解析。MyBatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}。
- ${}是字符串替换。MyBatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。
- #{}是预编译处理,MyBatis在处理#{}时,会将SQL中的#{}替换为?号,使用预处理 PreparedStatement 的set方法来赋值。使用 #{} 可以有效的防止SQL注入,提高系统安全性。
示例
<select id="findUserById" resultType="com.example.demo.model.User">
select id,name,email
from userinfo where id ='${id}'
</select>
示例
<select id="findUserById" resultType="com.example.demo.model.User">
select id,name,email
from userinfo where id ='#{id}'
</select>
- concat() 是Mysql中的内置函数,主要用于拼接字符串,在 Mybatis 中主要用于解决模糊查询(LIKE)语句的字符无法预处理的问题
- 例如以下语句中,预编译后SQL变成 select * from userinfo where username like '%'usernane'%'
示例
select id="findUserByName" resultType="com.example.demo.model.User">
select * from userinfo where username like '%#{username}%';
</select>
- 因此需要使用 concat() 分别对字符串拼接处理,防止字符串被加上引号
示例
select id="findUserByName" resultType="com.example.demo.model.User">
select * from userinfo where username like concat('%',#{username},'%');
</select>
注
在某些特殊场合下只能用${},不能用#{}。例如:在使用排序时 ORDER BY ${id},如果使用#{id},则会被解析成ORDER BY “id”,这显然是一种错误的写法。