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

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

Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${}

我们经常使用的是#{},是因为这种方式可以防止SQL注入,#{}这种方式SQL语句是经过预编译的,它把#{}中间的参数转义成字符串。

比如:select * from table where name = #{zhangSan}

预编译后,会动态解析成一个参数标记符?:select * from table where name = ?

而使用${}在动态解析时候,会传入参数字符串

select * from table where name = ${zhangSan}

动态解析时候,会传入参数字符串:select * from table where name = 'zhangSan'

总结:#传入的参数在SQL中显示为字符串,$传入的参数在SqL中直接显示为传入的值

区别:

1、#{}可以理解为预处理,而${}是直接替换

        #传入的参数在SQL中显示为字符串,会堆自动传入的数据加上双引号。
        $传入的参数在SQL中直接显示为传入的值

2、#{}适用于所有类型的参数匹配,但${}只适用于数值类型

        使用#{}传入的参数会以字符串的形式进行匹配,而${}传入的参数是直接替换,数值类型像id可以直接替换,但是如果是姓名、性别这种直接替换会出错。

3、#{}性能更高,并且没有SQL注入的安全性问题,但${}存在SQ注入的安全问题

4、大多数情况下还是经常使用#{},一般能用#就不用$,但是有些特殊情况下必须使用$,例如:MyBatis中进行排序时,使用order by时要使用$而不是#。


http://www.mrgr.cn/news/15040.html

相关文章:

  • VScode应用有哪些?
  • 设计模式 8 组合模式
  • ISIS路由渗透
  • jre与tomcat打包到一起
  • 【C语言进阶】C语言指针进阶实战:优化与难题解析
  • 【Docker】Docker 的基本概念和优势简介
  • Java的IO模型详解-BIO,NIO,AIO
  • 如何构建基于Java SpringBoot的保险业务管理与数据分析系统
  • 目前支持云计算的有哪些厂家?
  • 单例模式(Singleton Pattern)
  • java.io.FileNotFoundException open failed: EACCES (Permission denied)
  • 自建 git 服务器
  • DNS工作流程
  • Visual Basic:多线程编程的优雅之舞
  • 代码随想录Day 28|题目:122.买卖股票的最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ、1005.K次取反后最大化的数组和
  • [Meachines] [Medium] SecNotes XSRF跨站请求伪造+SMB-Webshell上传+Linux子系统命令历史记录泄露权限提升
  • 单片机使用cJSON的坑
  • TCP、HTTP以及RPC的梳理
  • Linux基础1-基本指令6(grep,zip,tar,查看系统等命令)
  • uniapp uni-popup底部弹框留白 底部颜色修改 滚动穿刺