MySQL高阶之存储过程

什么是存储过程?

存储过程可称为过程化SQL语言,是在普通SQL语句的基础上增加了编程语言的特点,把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中,通过逻辑判断、循环等操作实现复杂计算的程序语言。

换句话说,存储过程其实就是数据库内置的一种编程语言,这种编程语言也有自己的变量、if语句、循环语句等。在一个存储过程中可以将多条SQL语句以逻辑代码的方式将其串联起来,执行这个存储过程就是将这些SQL语句按照一定的逻辑去执行,所以一个存储过程也可以看做是一组为了完成特定功能的SQL语句集。每一个存储过程都是一个数据库对象,就像table和view一样,存储在数据库当中,一次编译永久有效。并且每一个存储过程都有自己的名字。客户端程序(Java程序)通过存储过程的名字来调用存储过程。

在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。

储存过程的优点和缺点:

优点:速度快

缺点:不可移植,例如需要换orcle数据库,不能轻易切换需要重新根据orcle数据库的语法再写一遍,所以不推荐在开发中使用(如果实在不能提升效率可以考虑)并且编写难度大,维护性也差

第一个存储过程

创建存储过程确实通常会使用 BEGIN 和 END 关键字来定义存储过程中的SQL语句块。这些关键字有助于明确指示存储过程中语句的开始和结束位置,特别是在包含多条语句或复杂逻辑时

示例:

从 emp 表中查询 empno 和 ename 两个字段。过程使用了 begin 和 end 关键字来明确定义 SQL 语句的起止。这里是存储过程的具体代码:

create procedure p1()
beginselect empno, ename from emp;
end;

这个存储过程没有定义输入参数,当调用 call p1(); 时,它会执行这个 select 查询并返回 emp 表中所有行的 empno 和 ename 字段。

删除存储过程

drop procedure if exists p1;

delimiter的解释

其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。 
默认情况下,delimiter是分号;。

delimiter //; #表示遇到俩个斜杠再执行,修改sql语句的结束符(在命令行中使用)

存储过程的查看

1. 查看创建存储过程的语句:

show create procedure p1;

2. 可以通过系统表 information_schema.routines查看存储过程的状态信息

在MySQL中,只要创建一个存储过程对象,在information_schema.routines 系统表当中就会增加一条记录,这条记录是专门描述存储过程对象状态的。

information_schema.routines 系统表当中存储的不仅仅是存储过程的状态信息,也包括函数对象,触发器对象等等状态信息

语句:

查看系统表当中所有的表:

desc information_schema.routines

指定查看某个表

SELECT *FROM information_schema.routines
WHERE routine_name = 'p1';

这里的关键字段解释如下:

  • SPECIFIC_NAME:存储过程的具体名称,可以用于唯一标识过程(含参数)。
  • ROUTINE_NAME:存储过程的名称(简称,不含参数)。
  • ROUTINE_TYPE:例程的类型,这里是 "PROCEDURE",表示这是一个存储过程,不是函数。
  • ROUTINE_SCHEMA:存储过程所在的数据库名。
  • DATA_TYPE:如果是函数,会显示返回数据的类型;存储过程这一栏通常为空。
  • CREATED:创建存储过程的日期和时间。
  • LAST_ALTERED:最后修改存储过程的日期和时间。
  • ROUTINE_DEFINITION:存储过程的定义,即具体的 SQL 代码。

如何使用这些信息

  • 查询存储过程的详情:你可以通过类似的查询来了解数据库中所有存储过程的详细信息,帮助你理解和管理这些存储过程。
  • 维护和更新存储过程:了解存储过程的最后修改时间和定义可以帮助你维护和更新这些存储过程。

变量

系统变量:

1. 系统变量的分类

  • 全局变量(Global Variables):影响整个MySQL服务器,适用于所有的会话。全局变量的修改可能需要管理员权限,并且可以通过 SET GLOBAL 语句进行更改。全局变量在服务器启动时从配置文件加载,并且大部分全局变量可以动态修改,但有些需要重启服务器才能生效。

  • 会话变量(Session Variables):每个客户端会话都有自己的会话变量副本,改变一个会话变量只会影响当前会话。可以通过 SET SESSION 语句更改会话变量,会话结束后变量会恢复默认值。

