MyBatis中#{}和${}的区别详解 区别

区别

1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".

2.将传入的数据直接显示生成在sql中。如:orderby将传入的数据直接显示生成在sql中。如:orderbyuser_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.

3.#方式能够很大程度防止sql注入。

4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.
6.一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

 

实例讲解

动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}。

在下面的语句中,如果 name 的值为 zhangsan,则两种方式无任何区别:

select * from user where name = #{name};
select * from user where name = ${name};

其解析之后的结果均为

select * from user where name = 'zhangsan';

但是 #{} 和 ${} 在预编译中的处理是不一样的。

#{} 在预处理时,会把参数部分用一个占位符 ? 代替,变成如下的 sql 语句:

select * from user where name = ?;

而 ${} 则只是简单的字符串替换,在动态解析阶段,该 sql 语句会被解析成

select * from user where name = 'zhangsan';

以上,#{} 的参数替换是发生在 DBMS 中,而 ${} 则发生在动态解析过程中。

 

那么,在使用过程中我们应该使用哪种方式呢?

答案是:优先使用 #{}。因为 ${} 会导致 sql 注入的问题。

看下面的例子:

select * from ${tableName} where name = #{name}

 

在这个例子中,如果表名为

user; delete user; --

 

则动态解析之后 sql 如下:

select * from user; delete user; -- where name = ?;

 

--之后的语句被注释掉,而原本查询用户的语句变成了查询所有用户信息+删除用户表的语句,会对数据库造成重大损伤,极大可能导致服务器宕机。

但是表名用参数传递进来的时候,只能使用 ${} 。这也提醒我们在这种用法中要小心sql注入的问题。

热门文章

暂无图片
编程学习 ·

蓝鲸平台mongodb集群异常处理

问题回顾 蓝鲸平台中的配置平台(cmdb)数据存放在了mongodb集群中(三台mongodb服务器组成的集群),偶然间发现集群中的一个节点日志有报错。 报错信息如下: 2020-06-30T19:27:50.622+0800 I REPL [replication-0] We are too stale to use 10.10.10.2:27017 as a sync …
暂无图片
编程学习 ·

命令模式

菜鸟教程中代理模式总结)1.定义:将请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令 的合适的对象,并把该命令传给相应的对象,该对象执行命令。 2.主要解决:行为请求者与行为实现者通常是一种紧耦合的关系,为了消除这种耦合关系 3.何时使用:命…
暂无图片
编程学习 ·

machine learning基础知识(Leetcode)

机器学习 machine learning是机器通过已知的内容,类似于人类一样进行学习,并对同类型数据进行判断的过程。 例如训练图片模型就是将每个像素点转为0到255之间的值,利用机器发现不同种类的图片之间存在的映射。 有监督与无监督模型监督学习是F(x)= sum 并且sum已知,可以通…
暂无图片
编程学习 ·

如何解决eclipse无法显示svn资源库以及给资源库设置起别名

前言每次安排项目时领导都会丢给我一个svn地址,让我去download下来然后功能写完了提交到svn即可。可是项目做多了话,就会出现在很多个svn地址,同时由于url里面的中文会被转码,所有在导入的时候根本不知道哪个时自己要导入的。如下面所示:显示svn资源库以及设置别名 从下图…
暂无图片
编程学习 ·

【数据结构】数据结构三要素

数据结构三要素 数据结构的三要素包括数据逻辑结构、数据存储结构和数据的运算。 数据逻辑结构 数据的逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据。它与数据的具体存储形式无关,是独立于计算机的。数据逻辑结构通常分为线性结构和非线性结构。典型的数据结构…
暂无图片
编程学习 ·

90后绝对不是用来管的!

作者:混沌大学来源:混沌大学(ID:hundun-university) 在知乎上,“如何管理90后员工”是一个长盛不衰的话题。一个备受关注的问题是这样的:最近公司录用了一批90后的新员工,基本上全都离职了,最短的半天,最长的也就工作了一周,迫切地想知道90后员工的求职观,什么样的…
暂无图片
编程学习 ·

