动态 sql 是 MyBatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 MyBatis 会对其进行动态解析。MyBatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}。
#{}和${}有什么区别?
#{}:
#{}是预编译处理,实现的是sql语句的预处理参数,Mybatis在处理#{}时,会将sql中的#{}替换为 ? 号,调用PreparedStatement的set方法赋值;使用时不需要关注数据类型,Mybatis自动实现数据类型的转换,并且可以防止SQL注入,提高系统的安全性;
- #{}中表示输入的参数名称,如果输入参数是简单类型,那么#{}中的参数可以任意
@Select("SELECT * FROM student WHERe username = #{username} AND PASSWORD = #{password}")
- Mabatis中模糊查询防止sql注入
@Select("<script>SELECT * FROM student" +
"<where>" +
"<if test=\"username!=null and username!=''\">" +
"and username like #{username}</if>" +
"</where></script>")
${}:
${}是字符串替换,${}将传入的数据直接显示生成在sql中。
${}实现的是sql语句的直接拼接,不做数据类型转换,需要自行判断数据类型;
${}存在sql注入的风险,但是在特殊场景下必须使用${},比如order by 语句后面要跟动态列,
查询条件是固定的,此时只能使用${}方式进行字符串拼接
${value}:${}中value表示输入的参数名称,如果输入的参数是简单
类型,那么${}中的值只能是value。
Mybatis在处理${}时,就会把${}替换成变量的值。
如果使用${},而传入的是字符串,就必须这样写:'${}',
不然会报 Unknown column 'TT' in 'where clause' 的错误