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

⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述



1. 介绍

存储过程

  • 🚀什么是存储过程?
    • 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的
    • 存储过程思想上很简单,就是数据库SQL语言层面的代码封装与重用。

  • 🚀存储过程的特点?
    • 代码的封装,复用
    • 可以接收参数,也可以返回数据
    • 减少网络交互,提升效率



2. 使用

存储过程的使用

  • 🚀创建存储过程:

    • -- DELIMITER关键字将SQL语句结束符号改为‘$$’,在创建存储过程后再改回‘;’
      -- 这是为了避免SQL语句的结束符号与END结束符号冲突,导致1064异常
      DELIMITER $$CREATE PROCEDURE 存储过程名称([参数列表])
      BEGIN-- SQL语句
      END$$DELIMITER ;
      

  • 🚀存储过程的调用:

    • CALL 存储过程名称([参数]);
      

  • 🚀查看存储过程的信息:

    • -- 查询指定数据库的存储过程及状态信息
      SELECT * FROM INFORMATION_SCHEMA.`ROUTINES` WHERE ROUTINE_SCHEMA = '数据库名称';-- 查询某个存储过程的定义语句
      SHOW CREATE PROCEDURE 存储过程名称;
      

  • 🚀删除存储过程:

    • DROP PROCEDURE [IF EXISTS] 存储过程名称;
      



3. 变量

①系统变量

系统变量

  • 系统变量:是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)会话变量(SESSION)

  • 🚀查看系统变量:

    • #SESSION 或 GLOBAL 如果不指定,默认为SESSION
      -- 查看所有系统变量
      SHOW [SESSION | GLOBAL] VARIABLES;-- 通过LIKE模糊匹配方式查看系统变量
      SHOW [SESSION | GLOBAL] VARIABLES LIKE '....';-- 查看指定系统变量的值
      SELECT @@[SESSION | GLOBAL].系统变量名;
      
      • -- 演示-- 查看所有session级别系统变量
        SHOW VARIABLES;
        #或
        SHOW SESSION VARIABLES;-- 模糊匹配AUTO开头的系统变量
        SHOW SESSION VARIABLES LIKE 'AUTO%';
        SHOW GLOBAL VARIABLES LIKE 'AUTO%';-- 查看名为AUTOCOMMIT的系统变量
        SELECT @@GLOBAL.AUTOCOMMIT;
        SELECT @@SESSION.AUTOCOMMIT;
        

  • 🚀设置系统变量

    • #SESSION 或 GLOBAL 如果不指定,默认为SESSION
      SET [SESSION | GLOBAL] 系统变量名 = 自定义值;
      SET @@[SESSION | GLOBAL].系统变量名 = 自定义值;
      

注意

  • 设置或查看系统变量时,SESSION 或 GLOBAL 如果不指定,**默认为SESSION **。
  • MySQL服务重新启动后,所设置的全局变量都会重置,想要不失效,可以在配置文件/etc/my.cnf文件中配置。



② 用户定义变量

用户定义变量

  • 用户定义变量:是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用“@变量名”使用就可以。其作用域为当前连接

  • 🚀用户定义变量的赋值**(4种方式)** :

    • -- var_name:用户定义变量名,由用户自定义
      -- expr:用户定义变量的值,由用户自定义
      #方式一:
      SET @var_name = expr [,@var_name = expr]...;
      #方式二:
      SET @var_name := expr [,@var_name := expr]...;
      #方式三:
      SELECT @var_name := expr [,@var_name := expr]...;
      #方式四(将查询结果赋值给变量):
      SELECT 字段名 INTO @var_name FROM 表名;
      

  • 🚀用户定义变量的使用:

    • -- var_name:用户定义变量名,由用户自定义
      SELECT @var_name [,@var_name...];
      

注意:用户定义的变量无需对其进行声明或初始化,不声明或初始化获取到的值为NULL。



③ 局部变量

