MyBatis-${}与#{}的区别
#{} 是先被mybatis解析成 ?占位符 然后进行预编译,能避免 sql注入问题。但是不能用于表名、列名的占位符。(因为JDBC不允许?作为表名列名的占位符)
${} 是直接解析成表达式对应的值,进行了赋值,如果sql还有?占位符就进行预编译,但由于预编译前就进行了赋值,可能存在sql注入问题。但是可以用于代替表名、列名。
注意如果使用${}作为字符类型的字段的占位符需要在外面加引号,#{}则不需要加引号。
两者可以混合使用
不管使用哪种 底层都是使用的PreparedStatement。
验证一下:
全部用${} 底层用的是Statement还是PreparedStatement
debug跟一下:
StatementType是一个枚举类,表示statement的类型,这里明显是prepared
#{}更不用说,被mybatis解析成?号之后进行预编译,肯定使用了Preparedstatement。
所以说两者底层都是使用的Preparedstatement
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异