MyBatis-${}与#{}的区别

#{} 是先被mybatis解析成 ?占位符 然后进行预编译,能避免 sql注入问题。但是不能用于表名、列名的占位符。(因为JDBC不允许?作为表名列名的占位符)

${} 是直接解析成表达式对应的值,进行了赋值,如果sql还有?占位符就进行预编译,但由于预编译前就进行了赋值,可能存在sql注入问题。但是可以用于代替表名、列名。

注意如果使用${}作为字符类型的字段的占位符需要在外面加引号,#{}则不需要加引号。

两者可以混合使用

不管使用哪种 底层都是使用的PreparedStatement。

验证一下:

  全部用${} 底层用的是Statement还是PreparedStatement

 debug跟一下:

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

#{}更不用说,被mybatis解析成?号之后进行预编译,肯定使用了Preparedstatement。

所以说两者底层都是使用的Preparedstatement

 

posted @ 2023-10-11 09:21  ygdgg  阅读(31)  评论(0)    收藏  举报