答:采用预编译的方式防止sql注入.但也不是完全会防住,能不能完全防住取决于mybatis使用者水平.
原理是怎样的呢?我们分析一下:
当我们执行Mybatis中写的sql语句时,会出现以下提示
SELECT * FROM user WHERE id = ?
这时候其实Mybatis已经进行了预编译,我们不管传什么东西,都只会去替换占位符,比如我们传输一个AND,结果就会为:
SELECT * FROM user WHERE id = 'AND'而不是重新编译sql语句.
而我们经常用到的#{}和${},是有区别的.#{}是预编译的占位符,${}是纯字符串替换.
比如,我们用${},SELECT * FROM user WHERE id = ${id}
那我们出入AND时,会输出这么一个sql:
SELECT * FROM user WHERE id = AND
这时候程序就会报错.但如果我们输入了 1;drop table user;这么一长串字符,你拼接一下试试看,是不是正好实现了注入?