MySQL-存储过程

news2025/4/7 3:56:49

什么是存储过程


我们前面所学习的MySQL语句都是针对一个表或几个表的单条 SQL 语句,但是在数据库的实际操作中,并非所有操作都那么简单,经常会有一个完整的操作需要多条SQL语句处理多个表才能完成。例如,为了确认学生能否毕业,需要同时查询学生档案表、成绩表和综合表,此时就需要使用多条 SQL 语句来针对几个数据表完成这个处理要求。存储过程可以有效地完成这个数据库操作。

存储过程是数据库存储的一个重要的功能,但是 MySQL 在 5.0 以前并不支持存储过程,这使得 MySQL 在应用上大打折扣。好在 MySQL 5.0 终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。

存储过程是一组为了完成特定功能的 SQL 语句集合。使用存储过程的目的是将常用或复杂的工作预先用 SQL语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程。当以后需要数据库提供与已定义好的存储过程的功能相同的服务时,只需调用“CALL存储过程名字”即可自动完成。

常用操作数据库的 SQL 语句在执行的时候需要先编译,然后执行。存储过程则采用另一种方式来执行 SQL 语句。

一个存储过程是一个可编程的函数,它在数据库中创建并保存,一般由 SQL 语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的特定功能时,存储过程尤为合适。

存储过程通常有如下优点:

  1. 封装性 存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语句,并且数据库专业人员可以随时对存储过程进行修改,而不会影响到调用它的应用程序源代码。

  1. 可增强 SQL 语句的功能和灵活性 存储过程可以用流程控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

  1. 可减少网络流量 由于存储过程是在服务器端运行的,且执行速度快,因此当客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而可降低网络负载。

  1. 高性能 存储过程执行一次后,产生的二进制代码就驻留在缓冲区,在以后的调用中,只需要从缓冲区中执行二进制代码即可,从而提高了系统的效率和性能。

  1. 提高数据库的安全性和数据的完整性 使用存储过程可以完成所有数据库操作,并且可以通过编程的方式控制数据库信息访问的权限。

创建存储过程


MySQL 存储过程是一些 SQL 语句的集合,比如有的时候我们可能需要一大串的 SQL 语句,或者说在编写 SQL语句的过程中还需要设置一些变量的值,这个时候我们就完全有必要编写一个存储过程。下面我们来介绍一下如何创建一个存储过程。 基本语法 可以使用 CREATE PROCEDURE 语句创建存储过程。

语法格式如下:

CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体> [过程参数[,…] ] 格式 [ IN | OUT | INOUT ] <参数名> <类型>

语法说明如下:

  1. 过程名 存储过程的名称,默认在当前数据库中创建。若需要在特定数据库中创建存储过程,则要在名称前面加上数据库的名称,即 db_name.sp_name。需要注意的是,名称应当尽量避免选取与 MySQL 内置函数相同的名称,否则会发生错误。

  1. 过程参数 存储过程的参数列表。其中,<参数名>为参数名,<类型>为参数的类型(可以是任何有效的MySQL 数据类型)。当有多个参数时,参数列表中彼此间用逗号分隔。存储过程可以没有参数(此时存储过程的名称后仍需加上一对括号),也可以有 1 个或多个参数。MySQL 存储过程支持三种类型的参数,即输入参数、输出参数和输入/输出参数,分别用 IN、OUT 和 INOUT三个关键字标识。其中,输入参数可以传递给一个存储过程,输出参数用于存储过程需要返回一个操作结果的情形,而输入/输出参数既可以充当输入参数也可以充当输出参数。需要注意的是,参数的取名不要与数据表的列名相同,否则尽管不会返回出错信息,但是存储过程的 SQL 语句会将参数名看作列名,从而引发不可预知的结果。

  1. 过程体 存储过程的主体部分,也称为存储过程体,包含在过程调用的时候必须执行的 SQL 语句。这个部分以关键字 BEGIN 开始,以关键字 END 结束。若存储过程体中只有一条 SQL 语句,则可以省略 BEGINEND 标志。在存储过程的创建中,经常会用到一个十分重要的 MySQL 命令,即 DELIMITER 命令,特别是对于通过命令行的方式来操作 MySQL 数据库的使用者,更是要学会使用该命令。在 MySQL 中,服务器处理 SQL 语句默认是以分号作为语句结束标志的。然而,在创建存储过程时,存储过程体可能包含有多条 SQL 语句,这些 SQL 语句如果仍以分号作为语句结束符,那么 MySQL 服务器在处理时会以遇到的第一条 SQL 语句结尾处的分号作为整个程序的结束符,而不再去处理存储过程体中后面的 SQL 语句,这样显然不行。为解决这个问题,通常可使用 DELIMITER 命令将结束命令修改为其他字符。

