当前位置: 首页 > news >正文

【mybatis】详解 # 和 $ 的区别,两者分别适用于哪种场景,使用 $ 不当会造成什么影响

# 和 $ 的区别

在MyBatis中,# 和 $ 是用来处理参数的两种不同方式,它们之间有一些重要的区别:

# 符号

# 是用来进行参数占位符的,它会进行 SQL 注入防护。使用 # 时,MyBatis 会将参数值进行预处理,以防止 SQL 注入的问题。

当你在 SQL 语句中使用 #{parameterName} 时,MyBatis 会将 parameterName 所代表的参数值转义,安全地插入 SQL 语句中。

例如:

SELECT * FROM users WHERE username = #{username}

如果 username 是一个用户输入的值,MyBatis 会处理这个值并确保不会引起 SQL 注入。

$ 符号

$ 用于直接插入参数值,不进行任何处理。这意味着使用 $ 的时候,如果参数包含恶意 SQL 代码,可能会导致 SQL 注入问题。

当你在 SQL 语句中使用 ${parameterName} 时,MyBatis 会直接将 parameterName 的值替换到 SQL 语句中。

例如:

SELECT * FROM ${tableName}

如果 tableName 是用户输入的值,直接插入可能会导致安全风险。

总结:

  • **使用 #**:安全,参数经过转义,防止 SQL 注入。适用于 SQL 中的条件值或数据列。
  • **使用 $**:不安全,参数不经过处理,直接替换。一般用于列名、表名等需要动态命名的场景,但需谨慎使用。

在实际使用中,建议优先使用 #,只有在确实需要动态 SQL 结构时才考虑使用 $,并确保传入的内容是安全可信的。

#{} 和${} 区别

1. #{}:预编译处理, ${}:字符直接替换
2. #{} 可以防⽌SQL注⼊, ${}存在SQL注⼊的⻛险, 查询语句中, 可以使⽤ #{} ,推荐使⽤ #{}
3. 但是⼀些场景, #{} 不能完成, ⽐如 排序功能, 表名, 字段名作为参数时, 这些情况需要使⽤${}
4. 模糊查询虽然${}可以完成, 但因为存在SQL注⼊的问题,所以通常使⽤mysql内置函数concat来完成

sql注入

下面是一个示例,展示了如何通过使用 $ 符号导致 SQL 注入的情况

假设我们有一个 MyBatis 的 Mapper XML 文件,其中定义了一个可插入表名的 SQL 查询:

<mapper namespace="com.example.UserMapper"><select id="getUsersByTable" resultType="com.example.User">SELECT * FROM ${tableName} WHERE username = #{username}</select>
</mapper>

在这个查询中,${tableName} 采用了 $ 符号,表示我们希望动态插入一个表名,而 #{username} 采用了 # 符号,确保了对用户输入的 username 进行了安全的处理。

SQL 注入示例:

假设调用这个方法的 Java 代码如下:

String userInputTableName = "users; DROP TABLE users; --"; // 用户输入的表名
String username = "exampleUser";List<User> users = userMapper.getUsersByTable(userInputTableName, username);

在上面的代码中,userInputTableName 是来源于不受信任的用户输入。如果用户输入了恶意的 SQL 片段 users; DROP TABLE users; --,那么最终生成的 SQL 会是:

SELECT * FROM users; DROP TABLE users; -- WHERE username = 'exampleUser'

这个查询会导致数据库首先执行 SELECT * FROM users;,然后在同一个执行上下文中执行 DROP TABLE users;,从而将 users 表删除。

解决方案:

为了防止这种 SQL 注入,应该避免在 SQL 语句中使用 ${} 直接插入来自用户的输入。应该采用以下做法:

  1. 使用预定义表名:使用固定值或通过查证安全的值来避免用户直接输入可能的表名。
  2. 使用 # 符号:对于需要而不应该通过用户直接控制的内容,避免动态 SQL。

例如,我们可以用一个枚举(或其他安全措施)来限制表名:

// 使用合法的表名,防止SQL注入
List<User> users = userMapper.getUsersByTable("users", username);

总之,任何时候都应谨慎对待 SQL 的构建,特别是涉及到用户输入时,确保不使用 $ 来动态插入外部输入内容,以防止 SQL 注入漏洞。

# 与 $ 分别适用的场景

在 MyBatis 中,# 和 $ 各自适用于不同的场景。下面结合代码示例来描述它们的适用场景

使用 # 的场景

