Mybatis 中 sql 语句的占位符 #{} 和 ${}
#{} 表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换。#{} 可以有效防止 sql注入。 #{} 可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。
${} 表示拼接sql串,通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,不能防止 sql 注入问题, {} 括号中只能是 value。
下面举个例子来说明这两个的区别:
代码上来先:
<!-- 通过ID查询一个用户 --> <select id="findUserById" parameterType="Integer" resultType="com.msym.beans.User"> select * from user where id = #{v} </select> <!-- //根据用户名称模糊查询用户列表 #{} select * from user where id = ? 占位符 ? == '五' ${} select * from user where username like '%五%' 字符串拼接 --> <select id="findUserByUsername1" parameterType="String" resultType="com.msym.beans.User"> select * from user where username like '%${value}%' </select> <select id="findUserByUsername2" parameterType="String" resultType="com.msym.beans.User"> select * from user where username like "%"#{v}"%" </select>
上面是 user 类对应的 user.xml 文件,用于编写 sql 语句,避免了硬编码。
id 为 findUserByUsername1 的采用的是 ${} 占位符,id 为findUserByUsername2 采用的是 #{} 占位符,
前者生成的 sql 为 select * from user where username like ‘%XXX%’;
后者生成的 sql 语句是 select * from user where username like "%"'XXX'"%",(这样的格式我还没在 sql 中写过,但是的确能 run)
(XXX 是调用该查询是传入的参数)注意这两者的不同,前者不能防止 sql 注入,后者能防止。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?