语法格式如下:

DELIMITER $$

语法说明如下: $$ 是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“?”或两个“¥”等。 当使用 DELIMITER 命令时,应该避免使用反斜杠“\”字符,因为它是 MySQL 的转义字符。

在 MySQL 命令行客户端输入如下SQL语句。

mysql > DELIMITER ??

成功执行这条 SQL 语句后,任何命令、语句或程序的结束标志就换为两个问号“??”了。

若希望换回默认的分号“;”作为结束标志,则在 MySQL 命令行客户端输入下列语句即可:

mysql > DELIMITER ;

注意:DELIMITER 和分号“;”之间一定要有一个空格。在创建存储过程时,必须具有 CREATE ROUTINE 权限。可以使用 SHOW PROCEDURE STATUS 命令查看数据库中存在哪些存储过程,若要查看某个存储过程的具体信息,则可以使用 SHOW CREATE PROCEDURE <存储过程名>。

创建不带参数的存储过程

【实例 1】创建名称为 ShowStuScore 的存储过程,存储过程的作用是从学生成绩信息表中查询学生的成绩信息,输入的 SQL 语句和执行过程如下所示。

mysql> DELIMITER //
mysql> CREATE PROCEDURE ShowStuScore()
 -> BEGIN
 -> SELECT * FROM tb_students_score;
 -> END //
Query OK, 0 rows affected (0.09 sec)

创建存储过程 ShowStuScore 后,通过 CALL 语句调用该存储过程的 SQL 语句和执行结果如下所示。

mysql> DELIMITER ;
mysql> CALL ShowStuScore();
+--------------+---------------+
| student_name | student_score |
+--------------+---------------+
| Dany | 90 |
| Green | 99 |
| Henry | 95 |
| Jane | 98 |
| Jim | 88 |
| John | 94 |
| Lily | 100 |
| Susan | 96 |
| Thomas | 93 |
| Tom | 89 |
+--------------+---------------+
10 rows in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)

创建带参数的存储过程

【实例 2】创建名称为 GetScoreByStu 的存储过程,输入参数是学生姓名。存储过程的作用是通过输入的学生姓名从学生成绩信息表中查询指定学生的成绩信息,输入的 SQL 语句和执行过程如下所示。

mysql> DELIMITER //
mysql> CREATE PROCEDURE GetScoreByStu
 -> (IN name VARCHAR(30))
 -> BEGIN
 -> SELECT student_score FROM tb_students_score
 -> WHERE student_name=name;
 -> END //
Query OK, 0 rows affected (0.01 sec)

创建存储过程 GetScoreByStu 后,通过 CALL 语句调用该存储过程的 SQL 语句和执行结果如下所示。

mysql> DELIMITER ;
mysql> CALL GetScoreByStu('Green');
+---------------+
| student_score |
+---------------+
| 99 |
+---------------+
1 row in set (0.03 sec)
Query OK, 0 rows affected (0.03 sec)

修改存储过程