# 符号用于安全地绑定参数,适合用于绑定查询条件、列值等情境,确保参数得到转义以避免 SQL 注入。

示例

<mapper namespace="com.example.UserMapper"><select id="getUserByUsername" resultType="com.example.User">SELECT * FROM users WHERE username = #{username}</select>
</mapper>

使用方式

String username = "exampleUser";
User user = userMapper.getUserByUsername(username);

在这个示例中,#{username} 会被 MyBatis 安全处理,防止 SQL 注入。这里 # 的使用是非常合适的,因为 username 由用户输入,可能会包含潜在的恶意内容。

使用 $ 的场景

$ 符号用于动态构建 SQL 中的结构,比如表名或列名等,适合参数值是已知的、受控的,不需要转义的场景。使用市在容易导致 SQL 注入时,要十分谨慎,仅在确实安全的情况下才使用。

示例

<mapper namespace="com.example.UserMapper"><select id="getUsersByTableName" resultType="com.example.User">SELECT * FROM ${tableName} WHERE username = #{username}</select>
</mapper>

使用方式

String tableName = "users"; // 确保这是一个受控值
String username = "exampleUser";
List<User> users = userMapper.getUsersByTableName(tableName, username);

在这个示例中,${tableName} 用于动态选择表名。在实际使用中,tableName 应该是一个固定的值,确保不会来自于不受信任的用户输入,以避免 SQL 注入。

总结

  • 使用 # 的场景

    • 查询条件、列值等动态内容
    • 任何来自用户输入的值
    • 需要安全处理以防止 SQL 注入的场景
  • 使用 $ 的场景

    • 动态构建 SQL 的结构部分,如表名和列名
    • 受控且安全的值,不应直接来自用户输入

在编写 MyBatis SQL 时,务必小心选择使用 # 或 $ 以保护应用程序的安全性。建议优先使用 #,只有在必要且安全的情况下才使用 $

相关文章:

【mybatis】详解 # 和 $ 的区别,两者分别适用于哪种场景,使用 $ 不当会造成什么影响

# 和 $ 的区别 在MyBatis中&#xff0c;# 和 $ 是用来处理参数的两种不同方式&#xff0c;它们之间有一些重要的区别&#xff1a; # 符号&#xff1a; # 是用来进行参数占位符的&#xff0c;它会进行 SQL 注入防护。使用 # 时&#xff0c;MyBatis 会将参数值进行预处理&…...

【MySQL】索引 面试题

文章目录 适合创建索引的情况创建索引的注意事项MySQL中不适合创建索引的情况索引失效的常见情况 索引定义与作用 索引是帮助MySQL高效获取数据的有序数据结构&#xff0c;通过维护特定查找算法的数据结构&#xff08;如B树&#xff09;&#xff0c;以某种方式引用数据&#xf…...

QT调用Sqlite数据库

QT设计UI界面&#xff0c;后台访问数据库&#xff0c;实现数据库数据的增删改查。 零售商店系统 数据库表&#xff1a; 分别是顾客表&#xff0c;订单详情表&#xff0c;订单表&#xff0c;商品表 表内字段详情如下&#xff1a; 在QT的Pro文件中添加sql&#xff0c;然后添加头…...

Flutter富文本实现学习

Flutter 代码如何实现一个带有富文本显示和交互的页面。 前置知识点学习 RealRichText RealRichText 和 ImageSpan 不是 Flutter 框架中内置的组件&#xff0c;而是自定义的组件或来自第三方库。这些组件的实现可以提供比标准 RichText 更丰富的功能&#xff0c;比如在富文本…...

实现某海外大型车企(T)Cabin Wi-Fi 需求的概述 - 4

大家好&#xff0c;我是Q&#xff0c;邮箱&#xff1a;1042484520qq.com。 今天我们在上几讲的基础上再扩展下 Cabin Wi-Fi 的功能需求&#xff0c;讲讲如何使能 5G TCU Wi-Fi STA Bridge 模式。 参考&#xff1a; 实现某海外大型车企&#xff08;T&#xff09;Cabin Wi-Fi 需求…...

【GeekBand】C++设计模式笔记15_Proxy_代理模式

1. “接口隔离” 模式 在组件构建过程中&#xff0c;某些接口之间直接的依赖常常会带来很多问题&#xff0c;甚至根本无法实现。采用添加一层间接&#xff08;稳定&#xff09;接口&#xff0c;来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式 FacadeProxyAdapte…...

项目练习:若依系统的svg-icon功能实现

