【MyBatis】MyBatis中#{}与${}的区别是什么?

news2024/11/25 4:57:14

文章目录

  • 前言
  • 一、彻底理解SQL注入
  • 二、关于 # { }
  • 三、关于$ { }
  • 四、Mybatis中#{}与${}的区别
  • 五、代码案例
    • 使用#{}案例
    • 使用$ {}案例

前言

在开发中使用Mybatis经常使用到#{}与${},二者区别是?来总结一下。

在mybatis中动态 sql 是其主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在执行操作之前 mybatis 会对其进行动态解析。mybatis 提供了两种支持动态 sql 的语法:#{} 以及 $ {},其最大的区别则是#{}方式能够很大程度防止sql注入(安全),${}方式无法防止Sql注入。Sql注入指的是程序解析时会将你传入的参数作为原来SQL语句的一部分,打乱原来SQL的结构,而通常我们只是需要传入一个参数而已。

一、彻底理解SQL注入

什么?还不懂SQL注入,那就来个最简单的例子:一般开发,肯定是在前台有两个输入框,一个用户名,一个密码,会在后台里,读取前台传入的这两个参数,拼成一段SQL,例如: select count(1) from tab where usesr=userinput and pass = passinput,把这段SQL连接数据后,看这个用户名/密码是否存在,如果存在的话,就可以登陆成功了,如果不存在,就报一个登陆失败的错误。

但是有这样的情况,这段SQL是根据用户输入拼出来,如果用户故意输入可以让后台解析失败的字符串,这就是SQL注入,例如,用户在输入密码的时候,输入 ‘’’’ ’ or 1=1’’, 这样,后台的程序在解析的时候,拼成的SQL语句,可能是这样的: select count(1) from tab where user=userinput and pass=’’ or 1=1; 看这条语句,可以知道,在解析之后,用户没有输入密码,加了一个恒等的条件 1=1,这样,这段SQL执行的时候,返回的 count值肯定大于1的,如果程序的逻辑没加过多的判断,这样就能够使用用户名 userinput登陆,而不需要密码。

防止SQL注入,首先要对密码输入中的单引号进行过滤,再在后面加其它的逻辑判断,或者不用这样的动态SQL拼。

二、关于 # { }

  1. #{}表示一个占位符号 相当于 jdbc中的 ? 符号
    #{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?

  2. #{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:select * from user where id= #{user_id},如果传入的值是11,那么解析成sql时的值为where id=“11” ,

  3. 如果sql语句中只有一个参数,此时参数名称可以随意定义
    如果sql语句有多个参数,此时参数名称应该是与当前表关联[实体类的属性名]或则[Map集合关键字],不能随便写,必须对应!如下图

在这里插入图片描述

三、关于$ { }

  1. $ {}将传入的数据直接显示生成在sql中。如:select * from user where id= $ {user_id},如果传入的值是11,那么解析成sql时的值为where id=11

  2. $ {value}中value值有限制只能写对应的value值不能随便写,因为${}不会自动进行jdbc类型转换

  3. 简单来说,在JDBC不支持使用占位符的地方,都可以使用${}

四、Mybatis中#{}与${}的区别

简单来说区别就是

#{}方式能够很大程度防止sql注入(安全),${}方式无法防止Sql注入

在JDBC能使用占位符的地方,最好优先使用#{}

在JDBC不支持使用占位符的地方,就只能使用${},典型情况就是 动态参数

比如 有两张表,分别是emp_2017 和 emp_2018 .如果需要在查询语句中 动态指定表名,就只能使用${}

<select>
      select *  from emp_ ${year}
<select>

再比如MyBatis 排序时使用order by 动态参数时,此时也只能使用${}

<select>
       select  *  from dept order by ${name}
</select>

五、代码案例

一般# {}与$ {}用的比较多的地方是模糊查询方面,所以下面来一个模糊查询的案例

使用#{}案例

  1. 映射文件

在User.xml配置文件中添加如下内容:

<!-- 如果返回多个结果,mybatis会自动把返回的结果放在list容器中 -->
	<!-- resultType的配置和返回一个结果的配置一样 -->
	<select id="queryUserByUsername1" parameterType="string"
		resultType="cn.itcast.mybatis.pojo.User">
		SELECT * FROM `user` WHERE username LIKE #{username}
	</select>
  1. 测试程序

MybatisTest中添加测试方法如下:

@Test
	public void testQueryUserByUsername1() throws Exception {
		// 4. 创建SqlSession对象
		SqlSession sqlSession = sqlSessionFactory.openSession();

		// 5. 执行SqlSession对象执行查询,获取结果User
		// 查询多条数据使用selectList方法
		List<Object> list = sqlSession.selectList("queryUserByUsername1", "%王%");

		// 6. 打印结果
		for (Object user : list) {
			System.out.println(user);
		}

		// 7. 释放资源
		sqlSession.close();
	}