局部变量

  • 局部变量:是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN...END块。

  • 🚀声明局部变量:

    • DECLARE 变量名 变量类型 [DEFAULT...];
      
    • 变量类型:就是数据库字段类型:INT,BIGINT,CHAR,VARCHAR,DATE,TIME等。


  • 🚀为局部变量赋值:

    • SET 变量名 =;
      SET 变量名 :=;
      SELECT 字段名 INTO 变量名 FROM 表名 WHERE 查询条件...;
      



4. 条件判断语句IF

  • 🚀 语法

    • IF 条件1 THEN-- 执行逻辑
      ELSEIF 条件2 THEN   -- 可选-- 执行逻辑
      ELSE               -- 可选-- 执行逻辑
      END IF;	
      
      • -- 演示
        /*
        给成绩打分
        分数score >= 80 结果result就是优秀
        分数80 > score >= 60 结果result就是优秀
        分数score < 60 结果result就是不及格
        */
        DELIMITER $$CREATE PROCEDURE p3()
        BEGINDECLARE score INT DEFAULT 58;DECLARE result VARCHAR(10);IF score >= 80 THENSET result = '优秀';ELSEIF score >= 60 THENSET result = '合格';ELSESET result = '不合格';END IF;SELECT result;
        END$$DELIMITER ;
        



5. 参数传递

参数

在这里插入图片描述


  • 🚀参数传递的用法:

    • DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGIN-- SQL语句
      END$$DELIMITER ;
      
      • -- 演示
        /*
        1. 根据传入(in)参数score,判定当前分数对应的分数等级,并返回(out)
        分数score >= 80 结果result就是优秀
        分数80 > score >= 60 结果result就是优秀
        分数score < 60 结果result就是不及格
        */
        DELIMITER $$CREATE PROCEDURE p4(IN score INT,OUT result VARCHAR(10))
        BEGINIF score >= 80 THENSET result = '优秀';ELSEIF score >= 60 THENSET result = '合格';ELSESET result = '不合格';END IF;
        END$$DELIMITER ;-- 调用存储过程,查看返回结果。
        CALL p4(100,@result);
        SELECT @result;-- 2. 传入两百分制数,转换为一百分制数输出(inout)
        DELIMITER $$CREATE PROCEDURE p5(INOUT score DOUBLE)
        BEGINSET score = score * 0.5;
        END$$DELIMITER ;-- 设置自定参数传入,获取转换后的参数。
        SET @score = 180;
        CALL p5(@score);
        SELECT @score;
        



6. CASE语句

  • 🚀CASE语法一:

  • 如果when_value = case_value,就会执行对应THEN后面的statement_list逻辑

    • -- 存储过程中使用CASE
      DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGINCASE case_valueWHEN when_value1 THEN statement_list1[WHEN when_value2 THEN statement_list2][ELSE statement_list]END CASE;
      END$$DELIMITER ;
      

  • 🚀CASE语法二:

  • 如果search_condition的结果为TRUE,就会执行对应THEN后面的statement_list逻辑

    • -- 存储过程中使用CASE
      DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGINCASEWHEN search_condition1 THEN statement_list1[WHEN search_condition2 THEN statement_list2][ELSE statement_list]END CASE;
      END$$DELIMITER ;



7. 循环语句

①while循环

while

  • while循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。具体语法为:

    • -- 先判定条件,条件结果为TRUE则执行逻辑,否则不执行语句。
      WHILE 条件 DO#SQL逻辑
      END WHILE;
      
    • -- 存储过程中使用WHILE
      DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGINWHILE 条件 DO#SQL逻辑END WHILE;
      END$$DELIMITER ;
      



②repeat循环