Spark1.x升级Spark2.x常见异常Kafka篇【TopicMetadataRequest】

一.原因分析 当Spark从1.x升级到2.x时,如果使用SparkStreaming加载Kafka的数据,即使Kafka版本没有变化【一般会有所升级】,对应的spark-streaming-kafka也必须升级到对应版本,访问方式也会有所变化。 此处是从Spark1.6.0升级到Spark2.4.3,Kafka略有升级【从2.1.0升级到2.2…
暂无图片
编程学习 ·

单词学习2020

1. mindset: 心态;观念模式,思维倾向(1)This old mindset has not changed这个旧的思想意识还未转变(2)Enhancing leadership commitment and proactive mindset.增强领导力承诺和积极进取的心态(3)He faces all challenges by aggressive mindset他以积极的心态面对所…
暂无图片
编程学习 ·

setuptools制作whl包实战讲解(一)

什么是 whl .whl格式的文件本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。使得可以在不具备编译环境的情况下,选择合适自己的python环境进行安装。我们可以使用我们非常熟悉的pip install 来安装whl包。 如: pip install mask_detect_v1.0.whl如何制作whl包…
暂无图片
编程学习 ·

云管理服务AWS Organizations正式在AWS中国区域上线

近期, AWS中国(宁夏)区域(由西云数据运营)和AWS中国(北京)区域(由光环新网运营)正式上线了云管理服务AWS Organizations。作为一种管理服务,AWS Organizations可集中控制和管理多个AWS账户,无论是初创公司还是大型企业均可以使用,而不需要额外付费。随着企业或机构…
暂无图片
编程学习 ·

select 进阶查询,不会你就 OUT 了

1.1 分组查询 1.1.1 语法 # where 和 having 可以省略 SELECT col_name, group_function, FROM tb_name [WHERE where_condition] GROUP BY group_expression [HAVING group_condition];☞ 说明col_name:列明 tb_name:表名 where_condition:where 后的过滤条件 group_func…
暂无图片
编程学习 ·

代码优化

也许有人会感觉CR没有什么卵用,只要我代码实现了功能,我完成了开发任务,我就OK了,为啥还要CR??但是CR真的是有必要的,你不仅可以发现自己代码中的不足之处,待优化点,简洁明了的代码易读别人接手也会很快。1. 比如在vue项目中只有某一个组件用某一个特别长的常量对象,…
暂无图片
编程学习 ·

git学习日志-标签

git也可以像svn一样打标签,以此来标记发布节点,以示重要性。 对标签的操作,一般包括: 1. 列出标签 2. 创建标签 3. 删除标签 4. 检出标签 一、列出标签 执行git tag命令,就可以看到当前仓库中已经打过的标签。注意: 这个命令会以字母顺序列出标签。 也可以加上-l或--list…
暂无图片
编程学习 ·

Exception 的意义

Exception 的意义 文章目录Exception 的意义引言Exception 的语义自底向上的观点自顶向下的观点结论 引言 为什么程序设计语言要加入 Exception 机制?这个问题的答案或许不是那么显然。 Exception 常见于 “操作过程可能出现意外” 的场景。比如,试图打开文件时发现文件不存在…
暂无图片
编程学习 ·

疫情期间,注重鼻腔呼吸道清洁卫生,很重要

疫情期间清洁鼻腔很重要鼻子是人类呼吸道的门户,作为一个与外界直接相通的腔道,很像家里空调的风口,容易存留脏物。从生理结构上来看,鼻腔里有鼻毛和大量的黏膜褶皱,灰尘、微生物、病毒都可能积攒其中。所以,在“勤洗手、戴口罩”的非常时期,别忘了鼻腔的清洁工作。另据…
暂无图片
编程学习 ·

opencv画3d骨架图

效果: import matplotlib.pyplot as plt import numpy as np# h36m骨架连接顺序,每个骨架三个维度,分别为:起始关节,终止关节,左右关节标识(1 left 0 right),用来区别颜色 human36m_connectivity_dict = [[0, 1, 0], [1, 2, 0], [2, 6, 0], [5, 4, 1], [4, 3, 1], [3, 6…