文章目录 一、svg图片准备二、自定义Svg组件三、svg插件开发四、Svg组件使用 一、svg图片准备 src/assets/icons/svg 其中svg目录里&#xff0c;存放了所需要的图片 index.js import Vue from vue import SvgIcon from /components/SvgIcon// svg component// register glob…...

【踩坑/Linux】Vmware中的Ubuntu虚拟机无法访问互联网

Vmware中的Ubuntu虚拟机无法访问互联网 首先前提是我的系统是Ubuntu 16.04系统&#xff0c;vmware workstation选择的是NAT模式&#xff0c;虚拟机内连不上网络 ping www.baidu.com ping: unknown host www.baidu.com首先检查 DNS 解析服务&#xff1a;在虚拟机中打开命令提示…...

深入了解SpringIoc(续篇)

目录 注入 Bean 的方式有哪些? 构造函数注入还是 Setter 注入? Bean 的作用域有哪些? Bean 是线程安全的吗? Bean 的生命周期了解么? 注入 Bean 的方式有哪些? 依赖注入 (Dependency Injection, DI) 的常见方式&#xff1a; 构造函数注入&#xff1a;通过类的构造函…...

嵌入式硬件面试题

1、请问什么是通孔、盲孔和埋孔&#xff1f;孔径多大可以做机械孔&#xff0c;孔径多小必须做激光孔&#xff1f;请问激光微型孔可以直接打在元件焊盘上吗&#xff0c;为什么&#xff1f; 通孔是贯穿整个PCB的过孔&#xff0c;盲孔是从PCB表层连接到内层的过孔&#xff0c;埋孔…...

散斑/横向剪切/迈克尔逊/干涉条纹仿真技术分析

摘要 本博文提供了多种数据类型的干涉条纹仿真&#xff0c;并展示了它们对应的散斑干涉条纹。还分别给出了横向剪切干涉以及剪切散斑干涉条纹的仿真。 一、迈克尔逊干涉与散斑干涉仿真 下图为干涉条纹与对应的散斑干涉条纹的仿真示意图。其中&#xff0c;干涉条纹可认为是源…...

ViiTor实时翻译 2.2.1 | 完全免费的高识别率同声传译软件

ViiTor实时翻译是一款完全免费的实时语音翻译和同声传译软件&#xff0c;支持即时翻译、对话翻译、语音转文字、文本语音合成和AR翻译等功能。它的语音识别和翻译准确率特别高&#xff0c;速度非常快&#xff0c;音质高&#xff0c;并支持6种音色切换。该软件简单易用&#xff…...

uniapp实现为微信小程序扫一扫的功能

引言 随着微信小程序的快速发展,越来越多的开发者开始关注和学习微信小程序的开发。其中,微信小程序的扫一扫功能是非常常用且实用的功能之一。通过扫描二维码,用户可以获取到相关的信息或者实现特定的功能。 正文 在过去,开发者需要使用微信开发者工具以及相关的开发文档…...

ospf 的 状态机详解

OSPF&#xff08;开放最短路径优先&#xff0c;Open Shortest Path First&#xff09;协议的状态机是其核心部分之一&#xff0c;用于确保路由器之间的邻接关系&#xff08;neighbor relationship&#xff09;建立和路由信息的交换。OSPF的状态机模型由多个状态组成&#xff0c…...

ElementPlus 自定义封装 el-date-picker 的快捷功能

文章目录 需求分析 需求 分析 我们看到官网上给出的案例如下&#xff0c;但是不太满足我们用户想要的快捷功能&#xff0c;因为不太多&#xff0c;因此需要我们自己封装一些&#xff0c;方法如下 外部自定义该组件的快捷内容 export const getPickerOptions () > {cons…...

【面试系列】深入浅出 Spring Boot

熟悉SpringBoot&#xff0c;对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解&#xff1b; 面试题 Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f;Spring Boot的自动配置原理是什么&#xff1f;你如何理解 Spring Boot 配置…...

太阳能LED路灯智能控制系统(论文+源码)

1系统的功能及方案设计 本次课题为太阳能LED路灯智能控制系统&#xff0c;其系统整体架构如图2.1所示&#xff0c;太阳能板通过TP4056充电模块给锂电池进行充电&#xff0c;电池通过HX3001升压模块进行升压到5V给整个控制系统进行供电&#xff0c;控制系统由AT89C52单片机作为…...

使用 PyQt5 构建高效的文件分类与管理工具