repeat:

  • repeat是有条件的循环控制语句,当满足条件的时候退出循环 。具体语法为:

    • -- 先执行一次逻辑,然后判定逻辑是否为True,如果True则退出循环,不满足判定则继续循环。
      REPEAT#SQL逻辑UNTIL 条件
      END REPEAT;
      
    • -- 存储过程中使用REPEAT
      DELIMITER $$CREATE PROCEDURE 存储过程名称([IN | OUT | INOUT 参数名 参数类型])
      BEGINREPEAT#SQL逻辑UNTIL 条件END REPEAT;
      END$$DELIMITER ;
      



③loop循环

loop

  • LOOP实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其来实现简单的死循环。LOOP可以配合一下两个语句使用
    • LEVEL:配合循环使用,退出循环。
    • ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。

  • 🚀loop循环语法:

    • -- begin_label: 是标记
      -- end_label 是结束标记
      [begin_label:] LOOP#SQL逻辑
      END LOOP [end_label];
      
    • -- 退出指定label标记的循环体
      LEVEL label;-- 跳过本次循环,直接进入下一次循环
      ITERATE label;
      



8. 游标 和 条件处理程序

①游标 cursor

cursor

  • 游标(CURSOR)
  • 是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明OPENFETCHCLOSE

  • 🚀游标的声明:

    • DECLARE 游标名称 CURSOR FOR 查询语句;
      

  • 🚀打开游标:

    • OPEN 游标名称;
      

  • 🚀获取游标记录:

    • FETCH 游标名称 INTO 变量1[,变量2,...];
      

  • 🚀关闭游标:

    • CLOSE 游标名称;
      



②条件处理程序 Handler

Handler

  • 条件处理程序(Handler)

  • 可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤 。具体语法为:

    • -- 语法
      DECLARE handler_action HANDLER FOR
      condition_value [,condition_value,...] 
      statement;-- handler_action的解释:
      CONTINUE #继续执行当前程序
      EXIT     #终止执行当前程序-- condition_value的解释:
      SQLSTATE 'lstate_value' #状态码,如02000
      SQLWARNING		#所有01开头的SQLSTATE代码的简写
      NOT FOUND		#所有02开头的SQLSTATE代码的简写
      SQLEXCEPTION	#所有没有被SQLWARNING或NOT FOUND捕获的代码的简写-- statement解释
      /*
      程序满足condition_value就会执行handler_action,
      执行完handler_action操作后就会执行statement的操作
      */


③使用案例

  • 演示

    • – 要求:
      /*
      根据传入的参数uage,来查询用户表tb_user中,
      所有的用户年龄小于等于uage的用户姓名(name)和专业(profession),
      并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中。
      */

      – 逻辑:
      – 1.声明游标,存储查询结果集
      – 2.准备:创建表结构
      – 3.开启游标
      – 4.获取游标中的记录
      – 5.插入数据到新表
      – 6.关闭游标

    • #修改结束标志,避免代码无法正常执行完毕
      DELIMITER $$CREATE PROCEDURE p11(IN uage INT)
      BEGIN#声明第4步使用的变量DECLARE uname VARCHAR(50);DECLARE uprofession VARCHAR(11);#1.声明游标,存储查询结果集DECLARE u_cursor CURSOR FOR SELECT NAME,profession FROM tb_user WHERE age <= uage;#声明条件处理程序Handler,#满足NOT FOUND就执行exit操作#执行完后,关闭游标:CLOSE u_cursor。-- 这个handler的目的是:若游标内没有数据,直接退出并关闭游标DECLARE EXIT HANDLER FOR NOT FOUND CLOSE u_cursor;#2.准备:创建表结构DROP TABLE IF EXISTS tb_user_pro;CREATE TABLE IF NOT EXISTS tb_user_pro(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(50) NOT NULL,profession VARCHAR(11));#3.开启游标OPEN u_cursor;#4.获取游标中的记录(循环)WHILE TRUE DO#获取游标数据存入变量FETCH u_cursor INTO uname,uprofession;#5.插入数据到新表INSERT INTO tb_user_pro VALUES(NULL,uname,uprofession);END WHILE;#6.关闭游标CLOSE u_cursor;
      END$$#恢复原本的结束标志
      DELIMITER ; -- 调用存储过程
      CALL P11(60);
      -- 查看是新表否达到要求
      SELECT * FROM tb_user_pro;
      



