MyBatis中${}与#{}的区别
MyBatis中${}是拼接符,是将参数直接拼接在相应的位置,例如:
SELECT * FROM user_info WHERE user_id = ${userId};
编译后的SQL相应的就是:
SELECT * FROM user_info WHERE user_id = 11111;
因此我们可以用它来进行SQL语句的拼接,例如:
SELECT * FROM user_info WHERE ${anyKey} = #{value};
但正是因为这个特性,使用${}拼接的SQL语句会引起SQL注入,所以一般不建议使用${}。
Mybatis中#{}是占位符,mybatis会将占位符#{}先编译成?,然后将参数填充进去。例如:
SELECT * FROM user_info WHERE user_id = #{value};
编译后:
SELECT * FROM user_info WHERE user_id = ?;
最后填充参数:
SELECT * FROM user_info WHERE user_id = ‘111111’;
默认情况下,使用 #{} 参数语法时,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数(就像使用 ? 一样),防止SQL注入。
可以根据不同的使用场景选择使用${}与#{}。