字符串预处理 ${ }、#{ } 和concat()

Exisi 2021-03-27 07:29:38
Categories: Tags:
  • 动态 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”,这显然是一种错误的写法。