9. 存储函数

存储函数

  • 存储函数是有返回值的存储过程,存储函数的参数只能是IN类型。

  • 🚀存储函数的使用:

    • -- 语法:
      DELIMITER $$CREATE FUNCTION 存储函数名称([参数列表])
      RETURNS type [characteristic...]
      BEGIN-- SQL语句RETURN...;
      END $$DELIMITER ;#######################################-- characteristic的解释:
      DETERMINISTIC  #相同的输入参数总是产生相同的结果
      NO SQL         #不包含SQL语句
      READS SQL DATA #包含读取数据的语句,但不包含写入数据的语句。
      

  • 演示

    • 使用存储函数,实现从1到n的累加

    • -- 使用存储函数,实现从1到n的累加
      DELIMITER $$CREATE FUNCTION f(n INT)
      RETURNS INT DETERMINISTIC
      BEGIN-- SQL语句DECLARE total INT DEFAULT 0;WHILE n > 0 DOSET total = total + n;SET n = n - 1;END WHILE;-- 返回RETURN total;
      END $$DELIMITER ;-- 验证结果
      SELECT f(100);
      




在这里插入图片描述

相关文章:

⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ MySQL存储过程 1. 介绍2. 使用3. 变量①系统变…...

使用SpringBoot进行游戏服务器开发

背景&#xff1a; 之前一直只考虑用JavaSe进行游戏服务器开发&#xff0c;目前项目使用了Spring&#xff0c;发现还是非常好的&#xff0c;好处如下: 好处1:依赖注入非常方便&#xff0c;我们只使用Spring最基本的功能即可&#xff0c;这样子就算是有一些模块不使用Spring管理…...

数据结构——树状数组

文章目录 前言问题引入问题分析树状数组lowbit树状数组特性初始化一个树状数组更新操作前缀和计算区间查询 总结 前言 原题的连接 最近刷leetcode的每日一题的时候&#xff0c;遇到了一个区间查询的问题&#xff0c;使用了一种特殊的数据结构树状数组&#xff0c;学习完之后我…...

Untiy 使用RotateAround()方法实现物体围绕某个点或者某个物体旋转

Untiy 实现物体围绕指定点或者某个物体旋转&#xff0c;可使用RotateAround()方法。 语法&#xff1a; public void RotateAround(Vector3 point, Vector3 axis, float angle); 其中&#xff0c;point:旋转中心点位置&#xff1b; axis:要围绕的轴&#xff0c;如x,y,z angel…...

图像分类(五) 全面解读复现ResNet

解读 Abstract—摘要 翻译 更深的神经网络往往更难以训练&#xff0c;我们在此提出一个残差学习的框架&#xff0c;以减轻网络的训练负担&#xff0c;这是个比以往的网络要深的多的网络。我们明确地将层作为输入学习残差函数&#xff0c;而不是学习未知的函数。我们提供了非…...

使用html2canvas转换table为图片时合并单元格rowspan失效,无边框显示问题解决(React实现)

最近使用 html2canvas导出Table表单为图片&#xff0c;但是转换出的图片被合并的单元格没有显示边框 查了原因是因为我为tr设置了背景色&#xff0c;然后td设置了rowspan&#xff0c;设置了rowspan的单元格就会出现边框不显示的问题。 解决方法就是取消tr的背景色&#xff0c;然…...

pandas教程:Time Series Basics 时间序列基础

文章目录 11.2 Time Series Basics&#xff08;时间序列基础&#xff09;1 Indexing, Selection, Subsetting&#xff08;索引&#xff0c;选择&#xff0c;取子集&#xff09;2 Time Series with Duplicate Indices&#xff08;重复索引的时间序列&#xff09; 11.2 Time Seri…...

【C++初阶】STL详解(四)vector的模拟实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…...

