被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?
引言:在使用 MyBatis 进行数据库操作时,#{}
和 ${}
的区别是面试中常见的问题,对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性,还涉及到性能优化。
题目
被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?
推荐解析
预编译与直接替换
面试官问了我这个问题,直接把我问老实了,求放过,赶忙来写下以下思考:
1)#{}
:使用 #{}
时,MyBatis 为 SQL 语句的参数生成一个预编译语句,并通过参数占位符(?
)来代替实际的参数值。这种方式是安全的,因为它防止了 SQL 注入攻击,参数值在发送到数据库之前不会被解析为 SQL 的一部分。
如果你有一个查询用户的操作,你可以这样写:
SELECT * FROM users WHERE id = #{userId}
2)${}
:相反,使用 ${}
时,参数值被直接替换到 SQL 语句中。这种方式虽然灵活,可以动态替换表名、列名等 SQL 语句的组成部分,但却可能导致 SQL 注入问题,因为参数值如果包含恶意的 SQL 代码也会被执行。
如果你需要动态地选择表名或列名,可以这样使用:
SELECT * FROM ${tableName}
性能考虑
对于性能我得出以下思考:
1)#{}
性能优势:由于使用预编译的 SQL 语句,数据库可以重用相同结构的 SQL 语句,减少编译次数,提高执行效率。
2)${}
性能问题:可能导致每次都要编译新的 SQL 语句,因为 SQL 结构可能因为参数的不同而改变。
类型处理
琢磨琢磨我又发现了新大陆!类型处理~
1)#{}
类型处理:MyBatis 可以根据参数的 Java 类型自动推断数据库类型,处理日期、枚举等复杂类型的转换。
2)${}
类型处理:不进行类型转换,将参数视为纯文本,直接嵌入到 SQL 语句中。
鱼聪明 AI 的回答:
鱼聪明 AI 地址:https://www.yucongming.com/
#{}(参数占位符)
- 预编译:
#{}
表达式使得参数在 SQL 语句中以占位符?
的形式出现。这意味着 SQL 语句会被预编译并多次执行,参数值在运行时绑定。这种方式对于数据库性能优化至关重要,因为预编译可以减少数据库编译SQL的次数,提高执行效率。 - 防止 SQL 注入:由于参数不是直接拼接到 SQL 语句中,而是作为一个绑定的值传递给预编译的 SQL 语句,因此
#{}
防止了 SQL 注入的风险。用户输入被当作字符串处理,不会被执行为 SQL 代码的一部分。 - 类型安全:MyBatis 能够根据 Java 类型自动推断出相应的 SQL 类型。例如,如果你传递一个 Java
Date
对象,MyBatis 会适当地处理它与 SQL 日期类型之间的转换。
${}
(SQL 字符串拼接)
- 直接替换:使用
${}
时,参数值会在解析 SQL 语句之前直接替换到 SQL 字符串中。这意味着你可以通过${}
插入动态表名、列名或者其他 SQL 片段,如动态排序条件。 - 高风险:
${}
由于是直接将参数内容拼接到 SQL 语句中,所以存在 SQL 注入的风险。如果参数值来自不可控的用户输入,那么可能被注入恶意的 SQL 代码。 - 灵活性:尽管风险较高,
${}
在某些场景下是必要的。特别是在 SQL 语句的某些部分无法通过预编译实现,如动态改变表名或某些数据库函数和命令,${}
提供了必要的灵活性。
推荐文章和书籍
文章:https://zhuanlan.zhihu.com/p/86293659
书籍:《 Java 核心技术卷 I 》
欢迎交流
当讨论 MyBatis 中的 #{}
和 ${}
占位符时,我们可以从以下几个角度深入探讨它们的概念、区别和实际应用,以便更好地理解它们在数据库操作中的作用:
1)什么是 #{}
和 ${}
?它们在 MyBatis 中有什么应用?
2)#{}
和 ${}
的工作原理是什么?
3)#{}
和 ${}
在实际应用中的选择标准是什么?
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/3cc40243128afed46b97485301da9405.png)
被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?
引言:在使用 MyBatis 进行数据库操作时,#{} 和 ${} 的区别是面试中常见的问题,对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性,还涉及到性能优化。 题目 被拷打已老实&…...
![](https://www.ngui.cc/images/no-images.jpg)
C# —— while循环语句
作用 让顺序执行的代码 可以停下来 循环执行某一代码块 // 条件分支语句: 让代码产生分支 进行执行 // 循环语句 : 让代码可以重复执行 语法 while循环 while (bool值) { 循环体(条件满足时执行的代码块) …...
![](https://www.ngui.cc/images/no-images.jpg)
力扣第205题“同构字符串”
在本篇文章中,我们将详细解读力扣第205题“同构字符串”。通过学习本篇文章,读者将掌握如何使用哈希表来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述 力扣第205题“…...
![](https://www.ngui.cc/images/no-images.jpg)
探索RESTful API开发,构建可扩展的Web服务
介绍 当我们浏览网页、使用手机应用或与各种互联网服务交互时,我们经常听到一个术语:“RESTful API”。它听起来很高深,但实际上,它是构建现代网络应用程序所不可或缺的基础。 什么是RESTful API? 让我们将RESTful …...
![](https://www.ngui.cc/images/no-images.jpg)
苹果安卓网页的H5封装成App的应用和原生开发的应用有什么不一样?
H5封装类成App的应用和原生应用有什么不一样?——一对比谈优缺点 1. 开发速度和复用性 H5封装的App优势:一次编写,多平台运行。你只需要使用一种语言编写代码,就可以发布到不同的平台,降低开发成本。 原生应用优势&…...
![](https://img-blog.csdnimg.cn/direct/6c21d0d12ff847a295045c7fd9884632.png)
IO流2.
字符流-->字符流的底层其实就是字节流 public class Stream {public static void main(String[] args) throws IOException {//1.创建对象并关联本地文件FileReader frnew FileReader("abc\\a.txt");//2.读取资源read()int ch;while((chfr.read())!-1){System.out…...
![](https://img-blog.csdnimg.cn/img_convert/d7d17ac7c5a51d445b96467555d18e86.png)
详解MySQL中的PERCENT_RANK函数
目录 1. 引入1. 基本使用2:分组使用3:处理重复值4. 使用优势4.1 手动计算百分等级4.2 使用 PERCENT_RANK 的优势4.3 使用 PERCENT_RANK 5. 总结 在 MySQL 中,PERCENT_RANK 函数用于计算一个值在其分组中的百分等级。 它的返回值范围是从 0 …...
![](https://www.ngui.cc/images/no-images.jpg)
宏任务与微任务
一、宏任务 1、概念 指消息队列中等地被主线程执行的事件 2、种类 script主代码块、setTimeout 、setInterval 、nodejs的setImmediate 、MessageChannel(react的fiber用到)、postMessage、网络I/O、文件I/O、用户交互的回调等事件、UI渲染事件&#x…...
![](https://img-blog.csdnimg.cn/direct/675a9a89743f47e3953f4e87fecabd3c.png)
昇思大模型学习·第一天
mindspore快速入门回顾 导入mindspore包 处理数据集 下载mnist数据集进行数据集预处理 MnistDataset()方法train_dataset.get_col_names() 打印列名信息使用create_tuple_iterator 或create_dict_iterator对数据集进行迭代访问 网络构建 mindspore.nn: 构建所有网络的基类用…...
![](https://www.ngui.cc/images/no-images.jpg)
python调用chatgpt
简单写了一下关于文本生成接口的调用,其余更多的调用方法可在官网查看 import os from dotenv import load_dotenv, find_dotenv from openai import OpenAI import httpxdef gpt_config():# 为了安全起见,将key写到当前项目根目录下的.env文件中# find…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
YOLOV8 目标检测:训练自定义数据集
1、下载 yolov8项目:ultralytics/ultralytics:新增 - PyTorch 中的 YOLOv8 🚀 > ONNX > OpenVINO > CoreML > TFLite --- ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreM…...
![](https://www.ngui.cc/images/no-images.jpg)
动态更新自建的Redis连接池连接数量
/*** 定时更新Redis连接池信息,防止资源让费*/private static final ScheduledThreadPoolExecutor DYNAMICALLY_UPDATE_REDIS_POOL_THREAD new ScheduledThreadPoolExecutor(1, new ThreadFactory() {Overridepublic Thread newThread(Runnable r) {Thread thread …...
![](https://img-blog.csdnimg.cn/img_convert/aee397b06ba36642473154c62e149bf1.jpeg)
浅谈设计师的设计地位
在当今这个创意无限的时代,设计师的地位日益凸显。他们以独特的视角和精湛的技能,为我们的生活带来了无尽的色彩与灵感。然而,随着行业的不断发展,设计师如何在众多同行中脱颖而出,提升自己的设计地位呢?答…...
![](https://img-blog.csdnimg.cn/direct/5dc90995f188426fbf10e52186e26390.png)
C/C++ string模拟实现
1.模拟准备 1.1因为是模拟string,防止与库发生冲突,所以需要命名空间namespace隔离一下,我们来看一下基本内容 namespace yx {class string{private://char _buff[16]; lunix下小于16字节就存buff里char* _str;size_t _size;size_t _capac…...
![](https://www.ngui.cc/images/no-images.jpg)
微信小程序学习(八):behaviors代码复用
小程序的 behaviors 方法是一种代码复用的方式,可以将一些通用的逻辑和方法提取出来,然后在多个组件中复用,从而减少代码冗余,提高代码的可维护性。 如果需要 behavior 复用代码,需要使用 Behavior() 方法,…...
![](https://www.ngui.cc/images/no-images.jpg)
【The design pattern of Attribute-Based Dynamic Routing Pattern (ADRP)】
In ASP.NET Core, routing is one of the core functionalities that maps HTTP requests to the corresponding controller actions. While “Route-Driven Design Pattern” is a coined name for a design pattern, we can construct a routing-centric design pattern base…...
![](https://img-blog.csdnimg.cn/direct/4678eaa9cd764a6081cf727b9bed74e2.png)
2713. 矩阵中严格递增的单元格数
题目 给定一个 m x n 的整数矩阵 mat,我们需要找出从某个单元格出发可以访问的最大单元格数量。移动规则是可以从当前单元格移动到同一行或同一列的任何其他单元格,但目标单元格的值必须严格大于当前单元格的值。需要返回最大可访问的单元格数量。 示例…...
![](https://www.ngui.cc/images/no-images.jpg)
git创建子模块
有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。 Git …...
![](https://img-blog.csdnimg.cn/img_convert/15772684e351acbe69ec48f6bd0e4f48.png)
把Deepin塞进U盘,即插即用!Deepin To Go来袭
前言 小伙伴之前在某篇文章下留言说:把Deepin塞进U盘的教程。 这不就来了吗? 事实是可以的。这时候你要先做点小准备: 一个大小为8GB或以上的普通U盘 一个至少64GB或以上的高速U盘 一个Deepin系统镜像文件 普通U盘的大概介绍࿱…...
![](https://www.ngui.cc/images/no-images.jpg)
给【AI硬件】创业者的论文、开源项目和产品整理
一、AI 硬件精选论文 《DrEureka: Language Model Guided Sim-To-Real Transfer》 瑜伽球上遛「狗」这项研究由宾夕法尼亚大学、 NVIDIA 、得克萨斯大学奥斯汀分校的研究者联合打造,并且完全开源。他们提出了 DrEureka(域随机化 Eureka)&am…...
![](https://www.ngui.cc/images/no-images.jpg)
模拟面试题卷二
1. 什么是JavaEE框架,你能列举一些常用的JavaEE框架吗? 答:JavaEE框架是一套用于开发企业级应用的技术规范和工具集合。常用的JavaEE框架有Spring、Hibernate、Struts、JSF等。 2. 请解释一下面向对象技术和设计原则是什么,你能…...
![](https://img-blog.csdnimg.cn/direct/86358c2e9e9a4527a0c83176612d0f0d.png#pic_center)
22种常用设计模式示例代码
文章目录 创建型模式结构型模式行为模式 仓库地址https://github.com/Xiamu-ssr/DesignPatternsPractice 参考教程 refactoringguru设计模式-目录 创建型模式 软件包复杂度流行度工厂方法factorymethod❄️⭐️⭐️⭐️抽象工厂abstractfactory❄️❄️⭐️⭐️⭐️生成器bui…...
![](https://www.ngui.cc/images/no-images.jpg)
Java面试题:对比ArrayList和LinkedList的内部实现,以及它们在不同场景下的适用性
ArrayList和LinkedList是Java中常用的两个List实现,它们在内部实现和适用场景上有很大差异。下面是详细的对比分析: 内部实现 ArrayList 数据结构:内部使用动态数组(即一个可变长的数组)实现。存储方式:…...
![](https://img-blog.csdnimg.cn/direct/a6e2790b02974d54a13cde83d8b2a92d.png)
ping: www.baidu.com: 未知的名称或服务(IP号不匹配)
我用的是VMware上的Red Hat Enterprise Linux 9,出现了能联网但ping不通外网的情况。 问题描述:设置中显示正常连接,而且虚拟机右上角有联网的图标,但不能通外网。 按照网上教程修改了/etc/resolv.conf和/etc/sysconfig/network-…...
![](https://www.ngui.cc/images/no-images.jpg)
谷神前端组件增强:子列表
谷神Ag-Grid导出Excel // 谷神Ag-Grid导出Excel let allDiscolumns detailTable.getAllDisColumns() let columnColIds columns.map(column > column.colId) let columnKeys columnColIds.filter(item > ![select, "_OPT_FIELD_"].includes(item)) detailT…...
![](https://www.ngui.cc/images/no-images.jpg)
测试cudaStream队列的深度
测试cudaStream队列的深度 一.代码二.编译运行[得出队列深度为512] 以下代码片段用于测试cudaStream队列的深度 方法: 主线程一直发任务,启一个线程cudaEventQuery查询已完成的任务,二个计数器的值相减 一.代码 #include <iostream> #include <thread> #include …...
![](https://img-blog.csdnimg.cn/direct/96ded3aab3934973a136d55ddffa64de.png)
海康威视 isecure center 综合安防管理平台任意文件上传漏洞
文章目录 前言声明一、漏洞描述二、影响版本三、漏洞复现四、修复方案 前言 海康威视是以视频为核心的智能物联网解决方案和大数据服务提供商,业务聚焦于综合安防、大数据服务和智慧业务。 海康威视其产品包括摄像机、多屏控制器、交通产品、传输产品、存储产品、门禁产品、消…...
![](https://img-blog.csdnimg.cn/direct/e27fd83e9de24d52adc6d7f3e18b6b8b.png)
shadertoy-安装和使用
一、安装vscode 安装vscode流程 二、安装插件 1.安装glsl编辑插件 2.安装shader toy插件 三、创建glsl文件 test.glsl文件 float Grid(float size, vec2 fragCoord) {vec2 r fragCoord / size;vec2 grid abs(fract(r - 0.5) - 0.5) / fwidth(r);float line min(grid…...
![](https://img-blog.csdnimg.cn/direct/840a3063432544eeb4796bef8dfe48a8.png)
matlab线性多部法求常微分方程数值解
用Adamas内差二步方法,内差三步方法,外差二步方法,外差三步方法这四种方法计算。 中k为1和2. k为2和3 代码 function chap1_adams_methodu0 1; T 2; h 0.1; N T/h; t 0:h:T; solu exact1(t);f f1; u_inter_2s adams_inter_2steps(…...
![](https://img-blog.csdnimg.cn/direct/51d0251a1d3f4ee388638b70e1e09743.png)
前端页面实现【矩阵表格与列表】
实现页面: 1.动态表绘制(可用于矩阵构建) <template><div><h4><b>基于层次分析法的权重计算</b></h4><table table-layout"fixed"><thead><tr><th v-for"(_, colI…...
![](/images/no-images.jpg)
济南网站建设公司电子商务网站/seo 优化案例
虚拟列表示那列的数据不是存储在表中的,只有当虚拟列的值被查询时,该值被计算出来。 语法: column_name [datatype] [generated always] as (expression) [virtual] eg: salary as (round(salary*(1commission/100),2)) salary number gener…...
企业微信下载/seo综合查询站长工具怎么用
整数转换英文表示273.整数转换英文表示题目描述思路:模拟273.整数转换英文表示 题目描述 整数转换英文表示 思路:模拟 使用百、十、二十以内组合小于1000的数,大于1000的数以3个3个为一节进行递归处理。 class Solution:def numberToWor…...
![](/images/no-images.jpg)
廊坊网站建设企业/房地产市场现状分析
2.3.1 栈在括号匹配中的应用 #include <stdio.h> #include <stdlib.h> #include <stddef.h>#define true 1; #define false 0;#define MaxSize 50 typedef struct {char data[MaxSize];int top; } SqStack;// 1、初始化栈 // 2、判空操作 // 3、进栈 // 4、…...
![](/images/no-images.jpg)
网站开发主流技术线路介绍/个人免费开发app
一、网站安全 1、公司自有框架safeCheck函数。 /*** safeCheck() 参数检查,并防XSS 和 SQL注入* * param mixed $str * param bool $number 是否做数字检查 1-(默认)数字 0-不是数字* param bool $script 是否过滤script 1-(默…...
![](/images/no-images.jpg)
开发区建设集团网站/使用百度地图导航收费吗
1、 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?、 可以有多个类,但只能有一个public的类,并且public的类名与文件名相同 2、 Java有没有goto? Java中的保留字࿰…...
![](/images/no-images.jpg)
wordpress 自定义模版/艾滋病多长时间能查出来
5.26——工作记录前言过程总结重点前言 目标:1.准备查询的基础sql 2.查询页面, 3.点击设备编码按钮的显示 4.图片 过程 deviceStatusPerceptionEventInfoCommon.jsp <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &…...