2. 查看系统变量

  • 查看所有全局变量:
    SHOW GLOBAL VARIABLES;
  • 查看所有会话变量:
    SHOW SESSION VARIABLES;
  • 查看特定变量:
    SHOW GLOBAL VARIABLES LIKE 'variable_name';
    SHOW SESSION VARIABLES LIKE 'variable_name';
    

使用 LIKE 进行模糊查询

如果你大致知道变量的名称,但不确定具体名称,可以使用 LIKE 关键字进行查询。例如:

  • SHOW VARIABLES LIKE '%char%';:查找包含“char”的所有系统变量。
  • SHOW VARIABLES LIKE '%commit%';:查找包含“commit”的所有系统变量。

3. 设置系统变量

  • 设置全局变量:使用 SET GLOBAL,通常需要管理员权限。修改后,其他新会话将使用修改后的变量值,现有会话不会受影响。
    SET GLOBAL max_connections = 200;
  • 设置会话变量:使用 SET SESSION,仅影响当前会话。
    SET SESSION sql_mode = 'STRICT_ALL_TABLES';# 设置事务为手动提交
    select @@autocommit; #这个是自动提交
    select @@autocommit = 0; #这个是手动提交

    如果只使用 SET 而不指定 GLOBALSESSION 关键字,默认情况下修改的是会话变量。

持久性

  • 动态变量修改的持久性:通过SET GLOBAL修改的变量在服务器关闭后会失效,重新启动服务器时会从配置文件加载原始值。因此,若要使某些设置永久生效,必须修改MySQL配置文件。
  • 会话变量的持久性:会话变量在每次会话开始时初始化为全局变量的值,修改会话变量不会影响其他会话或持久化。

用户变量

1. 用户变量的定义

  • 用户变量以 @ 符号开头,可以通过 SETSELECT INTO 来赋值。
  • 变量名是大小写不敏感的,并且可以是字母、数字或下划线的组合。

2. 用户变量的赋值方法

1) 使用 SET 语句

使用 SET 语句直接给用户变量赋值。用户变量可以存储任何数据类型,MySQL会自动根据赋值内容确定类型。

SET @var_name = value;
#设置变量值,给变量赋值
select @email = '2367889@qq.com'; #不推荐,因为在sql中,等号有判断是否相等的作用
select @email := '2367889@qq.com';

2) 使用 SELECT INTO 语句

通过 SELECT 查询结果给用户变量赋值。常用于查询单个值并保存到变量中。

SELECT column_name INTO @var_name FROM table_name WHERE condition;
# 将查询结果赋给变量
select money into @m from account where name = '张三';
#mysq1中变量不需要声明。直接赋值就行。如果没有声明变量,直接读取该变量,返回nu11
select @m;

3) 使用 := 赋值符号(推荐使用)

在表达式中使用 := 为用户变量赋值。这种方式经常出现在查询语句中。

SET @var_name := value;

用户变量的作用范围

  • 会话范围:用户变量的作用范围仅限于当前会话(连接)。一旦会话结束,用户变量也随之销毁。
  • 跨查询使用:用户变量可以在同一会话的多个查询中使用,起到临时存储数据的作用。

 注意事项

  • 未定义的用户变量:在使用一个未初始化的用户变量时,MySQL不会报错,而是自动将其值设为 NULL

    SELECT @undefined_var; -- 结果为 NULL
  • 赋值后的值变化:一旦用户变量被赋值后,可以在整个会话中反复使用。会话结束后变量自动消失。

  • 性能问题:用户变量存储在内存中,如果使用太多可能会导致内存占用过多,因此在复杂应用中应谨慎使用。

 局部变量:

1. 局部变量的定义

局部变量必须在存储过程、函数或触发器的声明部分显式声明,使用 DECLARE 关键字进行定义。

DECLARE var_name datatype [DEFAULT value];
  • var_name:变量名。
  • datatype:变量的数据类型,必须是MySQL支持的数据类型,例如 INTVARCHARDECIMAL 等。
  • DEFAULT value:可选,变量的默认值。如果不指定默认值,变量的初始值为 NULL

注意:declare通常出现在begin end之间的开始部分 

与用户变量的差别:

定义方式@var_nameDECLARE var_name
作用范围当前会话存储过程、函数或触发器的执行体内
初始化不需要显式初始化,未赋值前为 NULL必须声明和初始化
使用场景在普通SQL查询中使用,跨查询只能在存储过程、函数或触发器中使用