Zookeeper学习笔记(2)—— Zookeeper API简单操作

前置知识&#xff1a;Zookeeper学习笔记&#xff08;1&#xff09;—— 基础知识-CSDN博客 Zookeeper集群搭建部分 前提&#xff1a;保证zookeeper集群处于启动状态 环境搭建 依赖配置 <dependencies><dependency><groupId>junit</groupId><arti…...

YOLOv8-Seg改进:Backbone改进 |Next-ViT堆栈NCB和NTB 构建先进的CNN-Transformer混合架构

🚀🚀🚀本文改进:Next-ViT堆栈NCB和NTB 构建先进的CNN-Transformer混合架构,包括nextvit_small, nextvit_base, nextvit_large,相比较yolov8-seg各个版本如下: layersparametersgradientsGFLOPsnextvit_small61033841075...

DocCMS keyword SQL注入漏洞复现 [附POC]

文章目录 DocCMS keyword SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 DocCMS keyword SQL注入漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测…...

利用(Transfer Learning)迁移学习在IMDB数据上训练一个文本分类模型

1. 背景 有些场景下&#xff0c;开始的时候数据量很小&#xff0c;如果我们用一个几千条数据训练一个全新的深度机器学习的文本分类模型&#xff0c;效果不会很好。这个时候你有两种选择&#xff0c;1.用传统的机器学习训练&#xff0c;2.利用迁移学习在一个预训练的模型上训练…...

pom.xml格式化快捷键

在软件开发和编程领域&#xff0c;"格式化"通常指的是将代码按照一定的规范和风格进行排列&#xff0c;以提高代码的可读性和维护性。格式化代码有助于使代码结构清晰、统一&#xff0c;并符合特定的编码规范。 格式化可以包括以下方面&#xff1a; 缩进&#xff1a…...

【短文】【踩坑】可以在Qt Designer给QTableWidge添加右键菜单吗?

2023年11月18日&#xff0c;周六上午 今天早上在网上找了好久都没找到教怎么在Qt Designer给QTableWidge添加右键菜单的文章 答案是&#xff1a;不可以 在Qt Designer中无法直接为QTableWidget添加右键菜单。 Qt Designer主要用于创建界面布局和设计&#xff0c;无法直接添加…...

Git常用配置

git log 美化输出 全局配置参数 git config --global alias.lm "log --no-merges --color --dateformat:%Y-%m-%d %H:%M:%S --authorghost --prettyformat:%Cred%h%Creset - %Cgreen(%cd)%C(yellow)%d%Cblue %s %C(bold blue)<%an>%Creset --abbrev-commit"…...

力扣每日一题-数位和相等数对的最大和-2023.11.18

力扣每日一题&#xff1a;数位和相等数对的最大和 开篇 这道每日一题还是挺需要思考的&#xff0c;我绕晕了好久&#xff0c;根据题解的提示才写出来。 题目链接:2342.数位和相等数对的最大和 题目描述 代码思路 1.创建一个数组存储每个数位的数的最大值&#xff0c;创建一…...

【win32_001】win32命名规、缩写、窗口

整数类型 bool类型 使用注意&#xff1a; 一般bool 的false0&#xff1b;true1 | 2 | …|n false是为0&#xff0c;true是非零 不建议这样用&#xff1a; if (result TRUE) // Wrong! 因为result不一定只返回1&#xff08;true&#xff09;&#xff0c;当返回2时&#xff0c…...

机器学习第8天:SVM分类

文章目录 机器学习专栏 介绍 特征缩放 示例代码 硬间隔与软间隔分类 主要代码 代码解释 非线性SVM分类 结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 介绍 作用&#xff1a;判别种类 原理&#xff1a;找出一个决策边界&#xff0c;判断数据所处区域来识别种类 简单…...

AI工具合集