测试效果如下图:

在这里插入图片描述

使用$ {}案例

  1. 映射文件:

在User.xml配置文件中添加如下内容:

<!-- 如果传入的参数是简单数据类型,${}里面必须写value -->
	<select id="queryUserByUsername2" parameterType="string"
		resultType="cn.itcast.mybatis.pojo.User">
		SELECT * FROM `user` WHERE username LIKE '%${value}%'
	</select>
  1. 测试程序:
    MybatisTest中添加测试方法如下:
@Test
public void testQueryUserByUsername2() throws Exception {
	// 4. 创建SqlSession对象
	SqlSession sqlSession = sqlSessionFactory.openSession();

	// 5. 执行SqlSession对象执行查询,获取结果User
	// 查询多条数据使用selectList方法
	List<Object> list = sqlSession.selectList("queryUserByUsername2", "王");

	// 6. 打印结果
	for (Object user : list) {
		System.out.println(user);
	}

	// 7. 释放资源
	sqlSession.close();
}

当然两个案例效果一致!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是现代化智慧型档案馆

近日&#xff0c;智慧档案馆建设的新闻热度不断攀升&#xff0c;你知道智慧档案馆是什么吗&#xff1f; ​智慧档案馆是指运用现代信息技术手段&#xff0c;对传统档案馆进行数字化转型&#xff0c;实现档案数字化存储、智能化检索和共享服务。通过数字化转型&#xff0c;不仅可…

< 免费体验ChatGPT:免费且好用,不用使用 “ 魔法 ”,一款功能强大且轻便的插件!webTab! >

免费且好用&#xff0c;不用使用 “ 魔法 ”&#xff0c;一款功能强大且轻便的插件&#xff01;webTab&#xff01; &#x1f449; 前言&#x1f449; 功能演示图&#x1f449; 使用经验分享&#x1f449; 如何安装webTab插件呢&#xff1f;往期内容 &#x1f4a8; tips&#x…

(转载)基于量子遗传算法的函数寻优算法(matlab实现)

8.1 理论基础 8.1.1 量子遗传算法概述 量子遗传算法(quantum genetic algorithm,QGA)是量子计算与遗传算法相结合的产物&#xff0c;是一种新发展起来的概率进化算法。遗传算法是处理复杂优化问题的一种方法&#xff0c;其基本思想是模拟生物进化的优胜劣汰规则与染色体的交…

太优雅了,公司项目终于用上了Spring状态机

1、什么是状态机 1.1 什么是状态 先来解释什么是“状态”&#xff08; State &#xff09;。现实事物是有不同状态的&#xff0c;例如一个自动门&#xff0c;就有 open 和 closed 两种状态。我们通常所说的状态机是有限状态机&#xff0c;也就是被描述的事物的状态的数量是有限…

【HTML 往日冒险 01】标签 元素 属性 注释 文本格式化 颜色 CSS

HTML 往日冒险日志01 说在前面重新开始基础标签 basic元素 elements属性 attributes标题&#xff0c;水平线以及注释 headings段落与折行 paragraphs样式 html_styles文本格式化 formatting注释 comments颜色 colorsCSS 说在前面 HTML 对于现在的我来说&#xff0c;熟悉又陌生…

实验室信息系统源码,LIS源码

实验室信息系统源码&#xff0c;LIS源码 技术细节&#xff1a; SaaS架构的Client/Server应用 体系结构&#xff1a;Client/Server架构 客户端&#xff1a;WPFWindows Forms 服务端&#xff1a;C# .Net 数据库&#xff1a;Oracle 接口技术&#xff1a;RESTful API HttpW…

深度学习环境搭建笔记(一):detectron2安装过程

文章目录 第一步 安装python第二步 安装pycocotools第三步 安装Torch和Torchvision第四步 安装fvcore第五步 安装detectron2第六步 开始安装 第一步 安装python cuda 10.2 环境下 conda create -n detectron python3.7 第二步 安装pycocotools 下载对应的pycocotools-window…

ESXI7.0安装Windows Server 2008 R2

1&#xff1a;使用VC正常建立虚拟机&#xff0c;前四项根据自己的时间情况选择&#xff0c;兼容性用默认的ESXI7.0U2及更高版本。 2&#xff1a;客户机操作系统选择Windows,客户机操作系统版本选择我们想安装的Windows Server 2008 R2(64位&#xff09; 3&#xff1a;自定义硬件…

LINUX使用问题记录