当我们处理大量图片或文件时&#xff0c;经常会需要一款方便、高效的工具来快速分类、整理和管理它们。今天&#xff0c;我将分享一个用 PyQt5 构建的实用项目&#xff0c;涵盖图片分类、文件夹管理、撤销功能&#xff0c;以及动态界面操作的实现。从设计到代码细节&#xff0c…...

谷歌浏览器 Chrome 提示:此扩展程序可能很快将不再受支持

问题现象 在Chrome 高版本上的扩展管理页面&#xff08;地址栏输入chrome://extensions/或者从界面进入&#xff09;&#xff1a; &#xff0c; 可以查看到扩展的情况。 问题现象大致如图: 问题原因 出现此问题的根本原因在于&#xff1a;谷歌浏览器本身的扩展机制发生了…...

肿瘤电场仪疗法原理:科技之光,照亮抗癌之路

在医疗科技日新月异的今天&#xff0c;肿瘤电场仪疗法作为一种创新的无创治疗手段&#xff0c;正以其独特的物理机制和生物效应&#xff0c;为患者带来了新的治疗选择和希望。本文将深入探讨肿瘤电场仪疗法的原理&#xff0c;揭示其如何在不伤害正常组织的前提下&#xff0c;精…...

scala基础学习_运算符

文章目录 scala运算符算术运算符关系运算符逻辑运算符位运算符其他运算符赋值运算符 scala运算符 在 Scala 中&#xff0c;运算符通常被定义为方法。这意味着你可以将运算符视为对象上的方法调用。以下是一些常用的运算符及其对应的操作&#xff1a; 算术运算符 &#xff1a…...

人工智能与区块链的碰撞:双剑合璧的创新前景

引言 人工智能&#xff08;AI&#xff09;与区块链技术&#xff0c;这两项曾经各自独立发展的前沿科技&#xff0c;如今正逐步走向融合。人工智能通过强大的数据处理能力和智能决策能力&#xff0c;在各个领域掀起了革命性的变革&#xff1b;而区块链凭借其去中心化、不可篡改的…...

信创数据防泄漏中信创沙箱是什么样的安全方案

在信息化与工业化融合创新&#xff08;信创&#xff09;的快速发展中&#xff0c;企业面临着日益复杂的数据安全挑战。SDC沙盒技术以其独特的安全机制和先进的设计理念&#xff0c;为信创环境提供了强有力的数据保护支持。以下是SDC沙盒在信创领域支持能力的几个关键侧重点&…...

在不同操作系统上安装 PostgreSQL

title: 在不同操作系统上安装 PostgreSQL date: 2024/12/26 updated: 2024/12/26 author: cmdragon excerpt: PostgreSQL 是当今最受欢迎的开源关系数据库管理系统之一,由于其强大的功能和灵活性,广泛应用于不同的行业和应用场景。在开始使用 PostgreSQL 之前,用户需要了…...

Linux下编译 libwebsockets简介和使用示例

目录 1&#xff1a;简单介绍&#xff1a; 2&#xff1a;项目地址 3&#xff1a;编译 3.1&#xff1a;集成介绍 3.2&#xff1a;编译 4&#xff1a;客户端服务端示例&#xff1a; 4.1 客户端示例 4.2 服务端示例&#xff1a; 1&#xff1a;简单介绍&#xff1a; Linux下…...

5G CPE接口扩展之轻量型多口千兆路由器小板选型

多口千兆路由器小板选型 方案一: 集成式5口千兆WIFI路由器小板方案二:交换板 + USBwifiUSB WIFI选型一USBwifi选型二:四口千兆选型一四口千兆选型二:四口千兆选型三:部分5G CPE主板不支持Wifi,并且网口数量较少,可采用堆叠方式进行网口和wifi功能 扩展,本文推荐一些路由…...

青少年编程与数学 02-005 移动Web编程基础 02课题、视口与像素

青少年编程与数学 02-005 移动Web编程基础 02课题、视口与像素 一、视口二、布局视口&#xff08;Layout Viewport&#xff09;三、视觉视口&#xff08;Visual Viewport&#xff09;四、理想视口&#xff08;Ideal Viewport&#xff09;五、视口设置关键属性示例代码示例1&…...

深度学习blog-Transformer-注意力机制和编码器解码器

注意力机制&#xff1a;当我们看一个图像或者听一段音频时&#xff0c;会根据自己的需求&#xff0c;集中注意力在关键元素上&#xff0c;以获取相关信息。 同样地&#xff0c;注意力机制中的模型也会根据输入的不同部分&#xff0c;给它们不同的权重&#xff0c;并集中注意力在…...

【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界

