当前位置: 首页 > news >正文

mybatis 中 #{}和 ${}的区别是什么?

在 MyBatis 中,#{} 和 ${} 是两种用于参数替换的语法,但它们之间存在一些重要的区别,主要体现在安全性、预编译和动态 SQL 上。

  1. 安全性

    • #{}:这是预编译处理,MyBatis 会为传入的参数生成 PreparedStatement,使用占位符 ? 来代替参数,这样可以防止 SQL 注入。因为传入的参数会被当作字段值来处理,而不是直接拼接到 SQL 语句中。
    • ${}:这是字符串替换,MyBatis 会直接替换 SQL 语句中的 ${} 为传入的值。如果传入的值包含 SQL 语句片段(如 ORDER BY ${column}),那么它会被直接拼接到 SQL 语句中,这可能导致 SQL 注入风险。因此,在使用 ${} 时需要格外小心,确保传入的值是安全的。
  2. 预编译

    • #{}:由于使用了 PreparedStatement,所以 SQL 语句在传入参数之前就已经被预编译过了,这样可以提高执行效率。
    • ${}:没有预编译的过程,直接替换并执行 SQL 语句。
  3. 动态 SQL

    • #{}:虽然它主要用于防止 SQL 注入和预编译,但在某些情况下(如动态表名、动态列名等),由于它无法识别这些动态部分,因此可能无法使用 #{}
    • ${}:在这些需要动态 SQL 的场景下,${} 是非常有用的,因为它可以直接替换 SQL 语句中的任何部分。但是,请确保在使用 ${} 时进行了充分的安全检查。
  4. 数据类型

    • #{}:会自动对参数进行 JDBC 类型的转换(如将 Java 中的 String 类型转换为 JDBC 中的 VARCHAR 类型)。
    • ${}:只是简单的字符串替换,不会进行 JDBC 类型的转换。

总结:在大多数情况下,应该优先使用 #{},因为它更安全、更高效。但是,在需要动态 SQL 的场景下,可以使用 ${},但请确保进行了充分的安全检查。

http://www.lryc.cn/news/344784.html

相关文章:

  • 深入解析C#中的接口设计原则
  • 106短信群发平台在金融和法务行业的应用分析
  • Spring AOP(2)
  • Spring-依赖注入的处理过程
  • 2.用python爬取的保存在text文件中的格式为MP4的视频url
  • Java基于B/S医院绩效考核管理平台系统源码java+springboot+MySQL医院智慧绩效管理系统源码
  • UE 蓝图堆栈调试
  • UE4_摄像机_使用摄像机的技巧
  • ssm115乐购游戏商城系统+vue
  • 【可实战】被测需求理解(需求文档是啥样的、从哪些角度进行需求评审、需求分析需要分析出哪些内容、如何提高需求分析能力)
  • 伪类和伪元素的区别是什么?
  • gorm-sharding分表插件升级版
  • MoviePy(Python音视频开发)
  • Spring中的FileCopyUtils:文件复制的利器与详解
  • 【操作系统】读者—写者问题python解析
  • 【driver5】调用堆栈函数,printk,动态打印,ftrace,proc,sysfs
  • 计算机毕业设计springboot基于vue电商抢购限时秒杀系统ch0h8
  • 顺序表的实现(迈入数据结构的大门)(2)
  • 学习笔记:IEEE 1003.13-2003【POSIX PSE51接口列表】
  • 《QT实用小工具·五十》动态增删数据与平滑缩放移动的折线图
  • 【qt】核心机制信号槽(下)
  • C++ 基础 输入输出
  • 八股文(C#篇)
  • 【YOLOv9算法原理简介】
  • 2010NOIP普及组真题 2. 接水问题
  • ElementUI从unpkg.com完整下载到本地的方法 - 解决unpkg.com不稳定的问题 - 自建镜像站 - 不想打包只想cdn一下
  • 什么是BFF API
  • 分享自己一篇在亚马逊云科技AWS官网发的Blog技术文章
  • 封装长按触发事件的uniapp组件
  • Docker 安装的MySQL迁移数据库