在实际开发过程中,业务需求修改的情况时有发生,这样,不可避免的需要修改 MySQL 中存储过程的特征 。基本语法 可以使用 ALTER PROCEDURE 语句修改存储过程的某些特征。

语法格式如下:

ALTER PROCEDURE <过程名> [ <特征> … ]

提示:这个语法用于修改存储过程的某些特征,如要修改存储过程的内容,可以先删除该存储过程,再重新创建。

修改存储过程的内容和名称 修改存储过程的内容可以通过删除原存储过程,再以相同的命名创建新的存储过

程。

修改存储过程的名称可以通过删除原存储过程,再以不同的命名创建新的存储过程。

删除存储过程


当 MySQL 数据库中存在废弃的存储过程是,我们需要将它从数据库中删除。 基本语法 存储过程被创建后,保存在数据库服务器上,直至被删除。可以使用 DROP PROCEDURE 语句删除数据库中已创建的存储过程。

语法格式如下:

DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] <过程名>

语法说明如下:

  1. 过程名 指定要删除的存储过程的名称。

  1. IF EXISTS 指定这个关键字,用于防止因删除不存在的存储过程而引发的错误。 注意:存储过程名称后面没有参数列表,也没有括号,在删除之前,必须确认该存储过程没有任何依赖关系,否则会导致其他与之关联的存储过程无法运行。

删除存储过程 删除存储过程 GetScoreByStu,查看存储过程的运行结果如下所示。

mysql> DROP PROCEDURE GetScoreByStu;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL GetScoreByStu('Green');
ERROR 1305 (42000): PROCEDURE test_db.GetScoreByStu does not exist

判断存储过程


IF

语法如下:

CREATE
    PROCEDURE sp_name ([proc_parameter[,...]])
    routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

routine_body:
    Valid SQL routine statement

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

创建一个student表并插入三条数据

mysql> create table student(
    -> id int,
    -> name varchar(30),
    -> score float);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into student values(1,'z3',30),(2,'l4',60),(3,'w5',90);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

创建存储过程,输入“a”返回大于等于60分数的学生信息,输入“b”返回大于等于80分数的学生信息,输入“c”返回大于等于90分数的学生信息,输入其他字符串则返回全部学生信息。

mysql> delimiter $$
mysql> create procedure t1(in chars varchar(10))
    -> begin
    -> if chars="a" then
    -> select * from student where score>=60;
    -> elseif chars="b" then
    -> select * from student where score>=80;
    -> elseif chars="c" then
    -> select * from student where score>=90;
    -> else select * from student;
    -> end if;
    -> end $$
Query OK, 0 rows affected (0.08 sec)

mysql> delimiter ;
mysql> call t1("a");
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    2 | l4   |    60 |
|    3 | w5   |    90 |
+------+------+-------+
2 rows in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> call t1("b");
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    3 | w5   |    90 |
+------+------+-------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call t1("c");
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    3 | w5   |    90 |
+------+------+-------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call t1("abc");
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    1 | z3   |    30 |
|    2 | l4   |    60 |
|    3 | w5   |    90 |
+------+------+-------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

CASE

语法如下:

CREATE
    PROCEDURE sp_name ([proc_parameter[,...]])
    routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

routine_body:
    Valid SQL routine statement

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

同样,上面使用的if语法创建存储过程,这次使用case语法创建。输入“a”返回大于等于60分数的学生信息,输入“b”返回大于等于80分数的学生信息,输入“c”返回大于等于90分数的学生信息,输入其他字符串则返回全部学生信息。

mysql> create procedure t2(in chars varchar(10))
    -> begin
    -> case chars
    -> when "a" then select * from student where score>=60;
    -> when "b" then select * from student where score>=80;
    -> when "c" then select * from student where score>=90;
    -> else select * from student;
    -> end case;
    -> end$$
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;
mysql> call t2("a");
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    2 | l4   |    60 |
|    3 | w5   |    90 |
+------+------+-------+
2 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call t2("b");
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    3 | w5   |    90 |
+------+------+-------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call t2("c");
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    3 | w5   |    90 |
+------+------+-------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call t2("d");
+------+------+-------+
| id   | name | score |
+------+------+-------+
|    1 | z3   |    30 |
|    2 | l4   |    60 |
|    3 | w5   |    90 |
+------+------+-------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

