参考:mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译
<select id="selectPerson" parameterType="int" resultType="hashmap"> SELECT * FROM PERSON WHERE ID = #{id} </select>
#{id}这就告诉 MyBatis 创建一个预处理语句参数,通过 JDBC,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,就像这样:
String selectPerson = "SELECT * FROM PERSON WHERE ID=?"; PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1,id);
${id} SQL 语句中插入一个不改变的字符串,如果使用${id},sql就会变成 Select * from PERSON Where ID = 1。
以这种方式接受从用户输出的内容并提供给语句中不变的字符串是不安全的,会导致潜在的 SQL 注入攻击,比如传入1;delete PERSON;这样会导致删表。
${ } 的变量的替换阶段是在动态 SQL 解析阶段,而 #{ }的变量的替换是在 DBMS 中。
所以尽量使用#{},而传入参数是表名的话,使用${},因为使用#{},最后会解析成 ‘传入的值’。
SELECT * from users where id ='1';
SELECT * from 'users' where id ='1';error,找不到表