LINUX使用问题记录 linux 安装pylab报错 sudo apt-get install python3-matplotliblinux换源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bakvim 编辑 sources.list &#xff1a; $ sudo vim /etc/apt/sources.list 将 sources.list 中的内容替换如下 注意&#…

Vulkan Tutorial 7 纹理贴图

目录 23 图像 图片库 暂存缓冲区 纹理图像 布局转换 将缓冲区复制到图像上 准备纹理图像 传输屏障掩码 清除 24 图像视图和采样器 纹理图像视图 采样器 Anisotropy 设备特征 25 组合图像采样器 更新描述符 纹理坐标系 着色器 23 图像 添加纹理将涉及以下步骤&am…

如何快速手撕单例类?一文教会你

&#x1f468;‍&#x1f393;作者&#xff1a;bug菌 ✏️博客&#xff1a;CSDN、掘金、infoQ、51CTO等 &#x1f389;简介&#xff1a;CSDN|阿里云|华为云|51CTO等社区博客专家&#xff0c;历届博客之星Top30&#xff0c;掘金年度人气作者Top40&#xff0c;51CTO年度博主Top12…

数据结构与算法基础-学习-24-遍历之DFS(深度优先搜索)和BFS(广度优先搜索)

目录 一、遍历定义 二、遍历实质 三、DFS 四、BFS 五、宏定义 六、自定义类型 七、函数实现 1、DFS&#xff08;邻接矩阵实现&#xff09; 2、DFS&#xff08;邻接表实现&#xff09; 3、BFS&#xff08;邻接矩阵实现&#xff09; 4、BFS&#xff08;邻接表实现&…

在idea中创建maven

说明&#xff1a;maven是一款管理和构建java项目的工具&#xff0c;使用maven&#xff0c;可规范开发&#xff0c;提高开发效率&#xff1b;maven的安装参考&#xff1a;http://t.csdn.cn/623Ah 配置Maven环境 创建maven&#xff0c;先要做准备工作&#xff0c;把idea中的环境…

带你开发一个远程控制项目---->STM32+标准库+阿里云平台+传感器模块+远程显示-------之 MQTT连接阿里云平台

第一篇&#xff1a; (13条消息) 带你开发一个远程控制项目----&#xff1e;STM32标准库阿里云平台传感器模块远程显示。_海口飞鹏岛科技有限公司的博客-CSDN博客 第二篇&#xff1a; (13条消息) 带你开发一个远程控制项目----&#xff1e;STM32标准库阿里云平台传感器模块远程…

C语言---数组

1、一维数组的创建和初始化 1.1、数组的创建 数组是一组相类型元素的集合。 数组的创建方式&#xff1a; type_t arr_name [const_n];//type_t 是指数组的元素类型 //const_n 是一个常量表达式&#xff0c;用来指定数组的大小。1.2、数组的初始化 数组的初始化是指&#x…

国产替代10BASE-T ST7010QNL 应用局域网的以太网变压器/扼流器

Hqst华强盛导读&#xff1a; 华强盛是电子产品国产替代大军中的一员&#xff0c;随着中国电子产业的快速发展&#xff0c;越来越多的电子产品开始出现了国产替代品。这些国产替代品在性能、品质和价格等方面都有了显著的提升&#xff0c;成为了工厂用户的首选。 国产替代10BAS…

DERT(DEtection TRansformer) ONNX直接推理!!

目录 1.前言 2. ONNX模型 (1) backbone使用的是resnet50 (2) Transformer结构 (3)模型输出 3.代码展示(不收费&#xff01;&#xff01;&#xff01;) 4.结果展示 5.源代码地址 1.前言 DETR DETR的全称是DEtection TRansformer&#xff0c;是Facebook提出的基于…

c++实现【典型的旅行商问题(TSP)】实现配送中心最多可以用2辆车对8个客户进行运输配送

假定配送中心最多可以用2辆车对8个客户进行运输配送。每个车辆载重均 为8吨,车辆每次配送的最大行驶距离为50km,配送中心(编号0)与8个客 户之间及8个客户相互之间的距离d; (i, j= 1, 2, ... 8)、8个客户的货物需 求r;(j= 1, 2... 8)如表1所示。要求寻找一条路径, 使得配送总…

Codeforces Div.2 1798B Three Sevens题解

题目&#xff1a; 传送门 B. Three Sevens time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Lottery "Three Sevens" was held for m days. On day i, ni people with the numbers ai,1…

生态系统NPP及碳源、碳汇模拟——土地利用变化、未来气候变化、空间动态模拟

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放&#xff08;碳源&#xff09;和碳固定&#xff08;碳汇&#xff09;这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作…