循环存储过程


WHILE

语法如下:

CREATE
    PROCEDURE sp_name ([proc_parameter[,...]])
    routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

routine_body:
    Valid SQL routine statement

Name: 'DECLARE VARIABLE'
Description:
Syntax:
DECLARE var_name [, var_name] ... type [DEFAULT value]

Syntax:
WHILE search_condition DO
    statement_list
END WHILE

创建循环存储过程,实现1+2+3+4...100(我算过了和为5050)while先判断后执行(条件满足情况下,则执行循环体内容,不满足,则结束循环),详情看下面命令吧。

mysql> create procedure t3()
    -> begin
    -> declare num int default 0;            #定义num默认值为0
    -> declare summ int default 0;            #定义summ默认值为0
    -> while num<=100 do                    #num小于等于100后停止
    -> set summ=summ+num;                    #第一次循环为0,第二次为num上次循环的结果
    -> set num=num+1;                        #num+1继续循环
    -> end while;                            #跳过满足循环后跳出
    -> select summ;                            #打印出summ循环相加的结果
    -> end $$                                #结束
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call t3();
+------+
| summ |
+------+
| 5050 |
+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

上面的命令虽然实现了循环,但是局限性很大只能打印出加到100,也就是说每次打印的都是5050,如果这次我们需要的更多呢?下面可以使用参数代替。

mysql> delimiter $$
mysql> create procedure t4(in a int)
    -> begin
    -> declare num int default 0;
    -> declare summ int default 0;
    -> while num<=a do
    -> set summ=summ+num;
    -> set num=num+1;
    -> end while;
    -> select summ;
    -> end $$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call t4(10);
+------+
| summ |
+------+
|   55 |
+------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

mysql> call t4(1000);
+--------+
| summ   |
+--------+
| 500500 |
+--------+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

REPEAT

语法如下:

CREATE
    PROCEDURE sp_name ([proc_parameter[,...]])
    routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

routine_body:
    Valid SQL routine statement

    Syntax:
REPEAT
    statement_list
UNTIL search_condition
END REPEAT

下面的循环也是根据1+2+3...+100,但是和while不同的是repeat的结构是先执行后判断(先执行相关操作 ,再判断是否满足条件,满足,结束循环)。

mysql> delimiter $$
mysql> create procedure t5(in a int)
    -> begin
    -> declare num int default 0;
    -> declare summ int default 0;
    -> repeat
    -> set summ=summ+num;
    -> set num=num+1;
    -> until num>a end repeat;
    -> select summ;
    -> end $$
Query OK, 0 rows affected (0.05 sec)

mysql> delimiter ;
mysql> call t5(10);
+------+
| summ |
+------+
|   55 |
+------+
1 row in set (0.02 sec)

Query OK, 0 rows affected (0.03 sec)

mysql> call t5(100);
+------+
| summ |
+------+
| 5050 |
+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

学习不是一两天的事,活到老学到老,坚持下去总有一天会有成果。MySQL专栏持续更新,对你有帮助的话收藏起来吧!

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

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

相关文章

015 - C++ 类与结构体对比

今天这期我们主要解决一个问题&#xff0c;就是 C 中的类和结构体有什么区别。 上一期我们讲类的时候&#xff0c; 我们对类有了一些基本的介绍&#xff0c;在本期的学习开始之前你可以先看看那一期。 本期我们有两个术语&#xff0c;结构体 struct&#xff0c;它是 structur…

【终结扩散模型】Consistency Models.OpenAI开源新模型代码,一步成图,1秒18张

