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 …
暂无图片
编程学习 ·

Fedora安装Unity Editor详细步骤

本文固定链接,转载请评论点赞,么么哒 一、起因: 最近一直在用Unity开发Linux版本的应用或者说游戏。Linux是Fedora版本的。Unity官方很早就开始说要专门针对Linux做编辑器了。于是就萌生了要在Fedora上装个Unity的想法。 二、背景: Announcing the Unity Editor for Linux …
暂无图片
编程学习 ·

记一次spark-submi 提交python脚本 遇到的问题

一、通过spark-submit 提交报错如下 yarn运行模式spark用的版本是2.4.0是支持pandas_udf的,而且通过pyspark的shell命令行一条条执行 都是没有问题的 但是将代码作为文件用spark submit提交就报这个错误 二、解决办法: @pandas_udf(returnType=“string”, PandasUDFType.…
暂无图片
编程学习 ·

使用命令删除node_modules文件夹

先安装删除工具npm install rimraf -g然后使用删除命令rimraf node_modulesnpm install -g 全局安装,以后直接使用删除命令即可。vscode工具,前端项目文件夹下记住这个命令,不要再手动删除目录文件,很慢。
暂无图片
编程学习 ·

前端项目如何管理

前端项目的管理分为两个维度:项目内的管理与多项目之间的管理。1. 项目内的管理在一个项目内,当有多个开发者一起协作开发时,或者功能越来越多、项目越来越庞大时,保证项目井然有序的进行是相当重要的。一般会从下面几点来考证一个项目是否管理得很好:可扩展性:能够很方便…
暂无图片
编程学习 ·

python:matplotlib 绘制两条y轴

实例代码 x= np.arange(10) y1 = x**2 y2 = x**4 _,ax=plt.subplots() ax.plot(x,y1,b) ax.set_xlabel(x) ax.set_ylabel(y1,color=b) ax2 = ax.twinx() ax2.plot(x,y2,r) ax2.set_ylabel(y2,color=r)结果
暂无图片
编程学习 ·

iOS开发之多线程(2)—— Thread

目录版本简介方法属性示例 版本 Xcode 11.5 Swift 5.2.2 简介 一个Thread即为一个线程. 方法属性 OC中的属性方法(Swift方法名类似): #pragma mark - 属性 // 可以使用返回的字典来保存线程的特定数据. (这只是一个普通的字典, 用来保存所有开发者感兴趣的数据.) @property (r…
暂无图片
编程学习 ·

CMMI 2.0 和 1.3

CMMI2.0与1.3在组织形式区别很大,很多PA和之前的不太一样了,而且PA在2.0中叫实践域,1.3中叫过程域。不过其实核心内容没有大的变化,只是相关内容的位置进行了调整,部分描述进行了优化。目前是过渡阶段,2.0和1.3都可以评估,但截止日期之后就只适用2.0了。1.3评估的截止日…
暂无图片
编程学习 ·

TabRow + TextView导致文字显示不完全

我们在使用表格布局TabLayout时会出一个现象:TextView显示文字时当超过屏幕换行是最后一个文字显示不完全,这个时候我们可以将Textview改成如下布局即可将android:layout_width="wrap_content"改为android:layout_width="0dp" 同时添加该属性android:lay…
暂无图片
编程学习 ·

Java Spring Shiro 安全框架:(八)加密算法

加密算法1.手动处理数据时,自行使用MD5加密2.使用Shiro的MD5方式进行加密在身份认证的过程中往往都会涉及到加密,如果不加密,这个时候信息就会非常的不安全,shiro 中提供的算法比较多 如 MD5 SHA 等1.手动处理数据时,自行使用MD5加密 package com.shiro3;import org.apache.s…
暂无图片
编程学习 ·

网上书城前端界面设计

网上书城界面设计前言界面设计首页登录注册书籍搜索购物车代码实现总结 前言 接着我的上一篇博客来,今天为大家分享的内容是网上书城项目的界面设计以及代码分析 网上书城项目需求分析、功能划分、数据库表设计、工具类介绍 界面设计 首页首页的话,主要涉及到了BootStrap的相…
暂无图片
编程学习 ·

datawhale-综合练习题目

这里写自定斜体样式义目录标题这两天考试多,休息的时间也没有,等我考完再重新做回来,等我!功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建…
暂无图片
编程学习 ·

Promise的深入理解

一、promise 的认识 1.js的单线程 1)javascript的执行环境是单线程的 2)单线程:指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它会「阻塞」其他任务,这个任务可称为主线程,但是实际上还有其他线程…
暂无图片
编程学习 ·

ubuntu20.04微信无法输入中文解决

打开输入法首选项, 勾选show suggestion去微信聊天框输入你好,会提醒下一个字,将提醒的字按空格输入到聊天框,就可以输入中文了 缺点就是每次都要这么操作
暂无图片
编程学习 ·

网络安全技术及应用第3版 主编贾铁军等——教材习题 期末重点 复习题 知识提炼(第4章 黑客攻防与检测防御)

参考教材:网络安全技术及应用 第3版 主编贾铁军等 第4章 黑客攻防与检测防御填空题简答题论述题 填空题 (1)端口扫描的 防范也称为 系统“加固”,主要有 防止IP地址的扫描 和(关闭 闲置及有潜在危险 端口)。 (2)(分布式拒绝服务攻击DDoS)就是利用更多的傀儡机对目标发…
暂无图片
编程学习 ·

文件和目录命令之cd

cd命令帮助原文 ~]# help cd cd: cd [-L|[-P [-e]]] [dir]Change the shell working directory. 更改shell工作目录。Change the current directory to DIR. 将当前目录更改为DIR。 The default DIR is the value of the HOME shell variable. DIR的默认值是shell变量HOME的值…
暂无图片
编程学习 ·

分布式计算(课堂测验+MOOC答案)

分布式计算(课堂测验+MOOC答案)分布式计算(课堂测验+MOOC答案)第一章节第二章节第三章节第四章节第五章节 分布式计算(课堂测验+MOOC答案) 第一章节第二章节第三章节 1、【单选题】在EC2服务中,每个实例自身携带 ()个存储模块。(A) A. 1 B. 2 C. 3 D. 4 2、【单选题】…
暂无图片
编程学习 ·

Vue学习笔记——选项卡案例(tab栏切换)

Vue学习笔记——选项卡案例(tab栏切换) 内容截图:常犯问题:看到这个内容的时候,总是思考怎么将3个div叠起来。 其实不需要,隐藏了div不占位置的。每次只显示一个div且显示时占的位置是一样的 如果你都没有给它们添加显示的类,那么你只能看到选项,看不到图的盒子框架:u…