首页 > 其他分享 >MyBatis中#和$的区别

MyBatis中#和$的区别

时间:2023-09-19 22:35:50浏览次数:45  
标签:语句 区别 传入 编译 user SQL MyBatis 参数值

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


说一下为什么要写这篇文章,最近面试有被问到,一下子想不出来有啥区别,想记录一下加深自己的理解,同时自己也经常用MyBatis-Plus忽略了XML文件的编写和使用,所以需要加深一下这块的知识

一、例子

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

比如

select * from student where student_name = #{studentName}

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

select * from student where student_name="zhangxiangwei"

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>

标签:语句,区别,传入,编译,user,SQL,MyBatis,参数值
From: https://www.cnblogs.com/MyBlogZxw/p/17715785.html

相关文章

  • 缓存穿透,缓存击穿,缓存雪崩区别
    缓存穿透,缓存击穿,缓存雪崩区别发现自己有时候明明已经做过了,可能是缺少回顾总结,过了几天这部分知识就会忘的一干二净,一点有记不住,还有这三个概念有时候确实不太能把他分清楚,面试的时候也有让自己说清楚,说的一塌糊涂,所以总结一下一、缓存穿透,缓存击穿,缓存雪崩简单的区别缓存......
  • select count(*) 和 select count(1) 以及 select count(column) 的区别
      1. 一般情况下,SelectCount(*)和SelectCount(1)两者的返回结果是一样的  2. 假如表沒有主键(PK),那么count(1)比count(*)快,如果有主键PK的話,那count(主键)最快,如果你的表只有一个字段的话那count(*)就是最快的  3.count(*)跟count(1)的结果一样,都包括对NU......
  • FLOPS 和 FLOPs 的区别
    FLOPS:注意全大写,是floatingpointoperationspersecond的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。FLOPs:注意s小写,是floatingpointoperations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。注意在深度学习中,我们用......
  • redis和mysql的区别以及它们是如何配合使用的
    redis和mysql的区别:1、从类型上来说,mysql是关系型数据库,redis是缓存数据库。2、mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢。redis用于存储使用较为频繁的数据到缓存中,读取速度快。3、mysql和redis因为需求的不同,一般都是配合使用。mysql和redis的数据库类型,m......
  • python中dump和dumps的区别
    dumpdump是将json数据写进文件dumpsdumps是将字典类型的数据转换为字符串如果不能区分好这两个函数,就很容易犯这个错误:TypeError:init()gotanunexpectedkeywordargument'fp'(别问我为啥知道奥~)......
  • MyBatis
    MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQLMaps和DataAc......
  • mybatis
    MyBatis简介(了解)什么是MyBatisMyBatis本是apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github。MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需......
  • 服务器与主机的区别
    服务器与主机的区别1、主机和服务器是相对而言的。主机一般是指个人使用的电脑PC机。而在专业术语中,主机仅是电脑的一部分。而常说的主机却往往代表整个电脑。服务器一般是指用于专业用的电脑PC机,在实质上,服务器和主机没有什么意义上的区别。主机如果做为服务器也是可以的,服务器也......
  • orcle和mysql的区别
    orcle和mysql的区别Oracle数据库产品是闭源同时也是收费的,MySQL是开源的项目(免费);Oracle是大型数据库,Mysql是中小型数据库;Oracle可以设置用户权限、访问权限、读写权限等,MySQL没有;Oracle有表空间的概念,MySQL没有;Oracle默认不自动提交,需要用户手动提交。Mysql默认是......
  • 在 Net7.0环境下测试了 Assembly.Load、Assmebly.LoadFile和Assembly.LoadFrom的区别
    一、简介很长时间没有关注一些C#技术细节了,主要在研究微服务、容器、云原生、编批等高大上的主题了,最近在写一些框架的时候,遇到了一些和在NetFramework框架下不一样的情况,当然了,我今天主要测试的是,在通过【添加项目引用】和【手动拷贝DLL】的情况下,这三个方法加载程序......