【终结扩散模型】Consistency Models.OpenAI开源新模型代码&#xff0c;一步成图&#xff0c;1秒18张0、前言Abstract1. Introduction2. Diffusion Models3. Consistency Models3.1 Definition3.2 Parameterization3.3 Sampling3.4 Zero-Shot Data Editing4. Training Consiste…

MySQL运维13-数据库性能测试

文章目录1、数据库性能指标1.1、事务吞吐率1.2、响应时间2、数据库性能测试的目的3、数据库性能测试的注意事项4、数据库性能测试工具选型4.1、sysbench4.2、mysqlslap5、sysbench测试介绍5.1、sysbench的安装5.1.1、sysbench的正常安装步骤5.1.2、安装中的异常处理5.2、sysben…

数据结构|二叉树的三种遍历方式,你掌握了几种?

目录 1、遍历方式 2、前序遍历 3、中序遍历 1、遍历方式 学习二叉树的结构&#xff0c;最简单的方式就是遍历二叉树。遍历二叉树就是通过某条线路对二叉树的各个结点进行一次访问&#xff0c;访问的方法有三种分为前序遍历、中序遍历、后续遍历&#xff0c;层序遍历它们的遍…

TryHackMe-Year of the Fox(Linux渗透测试)

Year of the Fox 你能熬过狡猾的狐狸吗&#xff1f; 端口扫描 循例nmap 有个域名&#xff0c;加入hosts SMB枚举 smbmap enum4linux -a&#xff0c;枚举到两个账户 Web枚举 进80发现需要登录 上hydra RCE to Getshell 进来可以查看一些文件 bp发现这里存在过滤 burpfuzz一…

数据结构---作业1时间复杂度

本专栏是对自我的平时作业错题及掌握知识不牢固的地方的总结专栏. 1.大O是一个渐进表示法&#xff0c;不会去表示精确的次数&#xff0c;cpu的运算速度很快&#xff0c;估计精确的没有意义。 2. 此函数有一个循环&#xff0c;但是循环没有被执行n次&#xff0c;i每次都是2倍进…

再不转型为ChatGPT程序员,有遭受降维打击的危险

Open AI在演示GPT-4的时候&#xff0c;有这么一个场景&#xff1a;给一个界面草图&#xff0c;就可以生成网页代码。这个演示非常简单&#xff0c;如果界面原型比较复杂呢&#xff1f;像这样&#xff1a;ChatGPT能不能直接生成HTML, CSS,JavaScript代码&#xff0c;把这个网页给…

【MySQL】表的约束

前言 hi~大家好呀&#xff0c;欢迎来到我的MySQL学习笔记系列~ 继上次数据类型的描述&#xff0c;这篇笔记重点记录DDL-数据定义语言对表的结构中的其他约束条件进行说明&#xff0c;以便让关系型数据库真正的保持完整性。 我的上一篇MySQL笔记~ 【MySQL】表的操作和数据类型_柒…

OpenCV实战之人脸美颜美型(七)——美颜demo

前言 之前我们已经完成了人脸检测、肤色检测、磨皮、美白功能,这一篇文章中我们将尝试利用OpenCV中的滑动条对象,结合窗口制作一个简单的demo。demo中会将上述功能集成进来,并通过滑动条来调整美白、磨皮力度观察其效果,先放一张效果图如下。 滑动条 OpenCV中可通过crea…

【Fluent】Run can not be started until validation issues are resolved.

一、问题背景 因为在fluent中用Discard Data, Replace Mesh选项替换了网格&#xff0c;但是没有抛弃算例设置等参数。 当时我以为网格是完全一样的&#xff0c;便忽略了产生冲突/错误的可能。 之后在calculate的时候&#xff0c;报错&#xff1a;Run can not be started unt…

联盟链是虚构的?没有用的?用FISCO BCOS来展示链委员这件事