【IEEE出版|广东工业大学主办】第五届神经网络、信息与通信工程国际学术会议&#xff08;NNICE 2025&#xff09;_艾思科蓝_学术一站式服务平台 目录 前言 一、Python—— 网络爬虫的绝佳拍档 二、网络爬虫基础&#xff1a;揭开神秘面纱 &#xff08;一&#xff09;工作原…...

【总结整理】 神经网络与深度学习 邱锡鹏 课后习题答案 扩展阅读链接

本文主要针对神经网络神经网络邱锡鹏 2~8 章的课后习题进行理解的过程中&#xff0c;搜索到的讲的会比较透彻的链接整理。适合有一定基础但是想了解更细的人阅读。 主要参考书籍 首先是本书pdf可在神经网络与深度学习获取&#xff1b; 主要参考的课后习题答案为nndl/solution…...

华为手机建议使用adb卸载的app

按需求自行卸载 echo 卸载智慧搜索 adb shell pm uninstall -k --user 0 com.huawei.search echo 卸载智慧助手 adb shell pm uninstall -k --user 0 com.huawei.intelligent echo 卸载讯飞语音引擎 adb shell pm uninstall -k --user 0 com.iflytek.speechsuite echo 卸载快应…...

找到一个linux静态库动态库的好资料.2

# 正文 继续整理从这个页面学到的东西&#xff1a;https://tldp.org/HOWTO/Program-Library-HOWTO 这一篇主要参考这俩&#xff1a; https://tldp.org/HOWTO/Program-Library-HOWTO/introduction.html https://tldp.org/HOWTO/Program-Library-HOWTO/static-libraries.html 这…...

存储块的原理与创建

目录 问题概述 malloc和free 固定块大小分配 设计原理 设计实现 为RTOS提供内存管理与回收机制 问题概述 malloc和free extern void *malloc(unsigned int num_bytes); //malloc向系统申请分配指定size个字节的内存空间。 //返回类型是void *类型 extern void free(void *ptr);…...

RabbitMQ工作模式(详解 工作模式:简单队列、工作队列、公平分发以及消息应答和消息持久化)

文章目录 十.RabbitMQ10.1 简单队列实现10.2 Work 模式&#xff08;工作队列&#xff09;10.3 公平分发10.4 RabbitMQ 消息应答与消息持久化消息应答概念配置 消息持久化概念配置 十.RabbitMQ 10.1 简单队列实现 简单队列通常指的是一个基本的消息队列&#xff0c;它可以用于…...

电脑提示报错NetLoad.dll文件丢失或损坏?是什么原因?

一、NetLoad.dll文件丢失或损坏的根源 程序安装不完整&#xff1a;某些程序在安装过程中可能因为磁盘错误、网络中断或安装程序本身的缺陷&#xff0c;导致NetLoad.dll文件未能正确安装或复制。 恶意软件攻击&#xff1a;病毒、木马等恶意软件可能会篡改或删除系统文件&#x…...

【物联网技术与应用】实验15:电位器传感器实验

实验15 电位器传感器实验 【实验介绍】 电位器可以帮助控制Arduino板上的LED闪烁的时间间隔。 【实验组件】 ● Arduino Uno主板* 1 ● 电位器模块* 1 ● USB电缆*1 ● 面包板* 1 ● 9V方型电池* 1 ● 跳线若干 【实验原理】 模拟电位器是模拟电子元件&#xff0c;模…...

WPF 绘制过顶点的圆滑曲线(样条,贝塞尔)

项目中要用到样条曲线&#xff0c;必须过顶点&#xff0c;圆滑后还不能太走样&#xff0c;捣鼓一番&#xff0c;发现里面颇有玄机&#xff0c;于是把我多方抄来改造的方法发出来&#xff0c;方便新手&#xff1a; 如上图&#xff0c;看代码吧&#xff1a; -------------------…...

YOLOv9-0.1部分代码阅读笔记-assigner.py

assigner.py utils\tal\assigner.py 目录 assigner.py 1.所需的库和模块 2.def select_candidates_in_gts(xy_centers, gt_bboxes, eps1e-9): 3.def select_highest_overlaps(mask_pos, overlaps, n_max_boxes): 4.class TaskAlignedAssigner(nn.Module): 1.所需的库…...

mybatis-plus自动填充时间的配置类实现

mybatis-plus自动填充时间的配置类实现 在实际操作过程中&#xff0c;我们并不希望创建时间、修改时间这些来手动进行&#xff0c;而是希望通过自动化来完成&#xff0c;而mybatis-plus则也提供了自动填充功能来实现这一操作&#xff0c;接下来&#xff0c;就来了解一下mybatis…...