CREATE PROCEDURE p3()
BEGIN/* 声明局部变量 */DECLARE num INT DEFAULT 0;DECLARE mone INT DEFAULT 0;/* 给局部变量赋值 */SELECT COUNT(*) INTO num FROM account;  -- 统计 account 表中的用户数SET mone := 50;  -- 将 mone 设置为 50/* 读取局部变量的值 */SELECT num, mone;  -- 输出 num 和 mone 的值
END;# 调用存储过程
call p3();
/*局部变量只在存储过程中有效,这里是无法访问的*/
select num,mone;

MySQL中的语句:

if语句: 

3aa642670afe4d38b685e2d39763cd11.png

判断一个数字是否为正数、负数或零。 

CREATE PROCEDURE check_simple()
BEGINdeclare num int default 5;if num > 0 thenSELECT 'Positive';elseif num < 0 THENSELECT 'Negative';elseSELECT 'Zero';end if;
END;#调用存储过程
call check_simple();

 参数:

参数类型说明

  • IN:输入参数,存储过程调用时传入的值,默认就是 IN
  • OUT:输出参数,存储过程会通过该参数输出结果。
  • INOUT:即输入又输出,调用时传入值,存储过程修改后返回。
drop procedure check_simple2;CREATE PROCEDURE check_simple2(in num int, out ans varchar(10))
BEGINif num > 0 thenset ans := 'Positive';elseif num < 0 THENset ans := 'Negative';elseset ans := 'Zero';end if;
END;
# 不能用局部变量,需要用用户变量
call check_simple2(10,@ans);
select @ans;

case语句:

a0d753d7f56b4b8a9024c9c35988c3e0.png

CREATE PROCEDURE GetMonthName(IN month_num INT, OUT month_name VARCHAR(20))
BEGINCASE month_numWHEN 1 THEN SET month_name = 'January';WHEN 2 THEN SET month_name = 'February';WHEN 3 THEN SET month_name = 'March';WHEN 4 THEN SET month_name = 'April';WHEN 5 THEN SET month_name = 'May';WHEN 6 THEN SET month_name = 'June';WHEN 7 THEN SET month_name = 'July';WHEN 8 THEN SET month_name = 'August';WHEN 9 THEN SET month_name = 'September';WHEN 10 THEN SET month_name = 'October';WHEN 11 THEN SET month_name = 'November';WHEN 12 THEN SET month_name = 'December';ELSE SET month_name = 'Invalid Month';END CASE;
END;

调用存储过程:

-- 定义输出变量
SET @result = '';-- 调用存储过程,传入月份编号
CALL GetMonthName(5, @result);-- 查看返回的结果
SELECT @result;
CREATE PROCEDURE p8(IN month INT, OUT season VARCHAR(20))
BEGINCASE WHEN month BETWEEN 3 AND 5 THEN SET season := '春季';   -- 春季WHEN month BETWEEN 6 AND 8 THEN SET season := '夏季';   -- 夏季WHEN month BETWEEN 9 AND 11 THEN SET season := '秋季';   -- 秋季WHEN month = 12 OR month = 1 OR month = 2 THEN SET season := '冬季';   -- 冬季ELSE SET season := '无效的月份';  -- 无效的月份END CASE;
END;-- 调用存储过程
CALL p8(12, @season);  -- 输入月份12
SELECT @season;        -- 输出季节

while循环:

基本语法

WHILE condition DO-- 循环执行的语句
END WHILE;
  • condition:这是循环的条件,返回 true 时,循环将继续执行。如果条件返回 false,循环将结束。
  • DO...END WHILE:表示在 DOEND WHILE 之间的代码是循环体,即在每次循环迭代中会执行的内容。

查找1~num中的所有偶数和


# while 循环
drop procedure p5;create procedure p5(in num int ,out sum int)
begin# 初始化sum,否则sum始终为0set sum := 0;while num > 0 doif num % 2 = 0  thenset sum := sum + num;end if;set num := num - 1;end while;
end;

repeat循环:

REPEAT 循环是 MySQL 中的另一种循环控制结构,与 WHILE 循环类似,用于重复执行一段代码,直到满足指定的条件。不同之处在于,REPEAT 循环会先执行一次代码块,然后检查条件,条件为 true 时退出循环。因此,它至少会执行一次。

基本语法:

REPEAT-- 循环执行的语句
UNTIL condition
END REPEAT;
  • UNTIL condition:表示循环何时结束。当 conditiontrue 时,循环终止。
  • REPEAT...UNTIL:表示先执行循环体中的代码,再判断是否满足退出条件。