网站&#xff1a;未来百科 | 为发现全球优质AI工具产品而生 (6aiq.com) 如今&#xff0c;AI技术涉及到了很多领域&#xff0c;比如去水印、一键抠图、图像处理、AI图像生成等等。站长之家之前也分享过一些&#xff0c;但是在网上要搜索找到它们还是费一些功夫。 今天发现了一…...

代码随想录算法训练营Day 54 || 392.判断子序列、115.不同的子序列

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…...

蓝牙抓包不求人:从HCI日志里‘挖’出Link Key的两种实用方法(附安卓路径)

蓝牙安全逆向实战&#xff1a;从HCI日志中提取Link Key的深度解析在蓝牙协议安全研究领域&#xff0c;Link Key作为设备配对认证的核心凭证&#xff0c;其获取方式一直是逆向工程师关注的焦点。许多安全审计场景下&#xff0c;我们往往只能获得加密后的HCI通信日志&#xff0c;…...

Hitboxer:开源SOCD清理工具,3分钟提升游戏操作精准度

Hitboxer&#xff1a;开源SOCD清理工具&#xff0c;3分钟提升游戏操作精准度 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否在激烈的游戏对抗中经历过这样的挫败&#xff1a;同时按下左右方向键时角色卡…...

第二周(第12周)

1.单电源供电的二阶低通滤波器2.功率放大电路...

2026年,揭秘那些真正安全的原生态食材厂家你不可不知的秘密

随着人们生活水平的提升以及对健康的日益重视&#xff0c;选择真正安全的原生态食材已经成为许多人购买食物的标准。但市场的繁杂使得甄别真正安全的食材厂家变得愈加困难。今天&#xff0c;我将通过几个关键角度&#xff0c;为大家揭秘那些真正安全的原生态食材厂家的秘密&…...

Python合并Excel文档

有若干个Excel文档&#xff0c;每个文档格式一致&#xff0c;及第一行为文件标题&#xff0c;第二行为表格表头&#xff08;表头不完全一致&#xff09;。现需要将他们合并。合并规则为&#xff1a;去掉每个文档的第一行&#xff0c;以第二行为表头&#xff0c;将每个文档的第三…...

3分钟掌握HashCalculator:你的文件完整性守护专家

3分钟掌握HashCalculator&#xff1a;你的文件完整性守护专家 【免费下载链接】HashCalculator 哈希值计算工具&#xff0c;批量计算/批量校验/查找重复文件/改变哈希值等&#xff0c;支持集成到系统右键菜单 项目地址: https://gitcode.com/gh_mirrors/ha/HashCalculator …...

基于ESP32与MQTT的家庭环境监测系统:从传感器选型到数据可视化实战

1. 项目概述与核心价值最近几年&#xff0c;我身边越来越多的朋友开始关注家里的空气质量、温湿度这些看不见摸不着&#xff0c;但又实实在在影响生活舒适度和健康的环境指标。从新装修的房子担心甲醛&#xff0c;到有老人小孩的家庭在意PM2.5和二氧化碳浓度&#xff0c;再到南…...

深度解析网络设备权限管理工具:中兴光猫工厂模式与Telnet服务完整指南

深度解析网络设备权限管理工具&#xff1a;中兴光猫工厂模式与Telnet服务完整指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 在当今网络设备管理领域&#xff0c;获取设备完整控制…...

收藏干货|2026 版企业 AI 落地实操指南,程序员小白入门避坑必备

如今人工智能早已脱离概念炒作阶段&#xff0c;全面扎根企业实际业务场景&#xff0c;成为技术从业者与企业管理者无法回避的发展课题。各行各业都加速布局AI赛道&#xff0c;行业心态也从初期观望试探&#xff0c;彻底转变为实打实的落地攻坚。 不少企业高层主动牵头统筹AI规划…...

Python-for-Android 完整指南:5分钟将Python应用打包为Android APK

Python-for-Android 完整指南&#xff1a;5分钟将Python应用打包为Android APK 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android Python-for-Android&#xff0…...