fgets TAILQ_INSERT_TAIL

If you’re using the macros from <sys/queue.h> to implement a circular doubly linked list (TAILQ), the inversion issue occurs because you’re using LIST_INSERT_HEAD, which inserts at the head of the list. Instead, to maintain the original order (FIFO…...

upload-labs关卡记录12

直接上传一句话木马&#xff0c;发现提示&#xff1a; 很明显这是一个白名单&#xff0c;而且不是前端的js检查&#xff0c;而是服务端的检查&#xff0c;因此我们使用bp抓包&#xff0c;改一下文件类型试试&#xff1a; 找到包之后&#xff0c;我们对content-type进行一个更改…...

服务器被攻击怎么办

当服务器遭受恶意流量攻击&#xff0c;如DDoS&#xff08;分布式拒绝服务&#xff09;或CC&#xff08;Challenge Collapsar&#xff09;攻击时&#xff0c;传统的防护措施可能不足以应对。此时&#xff0c;采用高防IP服务可以有效缓解攻击压力&#xff0c;确保业务连续性和数据…...

Node.js 助力前端开发:自动化操作实战

前端开发中&#xff0c;重复性任务如新建文件、配置路由、生成组件等&#xff0c;往往耗时且容易出错。借助 Node.js 的强大能力&#xff0c;我们可以实现开发过程中的自动化操作&#xff0c;提高效率。 文章目录 自动生成 router 配置文件自动生成组件模板动态构建导航菜单自…...

MATLAB符号计算-符号表达式基础运算操作

1.1.2符号变量取值域的限定 默认复数域 【例1-1-2】解不等式 1.1.3创建符号表达式 对符号对象进行各种运算&#xff08;算术运算、关系运算、逻辑运算&#xff09;&#xff0c;即可创建符号表达式。 1.算术运算与转置 【例1-1-3】 f5是f4的共轭转置 f6是f4的转置 2.关系…...

ADB 上传文件并使用脚本监控上传百分比

有个需求&#xff0c;需要测试 emmc的外部连续写入性能&#xff0c;使用 ADB 上传一个巨大的文件。并且在上传到一定值时进行干预。 因此但是 adb push 命令本身会 block 运行并且不返回进度&#xff0c;因此需要一个额外的监控脚本。 上传脚本&#xff1a; echo off setloc…...

深入解析MySQL索引结构:从数组到B+树的演变与优化

前言&#xff1a; 在数据库查询中&#xff0c;索引是一种关键的性能优化工具。然而&#xff0c;索引的失效可能导致查询效率大幅下降。为了更好地理解索引的工作原理及规避其失效&#xff0c;深入了解索引结构的演变过程尤为重要。 MySQL 的索引数据结构从简单到复杂&#xff0…...

【玩转MacBook】JDK安装

下载 JDK 8 官网&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/archive/ 找到 JDK 8 选择&#xff1a; 安装 JDK 双击 .dmg 文件&#xff1a; 继续双击&#xff1a; “继续” “继续” 走到这里&#xff0c;我发现只能选择这个“为这台电脑上的所有…...

word无法创建工作文件,检查临时环境变量。

word无法创建工作文件&#xff0c;检查临时环境变量。 word preview版本&#xff0c;关联打开文件出现报错。word无法创建工作文件&#xff0c;检查临时环境变量。 打开注册表&#xff0c;删除键 Word Preview: HKCR\CLSID{84F66100-FF7C-4fb4-B0C0-02CD7FB668FE} PowerPoint …...

威联通NAS部署openwrt软路由保姆级教程附镜像文件

创作立场&#xff1a;原创不易&#xff0c;拒绝搬运~ hello 大家好&#xff0c;我是你们的老伙伴&#xff0c;稳重的大王~ 本期教程为大家分享&#xff0c;怎么在NAS里面部署软路由&#xff0c;下面是软路由的镜像文件&#xff0c;有两个版本&#xff0c;400M的是定制版~ Sh…...

MySQL共享锁,排他锁

在 MySQL 中&#xff0c;共享锁&#xff08;S 锁&#xff09; 和 排他锁&#xff08;X 锁&#xff09; 是两种主要的锁机制&#xff0c;用于处理事务的并发控制。它们的作用和行为如下&#xff1a; 1. 共享锁 (S 锁) 定义&#xff1a; 共享锁允许事务对某一行数据进行读取&am…...