MyBatis-${}与#{}的区别
#{} 是先被mybatis解析成 ?占位符 然后进行预编译,能避免 sql注入问题。但是不能用于表名、列名的占位符。(因为JDBC不允许?作为表名列名的占位符)
${} 是直接解析成表达式对应的值,进行了赋值,如果sql还有?占位符就进行预编译,但由于预编译前就进行了赋值,可能存在sql注入问题。但是可以用于代替表名、列名。
注意如果使用${}作为字符类型的字段的占位符需要在外面加引号,#{}则不需要加引号。
两者可以混合使用
不管使用哪种 底层都是使用的PreparedStatement。
验证一下:
全部用${} 底层用的是Statement还是PreparedStatement

debug跟一下:

StatementType是一个枚举类,表示statement的类型,这里明显是prepared

#{}更不用说,被mybatis解析成?号之后进行预编译,肯定使用了Preparedstatement。
所以说两者底层都是使用的Preparedstatement

浙公网安备 33010602011771号