前言 当前区块链大都使用的是投票决定这种方法&#xff0c;但是如何使现实中的投票转换到区块链中&#xff0c;如何让举手表决变得更加智能&#xff0c;如何让投票透明、安全、权威&#xff0c;这是区块链的一大设计思路&#xff0c;有很多人觉得联盟链是个梦&#xff0c;是个虚…

分享一个国内可用的免费ChatGPT网站

背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 作为一个程序员&#xff0c;我也忍不住做了一个基于ChatGPT的网站&#xff0c;免费&#xff01;免登陆&#xff01;&#xff01;国内可直接对话ChatGPT&#xff0c;也…

十年磨一剑,你要的低代码平台在这里

目录低代码平台现状没有创新的“拼凑”&#xff0c;没有好东西ivx平台是什么ivx与其他平台的区别产品思路不同用户不同学习价值不同应用范围不同有无框架限制总结低代码开发平台已成为企业数字化转型和应用程序开发的重要工具。它们提供了一种快速创建和部署应用程序的方法&…

【MySQL】DDL数据库、表的创建与管理

一、基本概念 1、从系统架构的层面来看&#xff0c;数据库从大到小依次是数据库服务器(上面安装了DBMS和数据库)、数据库(也称database或者schema)、数据表、数据表的行与列 二、创建和管理数据库 1、创建数据库 直接创建&#xff1a;CREATE DATABASE 数据库名;(使用默认的…

这篇文章价值很大:股票历史分时成交数据怎么简单获取?【干货】

文章目录前言一、准备二、使用步骤1.引入库2&#xff0c;使用这个API查询历史分时数据&#xff1a;3.查询完整历史分时数据4.其他查询方法参数格式&#xff1a;[(市场代码, 股票代码), ...]参数&#xff1a;市场代码, 股票代码, 文件名, 起始位置, 数量参数&#xff1a;市场代码…

【MySQL】(3)约束

文章目录表的约束空属性默认值列描述zerofill主键概念使用 alter 添加和删除主键联合主键如何设计主键自增长唯一键外键表的约束 所谓约束&#xff0c;就是不让你做某事&#xff0c;约束的存在&#xff0c;有助于程序员和用户合法合理地使用数据库。 数据类型其实就是对字段的…

【C++】位图的概念

文章目录位图的引入什么是位图位图的应用bitset的使用定义方式成员函数bitset的运算符重载>> 及 << 运算符赋值,关系,复合赋值,单目运算符[]重载位图的引入 无序的40亿个不重复的无符号整数,给一个无符号整数,如何判断一个数是否在这40亿个数中【腾讯面试题】 方法…

记一次浏览器下载错误处理-失败网络错误

背景 最近在自己电脑上Chrome浏览器正常使用&#xff0c;但只要是下载软件&#xff0c;就会在下载几十秒后&#xff0c;自动停止&#xff0c;报失败-网络错误&#xff0c;导致文件都下载不成功&#xff0c;如下图。 猜测是更改了哪块的配置&#xff0c;导致一直中断&#xff0…

28岁,终于从字节退休了...

大厂一直是每个程序员都向往职业目标&#xff0c;大厂意味着薪资高、福利好、倍有面儿&#xff0c;而且发展空间也大。甚至有人调侃不想进大厂的程序员不是好程序员。 而在网上&#xff0c;也有各个网友分享自己在大厂的经历&#xff0c;在某平台还有一个近2600万浏览的话题&a…

JavaEE——了解Spring,容器,Ioc,DI相关概念

目录 一、Spring 是什么 二、什么是容器 三、什么是loC 1. 什么是 IoC 2. 传统程序开发和控制反转式程序开发 (1). 传统程序开发 (2). 控制反转式程序开发 (3). 对比 3. Spring的功能 4. 将对象存放到容器中的好处 四、DI概念说明 IoC和DI的联系和区别&#xff1f;…