REPEAT 循环与 WHILE 循环的区别:

  1. REPEAT 循环是先执行后判断,所以即使一开始条件不满足,循环体中的代码也会至少执行一次。
  2. WHILE 循环是先判断条件再执行,如果条件一开始就不满足,循环体中的代码一次也不会执行。

1. 计算从 1 到 n 的数字之和

# repeat循环
drop procedure p6;create procedure p6(in n int,out sum int)
beginset sum := 0;repeatif n % 2 = 0 thenset sum := sum + n;end if;set n := n -1;until n <= 0 #注意这里不能添加分号,满足条件就结束循环end repeat;
end;call p6(6,@sumRepeat);
select @sumRepeat;

loop循环:

在 MySQL 中,LOOP 是最基本的循环控制结构之一,它会一直执行循环体中的语句,直到使用 LEAVE 语句退出循环。LOOP 循环通常用于需要手动控制循环终止条件的场景,和 WHILE 以及 REPEAT 循环相比,LOOP 循环不依赖条件,而是必须手动退出。

label_name: LOOP-- 循环体的语句IF condition THENLEAVE label_name;  -- 当条件满足时,退出循环END IF;
END LOOP;
# loop循环 输出1~9,并且不输出5
drop procedure p7;
create procedure p7()
begindeclare i int default 0;myloop : loopset i := i + 1;# 判断是否为5,iterate相当于continueif i = 5 theniterate myloop;end if;if i = 10 thenleave myloop;end if;select i;end loop;end;call p7();

存储过程的游标

在数据库的存储过程中,游标是一个非常有用的工具,它允许程序逐行处理查询结果中的数据。这在需要对查询结果的每一行进行复杂处理或计算时尤其有用。下面是使用游标的一些基本步骤:

1. 声明游标:首先需要声明游标,并定义它将执行的查询。例如,在SQL Server中,可以这样声明一个游标:注意:声明游标需要再声明普通变量之后

DECLARE my_cursor CURSOR FOR
SELECT column1, column2 FROM my_table WHERE condition;
  • DECLARE my_cursor CURSOR FOR:这是声明游标的开始。my_cursor 是游标的名称,你可以用它来引用和操作游标。
  • SELECT column1, column2 FROM my_table WHERE condition;:这部分是一个 SQL 查询语句,它定义了游标将要检索的数据。游标 my_cursor 会访问 my_table 表,并且只选择那些满足 condition 条件的行。在这个查询中,它只会检索 column1 和 column2 这两列的数据。

2. 打开游标:一旦声明了游标,就需要打开它以开始访问行。

 OPEN my_cursor;

3. 获取数据:可以逐行从游标中提取数据。通常,这会涉及到一个循环,每次循环读取一行数据。

FETCH  FROM my_cursor INTO @variable1, @variable2;

这里`@variable1`和`@variable2`是存储从游标中获取的数据的变量。这里把获取的一行的俩列储存在变量中

4. 循环处理数据:一般使用循环(如`WHILE`)来持续从游标中提取数据,并对每行数据进行处理。此处没有处理死循环,将在异常处理改进

drop procedure  if exists test;create procedure test()
begin/*   声明变量   */declare name varchar(10) default null;declare money int default 0;declare done boolean default true;/*   声明游标   */declare test_cursor cursor for select account.name,account.money from account;/*   打开游标   */open test_cursor;/*   使用游标   */while true dofetch test_cursor into name,money;select name,money;end while;/*   关闭游标   */close test_cursor;
end;call test();

出现问题 

account表中数据如下: 

但是输出:

原因:

当前代码中的 while true do 循环没有判断 fetch 是否成功。因为当游标遍历到结果集的末尾时,fetch 不会成功,也不会自动退出循环,导致程序只输出第一个人后陷入无限循环。 

5. 关闭游标:处理完所有数据后,关闭游标是一个好习惯。

CLOSE my_cursor;

游标虽然在处理逐行数据时非常有用,但通常来说,它们比批量操作或集合操作要慢。因此,除非确实需要对数据进行逐行处理,否则推荐尽量使用更优化的集合操作来提高性能。

存储过程的异常处理

DECLARE {EXIT | CONTINUE} HANDLER FOR condition_value action_statement;

