MyBatis中#{}和${}的用法

一、例子

1、#{}将传入的数据当作一个字符串,会对传入的数据加上一个双引号。

比如:

sql 复制代码
select * from student where student_name = #{studentName}

如果传入的值为zhangsan,那么经过Mybatis解析完成之后的语句是:

sql 复制代码
select * from student where student_name="zhangsan"

2、${}将传入的数据直接显示生成在sql中。

比如:

sql 复制代码
select ${fieldName} from user where user_age = 22

此时,传入的参数作为要查询的字段,如果传入的值为user_name,则解析成的sql为:

sql 复制代码
select user_name from user where user_age = 22

二、区别

  1. #{}方式能够很大程度上防止sql注入,${}无法防止sql注入。

  2. ${}方式一般用于传入数据库对象,例如列表和表名,#{}方式一般用来传递接口传输过来的具体数据。

  3. 由于#{}方式具有更高的安全行,所以能用#{}的地方尽量不要使用${}

  4. Mybatis排序时使用order by动态参数时需要注意,用${}而不是#{}

  5. #符号(Pound Sign

    • #符号用于参数值的占位,会将参数值进行预编译,并在执行SQL语句时将参数值安全地传递给数据库,防止SQL注入攻击。

    • 适用于大多数情况,尤其是当参数值来自用户输入或不可信数据时,是更安全的选择。

    • 参数值会被自动转义,不需要担心特殊字符的处理。

    • 使用#符号会产生预编译的SQL语句,可以提高数据库的性能,因为数据库可以缓存相同的预编译语句。

    xml 复制代码
    <!-- 使用#符号进行参数占位 -->
    <select id="getUserById" parameterType="int" resultType="User">
      SELECT * FROM users
      WHERE id = #{userId}
    </select>
  6. $符号(Dollar Sign

    • $符号用于简单的值替换,不进行预编译,直接将参数的值嵌入SQL语句中。

    • 适用于那些不需要参数值预编译,且参数值是确定且可信的情况,比如用于动态拼接SQL语句的情况。

    • 使用$符号时,需要小心防止SQL注入攻击,需要手动处理参数值的安全性。

    • 不会产生预编译的SQL语句,可能会导致数据库性能较低,因为每次SQL语句都会重新解析和执行。

    XML 复制代码
    <!-- 使用$符号进行简单值替换 -->
    <select id="getUserByName" parameterType="string" resultType="User">
      SELECT * FROM users
      WHERE username = '${username}'
    </select>

三、最后说一下$动态 拼接SQL

下面是一个实例:

xml 复制代码
<select id="getUsersWithDynamicSorting" parameterType="map" resultType="User">
  SELECT * FROM users
  WHERE 1=1 <!-- 为了方便拼接,可以始终使用一个始终成立的条件 -->

  <!-- 根据参数动态拼接排序字段和排序顺序 -->
  <if test="sortField != null and sortOrder != null">
    ORDER BY ${sortField} ${sortOrder}
  </if>

</select>
相关推荐
程序员阿明16 分钟前
idea把插件啥的不默认放在C盘
java·ide·intellij-idea
斑马13929 分钟前
Linux软件编程学习笔记(十三)——数据库
数据库·oracle
初願致夕霞42 分钟前
MySQL_索引
数据库·mysql
linweidong1 小时前
中科闻歌Java面试题及参考答案
java·python·大模型·提示词·ai agent·mcp·rag原理
OpenAnolis小助手1 小时前
一句话看透 JVM,SysOM 诊断 Skill 新增 Java 应用诊断能力
java·开发语言·jvm·阿里云·操作系统控制台·sysom
十六年开源服务商1 小时前
2026网站备份方案完整指南
数据库·oracle
ForteScarlet1 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
萧瑟余晖1 小时前
Java深入解析篇六十二之安全机制详解
java·开发语言
小刘在重生~2 小时前
Java 常用类|包装类 装箱拆箱、Integer 缓存面试题
java·python·缓存
Orange_sparkle2 小时前
Pi Agent vs LangGraph:从人机交互、企业 RAG 到持久化工作流的完整选型指南
java·网络·人机交互