在mybatis中,会将开发者定义的sql进行解析,解析分为了2类sql:
静态sql ,在解析时,直接将参数拼接到sql中,这种就是静态sql
动态sql,在解析时,会使用?这个占位符,替代参数
这两种解析方式,mybatis是根据${}和#{}进行区分的
${}的sql是静态sql
#{}的sql是动态sql
不论是静态sql,还是动态sql都能获取传递参数,但是${}是使用的字符拼接,#{}使用PreparedStatement进行参数的预处理。
在一定程度上说,${}能实现的功能,#{}都能实现,并且由于#{}PreparedStatement进行SQL的预处理,一定程度上可以防止SQL注入攻击。所以在开发中,能使用#{}尽量使用#{}。 PreparedStatement预处理的本质是将参数进行转换为字符串,当做参数字符串处理。所以,如果参数信息是一个特殊的关键字,例如: 数据库名,表名,函数名,内置关键字,使用预处理,则关键字转为了字符串,无效了,此时必须使用字符串拼接,使用${}。