主要组成部分:

  • condition_value:定义处理的条件类型,例如:
    • SQLEXCEPTION:捕获所有 SQL 异常,除了 SQLWARNINGNOT FOUND
    • SQLWARNING:捕获所有 SQL 警告。
    • NOT FOUND:处理未找到数据或游标到达末尾的情况。
    • SQLSTATE 'value':指定具体的 SQLSTATE 错误码。
  • action_statement:当条件触发时执行的操作,例如:CLOSE cursor_name
drop procedure  if exists test;create procedure test()
begin/*   声明变量   */declare name varchar(10) default null;declare money int default 0;declare done boolean default true;/*   声明游标   */declare test_cursor cursor for select account.name,account.money from account;/* 声明退出处理 */declare exit handler for not found set done = 1;/*   打开游标   */open test_cursor;/*   使用游标   */while done dofetch test_cursor into name,money;select name,money;end while;/*   关闭游标   */close test_cursor;
end;call test();

存储函数

1. 存储函数:

   存储函数是带有返回值的存储过程它的参数只允许是 `IN`(输入参数)但是IN不能显示声明,没有 `OUT` 或 `INOUT` 参数。语法格式如下:

CREATE FUNCTION function_name (parameter_list) RETURNS data_type [characteristics]
BEGIN-- function bodyRETURN ...;
END;

2. 特征:(提高效率)

  • deterministic: 确定性函数。每次传递相同的参数时,返回的结果是固定的。标记为确定性函数可以帮助优化器进行缓存,提高执行效率。

  • no sql: 函数不涉及任何 SQL 语句,即不执行数据库查询操作。该特性告知 MySQL 优化器不需要为该函数考虑查询缓存或其他数据库优化措施。

  • reads sql data: 函数可以执行只读 SQL 查询,告知 MySQL 优化器该函数会访问数据库,但不执行写操作。

    /*
    存储函数
    案例:计算1~n的所有偶数之和
    */drop function if exists sum_fun;create function sum_fun(n int) returns int DETERMINISTIC
    begindeclare result int default 0;while n > 0 doif n % 2 = 0 thenset result := result + n;end if;set n := n - 1;end while;return result;
    end;/* 调用存储函数 */
    set @result = sum_fun(100);
    select @result;
    

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

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

相关文章

Acwing BFS

一般通过队列实现&#xff0c;当边的权值相同时具有最短性&#xff0c;可以求最少操作步数。相比DFS无需回溯&#xff0c;而是逐层搜索。 Acwing 844 走迷宫 输入样例&#xff1a; 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 输出样例&#xff1a; 8 思路分析&am…

Spring Boot蜗牛兼职网:全栈开发

第4章 系统设计 4.1 系统体系结构 蜗牛兼职网的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 蜗牛兼职网结构图&#xff0c;如图4-3所示。 图4-3 蜗牛兼职网结构图 4.2开发流程设计 系统流程的分析是通…

[今日Arxiv] 思维迭代:利用内心对话进行自主大型语言模型推理

思维迭代&#xff1a;利用内心对话进行自主大型语言模型推理 Iteration of Thought: Leveraging Inner Dialogue for Autonomous Large Language Model Reasoning URL&#xff1a;https://arxiv.org/abs/2409.12618 注&#xff1a;翻译可能存在误差&#xff0c;详细内容建议…

Java -2

常用API System 可以获取当前时间&#xff0c;以此计算运行代码的时间也可以控制代码的结束 //获取当前时间点-毫秒 1970 1-1 8:00 long num System.currentTimeMillis(); System.out.println(num);//系统退出运行 System.exit(0); Runtime 获取操作系统的线程大小 能从操…

YOLOv8改进 | 主干网络 | 将backbone替换为Swin-Transformer结构【论文必备】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

Tansformer代码实现

目录 1.Tansformer架构图 2.代码实现 2.1创建类&#xff1a;实现基于位置的前馈网络 2.2创建 残差&LN层标准归一化的类 2.3编码器block 2.4创建编码器 2.5创建解码器 2.6transformer解码器部分 3.知识点个人理解 1.Tansformer架构图 2.代码实现 2.1创建类&…

连续数组问题

目录 一题目&#xff1a; 二思路&#xff1a; 三代码&#xff1a; 一题目&#xff1a; leetcode链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二思路&#xff1a; 思路&#xff1a;前缀和&#xff08;第二种&#xff09;化0为-1hash&#xff1a; 这样可以把…

【大模型实战篇】一种关于大模型高质量数据的处理方法-无标注数据类别快速识别及重复数据检测(加权向量-卷积神经网络-聚类算法结合)

