Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${}。常见是使用#{ }来防止SQL注入,这里又设计jdbc的预处理机制
当使用 #{}的时候
- 在动态解析的时候, 会解析成一个参数标记符
- select * from user where name = #{name,jdbcType=VARCHAR};
- mysql 会把它转换成 jdbcType 类型. 属于一个变量值.(在动态解析的时候, 会解析成一个参数标记符)
- eg: name = nmnl and 1=1
- select * from user where name = 'nmnl and 1=1';
当使用 ${}的时候
- 在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中
- select * from user where name = ${name};
- eg: name = nmnl and 1=1
- select * from user where name = nmnl and 1=1;
{} 经过预编译,这种是取值以后再去编译SQL语句
${} 未经过预编译,直接提取变量编译sql语句
JDBC绑定参数时有一个安全机制,它可以准确的将那些需要转义的字符进行转义(escape)prepared statement