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

一、例子

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

比如:

select * from student where student_name = #{studentName}

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

select * from student where student_name="zhangsan"

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

比如:

select ${fieldName} from user where user_age = 22

此时,传入的参数作为要查询的字段,如果传入的值为user_name,则解析成的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语句,可以提高数据库的性能,因为数据库可以缓存相同的预编译语句。

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

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

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

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

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

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

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

下面是一个实例:

<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>

相关推荐

  1. MyBatis#{}${}

    2024-01-01 06:36:01       63 阅读
  2. MyBatis使用MySQL5MySQL8

    2024-01-01 06:36:01       29 阅读
  3. MyBatis<foreach>标签

    2024-01-01 06:36:01       35 阅读
  4. 总结 SpringMVC 注解

    2024-01-01 06:36:01       55 阅读
  5. SpringMVC 注解

    2024-01-01 06:36:01       45 阅读
  6. SpringMVC 注解

    2024-01-01 06:36:01       148 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-01 06:36:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-01 06:36:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-01 06:36:01       82 阅读
  4. Python语言-面向对象

    2024-01-01 06:36:01       91 阅读

热门阅读

  1. [蓝桥杯 2021模拟题] 时间加法

    2024-01-01 06:36:01       63 阅读
  2. Amazon API Gateway CORS 实战

    2024-01-01 06:36:01       52 阅读
  3. zyqn-arm软中断设置

    2024-01-01 06:36:01       59 阅读
  4. [语音识别]开源语音识别faster-whisper模型下载地址

    2024-01-01 06:36:01       59 阅读
  5. QT(C++)-QTableWight添加行和删除空行

    2024-01-01 06:36:01       53 阅读
  6. burpsuite模块介绍之dashboard(仪表板)

    2024-01-01 06:36:01       65 阅读
  7. [NOIP2002 普及组] 级数求和

    2024-01-01 06:36:01       57 阅读
  8. php接口优化 使用curl_multi_init批量请求

    2024-01-01 06:36:01       63 阅读
  9. Python编程-实现对自定义类对象排序

    2024-01-01 06:36:01       70 阅读
  10. 常见算法面试题目

    2024-01-01 06:36:01       66 阅读
  11. 2023年人工智能行业总结

    2024-01-01 06:36:01       61 阅读
  12. C++ 基本MyString实现

    2024-01-01 06:36:01       53 阅读