Mybatis 中 sql 语句的占位符 #{} 和 ${}

       #{} 表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换。#{} 可以有效防止   sql注入。 #{} 可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。

       ${} 表示拼接sql串,通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,不能防止 sql 注入问题, pojoparameterType{} 括号中只能是 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 注入,后者能防止。

posted @   码上猿梦  阅读(3458)  评论(0编辑  收藏  举报
编辑推荐:
· .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 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示