1. 背景介绍 大模型的能力很大程度上依赖于高质量的数据&#xff0c;在之前的一篇文章《高质量数据过滤及一种BoostedBaggingFilter处理方法的介绍》中&#xff0c;我们介绍了大模型的数据处理链路&#xff0c;本文继续关注在高质量数据的模块。 本文所要介绍的处理方法&…

vscode 配置django

创建运行环境 使用pip安装Django&#xff1a;pip install django。 创建一个新的Django项目&#xff1a;django-admin startproject myproject。 打开VSCode&#xff0c;并在项目文件夹中打开终端。 在VSCode中安装Python扩展&#xff08;如果尚未安装&#xff09;。 在项…

滑动窗口经典题目

目录 滑动窗口 什么是滑动窗口&#xff1f; 什么时候用滑动窗口&#xff1f; 怎么用滑动窗口&#xff1f; 209. 长度最小的子数组&#xff08;滑动窗口的引入&#xff09; 3. 无重复字符的最长子串 1004. 最大连续1的个数 III 1658. 将 x 减到 0 的最小操作数 904. 水…

Fyne ( go跨平台GUI )中文文档-容器和布局 (四)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

【重学 MySQL】三十七、聚合函数

【重学 MySQL】三十七、聚合函数 基本概念5大常用的聚合函数COUNT()SUM()AVG()MAX()MIN() 使用场景注意事项示例查询 聚合函数&#xff08;Aggregate Functions&#xff09;在数据库查询中扮演着至关重要的角色&#xff0c;特别是在处理大量数据时。它们能够对一组值执行计算&a…

37. Vector3与模型位置、缩放属性

本文章给通过组对象Group (opens new window)给大家讲解一下threejs层级模型或树结构的概念。 Group层级模型(树结构)案例 下面代码创建了两个网格模型mesh1、mesh2&#xff0c;通过THREE.Group类创建一个组对象group,然后通过add方法把网格模型mesh1、mesh2作为设置为组对象g…

Vuex的使用看这一篇就够了

Vuex概述 Vuex 是一个专为 Vue.js 应用程序开发的状态管理库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以一种可预测的方式来保证状态以一种可预测的方式发生变化。 state状态 把公用的数据放到store里的state就行了&#xff0c;上面是vue2的代码&#xff0c;下…

[大语言模型] LINFUSION:1个GPU,1分钟,16K图像

1. 文章 2409.02097 (arxiv.org)https://arxiv.org/pdf/2409.02097 LINFUSION: 1 GPU, 1 MINUTE, 16K IMAGE 摘要 本文介绍了一种新型的扩散模型LINFUSION&#xff0c;它能够在保持高分辨率图像生成性能的同时显著降低时间和内存复杂度。该模型采用了基于Transformer的UNet进…

【前端】ES6:Class语法和Class继承

文章目录 1 Class语法1.1 类的写法1.2 getter与setter1.3 静态属性和静态方法 2 Class继承 1 Class语法 1.1 类的写法 class Person {constructor(name,age){this.name name;this.age age;}say(){console.log(this.name,this.age)} } let obj new Person("kerwin&quo…

python--基础语法(2)

1.顺序语句 默认情况下&#xff0c;Python的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行的。 2.条件语句 条件语句能够表达“如果 ...否则 ...”这样的语义这构成了计算机中基础的逻辑判定条件语&#xff0c; 也叫做 分支语句。表示了接下来的逻辑可能有几种走向…

SysML图例-10cm最小航天器AC-10

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> SysML图中词汇 AC10 AeroCube-10&#xff0c;大小仅为10 10 15 cm的卫星&#xff0c;更多信息参见下文&#xff1a; AeroCube-10成为迄今为止完成在轨接近操作的最小航天…

yolov8模型在手部关键点检测识别中的应用【代码+数据集+python环境+GUI系统】

yolov8模型在手部关键点检测识别中的应用【代码数据集python环境GUI系统】 背景意义 在手势识别、虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;等领域&#xff0c;手部关键点检测为用户提供了更加自然、直观的交互方式。通过检测手部关键点&#…

移动登录页:让用户开启一段美好的旅程吧。

Hi,大家好&#xff0c;我是大千UI工场&#xff0c;移动登录页千千万&#xff0c;这里最好看&#xff0c;本期分享一批移动端的登录页面&#xff0c;供大家欣赏。 本次分享的是毛玻璃/3D风格的登录页。