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

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

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

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

两者可以混合使用

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

验证一下:

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

 debug跟一下:

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

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

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

 

posted @   ygdgg  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示