进阶-4.视图、存储过程、存储函数、触发器

news2024/11/15 8:34:44

视图、存储过程、存储函数、触发器

    • 1.视图
      • 1.1 介绍
      • 1.2 语法
      • 1.3 视图的检查选项
      • 1.4 视图的更新
      • 1.5 视图作用
      • 1.6 案例
    • 2.存储过程
      • 21. 介绍
      • 2.2 特点
      • 2.3 语法
      • 2.4 变量
        • 2.4.1 系统变量
        • 2.4.2用户自定义变量
        • 2.4.3 局部变量
      • 2.5参数
      • 2.6条件语句
        • 2.6.1 if 语法
        • 2.6.2 case
      • 2.7循环结构
        • 2.7.1 WHILE循环
        • 2.7.2 repeat循环
        • 2.7.3 Loop循环
      • 2.8游标
    • 3.存储函数
    • 4.触发器
      • 4.1 介绍
      • 4.2 语法
      • 4.3 案例
    • 总结:

1.视图

1.1 介绍

视图是一种虚拟存在的表。视图中的数据并不是数据库中实际存在的,行和列数据来自定义视图的查询中使用的表(基表),并且是在使用时动态生成的。

视图只保存了查询的SQL逻辑,不保存查询结果。所以在创建视图的时候,主要工作是创建SQL查询语句

1.2 语法

  • 创建

CREATE [ OR REPLACE ] VIEW 视图名称[(列名列表)] AS SELECT语句 [WITH [ CASCADED
|LOCAL] CHECK OPTION ]

  • 查询

查看创建视图语句:SHOW CREATE VIEW 视图名称;
查看视图数据:SELECT * FROM 视图名称…;

  • 修改

方式一:CREATE [ OR REPLACE ] VIEW 视图名称[(列表的名称)] AS SELECT语句 [WITH [
CASCADED |LOCAL] CHECK OPTION ]

方式二:ALTER VIEW 视图名称[(列表的名称)] AS SELECT语句 [WITH [ CASCADED |LOCAL] CHECK OPTION ]

  • 删除视图

DROP VIEW [IF EXISTS] 视图名称;

实例

--创建视图
create or replace view stu_v_1 as select id,name from student where id<=20;

--查询视图
show create view stu_v_1;
SELECT * from stu_v_1;

--修改视图
create or replace view as SELECT id ,name from student;

--删除视图
drop view if EXISTS stu_v_1;

1.3 视图的检查选项

当使用WITH CHECK OPTION 子句创建视图时,MySQL会通过视图检查正在更改的每一行,例如 插入,更新,
在这里插入图片描述


-- 创建视图
create or replace view stu_v_1 as SELECT id ,name FROM student where id<=20;
-- 视图插入数据是在基表进行插入的
insert into stu_v_1 values(25,'tom');

-- 创建视图
create or replace view stu_v_1 as SELECT id ,name FROM student where id<=20 with CASCADED check option; 

create or replace view stu_v_1 as SELECT id ,name FROM student where id<=20  with local check option;

-- 修改视图
alter view stu_v_1 as select id,name from student where id<3;

删除视图
drop view if exists stu_v_1 ;




-- 查询视图
SELECT * from stu_v_1;
-- 创建视图 with cascade check option
create or replace view stu_v_1 as SELECT id ,name FROM student where id<=20;
insert into stu_v_1 values(25,'tom');#可以插入
create or replace view stu_v_2 as SELECT id ,name FROM stu_v_1 where id>10 with CASCADED check option; 

insert into stu_v_2 values(7,'tom');


insert into stu_v_2 values(25,'tom');#报错,不可以插入,依赖的视图不满足条件

insert into stu_v_2 values(15,'tom');

create or replace view stu_v_3 as select id,name from stu_v_2 where id <=15;


insert into stu_v_3 values(11,'tom');

insert into stu_v_3 values(17,'tom');#可以插入,v3没有检查选项

insert into stu_v_3 values(28,'tom');#不可以插入不满足v1

在这里插入图片描述

-- 创建视图  local check option 

create or replace view stu_v_4 as SELECT id ,name FROM stu_v_1 where id <=15;
insert into stu_v_4 values(7,'tom');#可以插入
insert into stu_v_4 values(16,'tom');#可以插入

create or replace view stu_v_5 as SELECT id ,name FROM stu_v_4 where id>10 with local check option; 

insert into stu_v_5 values(13,'tom');#可以插入


insert into stu_v_5 values (17,'tom');#可以插入 v4没有定义检查选项,不做检查


create or replace view stu_v_6 as select id,name from stu_v_2 where id <=20;


insert into stu_v_6 values(14,'tom');#可以插入

insert into stu_v_3 values(18,'tom');#可以插入

1.4 视图的更新

在这里插入图片描述

1.5 视图作用

  • 简单:

视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以定义为视图,不比每次指定条件。

  • 安全:

数据库可以授权,但不能授权到数据库特定的行和列上。通过视图用户只能查询和修改制定的字段或数据

  • 数据独立:

视图可以帮助用户屏蔽真实表结构变化带来的影响。

1.6 案例

--1.定义视图查指定的字段
create view tb_user_view as select id,name, profession,age,gender,status,CURRENT_DATE from tb_user ;

SELECT * from tb_user_view;

--2.将三表联查的sql创建为视图

CREATE or replace view  tb_stu_course_view as 
 SELECT s.name student_name,s.no, c.name  course_name from student s,student_course sc,course c where sc.studentid=s.id and sc.courseid=c.id;
 
 SELECT * from tb_stu_course_view;

2.存储过程

21. 介绍

在这里插入图片描述

多次网络请求,数据库层面将多条SQL语句封装,应用程序直接调用SQL集

2.2 特点

在这里插入图片描述

2.3 语法

  • 创建

CREATE PROCEDURE 存储过程名称([参数列表])
BEGIN
–SQL语句
END;

  • 调用

CALL 名称([参数]);

  • 删除

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

-- 存储过程基本语法
-- 创建存储过程
create procedure p1()
begin
 select count(*) from student;
end;

-- 调用

> call p1();

 

-- 查看存储过程

select * from information_schema.ROUTINES where routine_schema='test';

show create procedure p1;

-- 删除
drop procedure if exists p1;

在命令行执行需要设置结束符

delimiter $$
-- 创建存储过程
create procedure p1()
begin
 select count(*) from student;
end$$

在这里插入图片描述

2.4 变量

2.4.1 系统变量

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

  • 查看系统变量

SHOW [ SESSION | GLOBAL ] VARIABLES; – 查看系统环境变量
SHOW [ SESSION | GLOBAL ] VARIABLES LIKE ‘…’; – 可以使用like模糊匹配查找变量
SHOW @@[SESSION | GLOBAL ] 系统变量名; – 查看指定变量的值

-- 查看系统变量
show variables;#默认session

show variables like 'auto%';

show global variables like 'auto%';

select  @@session.autocommit;
  • 设置系统变量

SET [GLOBAL | SESSION ] 系统变量名= 值;
SET @@[ SESSION | GLOBAL ] 系统变量名=值;

-- 设置系统变量
set session autocommit=1;

set @@session.autocommit=0;

在这里插入图片描述

2.4.2用户自定义变量

用户定义变量:用户根据自己的需求自己定义变量,用户不用提前申明,在用的时候用“@变量名”使用就可以,其作用域当前连接会话。

  • 赋值

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 表名;

  • 使用

SELECT @ var_name;

-- 自定义变量
set @myname :='test';
set @myage = 10;

set @mygender :='男',@myhobby :='java';

select @mycolor :='red';
SELECT count(*) into @mycount from tb_user;

-- 使用 
SELECT @myname,@myage,@mygender,@myhobby;


SELECT @mycolor,@mycount;

-- 注意用户自定义的变量不需要申明或者初始化,获取值为NULL

2.4.3 局部变量

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

  • 声明

DECLARE 变量名 变量类型 [DEFAULT …];

变量类型就是数据类型:INT、BIGINT、CHAR、VARCAHR、DATE、TIME的等

  • 赋值

SET 变量名= 值;
SET 变量名 :=值;
SELECT 字段名 INTO 变量名 FROM 表名 …;

-- 局部变量
-- 声明
-- 赋值
CREATE procedure p2()
begin 
  declare stu_count int default 0;
	SELECT count(*) into stu_count  from student;
	SELECT stu_count;
end;

call p2();

2.5参数

在这里插入图片描述
用法:

CREATE PROCEDURE 存储过程名称([IN/OUT/INOUT 参数名 参数类型])
BEGIN
–SQL语句
END;

成绩等级

-- 存储过程为参数
CREATE procedure p4(IN score int ,OUT result varchar(10) )
begin

	if score >=85 then
		set result :='优秀';
	elseif score >= 60 then
		set result :='及格';
	else
	  set result :='不及格';
	end if;
end;
-- 将传出的参数给用户自定义参数
call p4(65,@result);
SELECT @result;

将传入的数据200转化为百分制

-- INOUT

create PROCEDURE p5(INOUT score double)
begin
 set score :=score * 0.5;
end;

set @score=198;
call p5(@score);
select @score;

2.6条件语句

2.6.1 if 语法

语法:

IF 条件1 THEN

ELSEIF 条件2 THEN – 可选

ELSE --可选

END IF;
判断分数等级

-- IF语法

drop procedure if exists p3;
CREATE procedure p3()
begin 
  declare score int default 58;
	declare result varchar(10);
	
	if score >=85 then
		set result :='优秀';
	elseif score >= 60 then
		set result :='及格';
	else
	  set result :='不及格';
	end if;
	
  SELECT result;

end;


call p3();
2.6.2 case

CASE case_value
WHEN when_value THEN statement_list
ELSE statement_list
END CASE;

在这里插入图片描述
根据传入的月份,判断季度


-- case
create procedure p6(in month int)
begin
	declare result varchar(10);
	
	 case
			when month>=1 and month <=3 then 
					set result :='第一季度';
			when month>=4 and month <=6 then 
					set result :='第二季度';
			when month>=7 and month <=9 then 
					set result :='第三季度';
			when month>=10 and month <=12 then 
					set result :='第四季度';	
			else 
					set result :='非法函数';
	end case;
	
		SELECT concat('输入月份:',month,'季度为:',result);
end;

call p6(16);

2.7循环结构

2.7.1 WHILE循环

当while循环是有条件的循环控制语句,当条件满足后,执行循环体的SQL语句
语法:

先判断条件,如果为true,则执行逻辑,否则,不执行逻辑
WHILE search_condition DO
SQL逻辑;
END WHILE;

在这里插入图片描述
while从1到n累加

-- while
-- 第一种 
drop procedure if exists p7;
create procedure p7(IN n int )
begin
  declare i int default 1;
	declare sum int default 0;
	
	WHILE i <=n DO
		set sum := sum +i;
	  set 	i := i +1;
 END WHILE;
 
select sum;
end;
call p7(5);

-- 第2种
drop procedure if exists p7;
create procedure p7(IN n int )
begin
	declare sum int default 0;
	
	WHILE n>0 DO
	 set 	sum := sum +n;
	 set 	n := n -1;
 END WHILE;
 
select sum;
end;

call p7(100);
2.7.2 repeat循环
REPEAT
statement_list
UNTIL search_condition 
END REPEAT;

在这里插入图片描述
累加

-- repeat
drop procedure if exists p8;
create procedure p8(IN n int )
begin
	declare sum int default 0;
	
	REPEAT
	set sum :=sum + n;
	set n := n -1;
  UNTIL n<=0 
  END REPEAT;
select sum;
end;

call p8(100);

2.7.3 Loop循环

LOOP实现简单循环,如果不在SQL逻辑中增加退出循环条件,可以用来实现简单死循环。loop可以配合两个语句使用

  • LEAVE:配合循环使用,退出循环。
  • ITERATE:必须用在循环中,作用是跳出当前循环剩下的语句,直接进入下一个循环

loop循环的基本格式:

[loop_label:] LOOP
loop循环语句
end loop [loop_label];

LEAVE label; – 退出指定标记的循环体
ITERATE label; – 直接进入下一次循环

-- loop

create procedure p9(IN n int )
begin
	DECLARE sum int default 0;
	
	s:loop
		if n<=0 then
			leave s;
		end if;
		
		set sum := sum + n;
		set n := n - 1;
	end loop s;
	
	SELECT sum;
end;

call p9(100);

2.8游标

游标(CURSOR) 是用来存储结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、open、fetch、close;语法如下:

  • 声明游标

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

  • 打开游标

OPEN 游标名称;

  • 获取游标

FETCH 游标名称 INTO 变量[,变量];

-关闭游标

CLOSE 游标名称;

  • 条件处理程序
    在这里插入图片描述
-- 声明游标 存储结果集
-- 准备 创建表结构
-- 开启游标
-- 获取游标的记录
-- 插入数据到新表
-- 关闭游标

create procedure p11(in uage int)
begin
 declare uname varchar(100);
	DECLARE ujob varchar(100);
	declare u_cursor CURSOR FOR  select name ,job from emp where age<=uage;
	-- 当状态码为02000 结束游标
	declare exit handler for SQLSTATE '02000' close u_cursor;
	-- declare exit handler for not found close u_cursor;

	drop table if exists emp_pro;
	create table if not exists emp_pro(
		id int primary key auto_increment,
		name VARCHAR(100),
		job varchar(100)
	);
	
	open u_cursor;
	-- 循环获取游标的数据 死循环
	while true do 
		fetch u_cursor into uname,ujob;
		insert into emp_pro values(null,uname,ujob);
	end while;
	
	close u_cursor;
	
end;

call p11(23);

3.存储函数

存储函数:是有返回值的存储过程,存储函数的参数只能是IN类型的,具体语法:

CREATE FUNCTION 存储函数名称([参数列表])
RETURNS type [characteristic …]
BEGIN
– SQL语句
RETURN …;
END;
characteristic:说明
DETERMINISTIC:相同的输入参数总是产生相同的结果
NO SQL:不包含SQL语句
READS SQL DATA:包含读取数据的语句,但不包含写入的语句

determinstic
确定性的意思,确定性的意思是,对于相同的输入参数,函数或存储过程总是返回相同的结果。这样的函数或存储过程在查询优化和缓存中具有更高的效率,因为查询优化器可以根据输入参数进行缓存和重用计算结果。

如果将存储过程或函数声明为DETERMINISTIC,则MySQL会假定它是确定性的,并且会对其进行优化。如果不声明为DETERMINISTIC,MySQL会假定该存储过程或函数是非确定性的,并且在每次调用时都会重新计算结果。

因此,使用DETERMINISTIC属性可以提高查询的性能和效率。

-- 存储函数
CREATE FUNCTION fun1(n int)
RETURNS int DETERMINISTIC
BEGIN
	declare sum int DEFAULT 0;
	
	WHILE n>0 DO
	   set sum :=sum + n;
		 set n :=n -1;
	END WHILE;

 RETURN sum;
END;


SELECT fun1(100);

4.触发器

4.1 介绍

在这里插入图片描述

4.2 语法

创建

CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tbl_name for EACH ROW – 行级触发器
BEGIN
trigger_stmt;
END;

查看

SHOW TRIGGERS;

删除

DROP TRIGGER [schema_name.]trigger_name;

4.3 案例

通过触发器记录表的数据变更,将变更日志插入到日志表log表中
准备数据

-- 触发器
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tbl_name for EACH ROW -- 行级触发器
BEGIN
	trigger_stmt;
END;
-- 查看触发器
SHOW TRIGGERS;
-- 删除触发器
DROP TRIGGER trigger_name;


-- 创建日志表,在进行insert之后写入日志
create table emp_log(
	id int(11) not null auto_increment,
	operation varchar(20) not null comment '操作类型insert、update、delete',
	operation_time datetime not null comment '操作时间',
	operation_id int not null comment '操作ID',
	operation_params varchar(500),
	primary key(id)
)engine=innodb DEFAULT CHARSET=utf8;

插入数据触发器

-- 插入数据触发器
CREATE trigger emp_trigger
	after insert on emp for each row
BEGIN
	insert into emp_log values(null,'insert',now(),new.id,CONCAT('操作的id:',new.id,'操作的name:',new.name,'操作的年龄:',new.age,'job:',new.job));
END;


-- 查看触发器
show triggers;
-- 删除触发器
drop trigger emp_trigger;

-- 插入数据,查看触发器操作
INSERT INTO `itcast`.`emp`(`id`, `name`, `age`, `job`, `salary`, `entrydate`, `managerid`, `dept_id`) VALUES (16, 'hahaha', 23, '市场', 12500, '2005-09-07', 1, 3);

修改数据触发器

-- 修改数据的触发器
CREATE trigger emp_update_trigger
	after update on emp for each row
BEGIN
	insert into emp_log values(null,'update',now(),new.id,
	CONCAT('更新之前数据操作的id:',old.id,'操作的name:',old.name,'操作的年龄:',old.age,'job:',old.job,'|
	更新之后数据操作的id:',new.id,'操作的name:',new.name,'操作的年龄:',new.age,'job:',new.job));
END;
drop trigger emp_update_trigger;
UPDATE `itcast`.`emp` SET  `age` = 99, WHERE `id` = 16;

删除数据的触发器

-- 删除数据的触发器
CREATE trigger emp_delete_trigger
	after delete on emp for each row
BEGIN
	insert into emp_log values(null,'delete',now(),old.id,
	CONCAT('删除之前数据操作的id:',old.id,'操作的name:',old.name,'操作的年龄:',old.age,'job:',old.job));
END;

总结:

在这里插入图片描述

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

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

相关文章

以GD32F103C8T6为例的核心板原理图PCB绘制学习笔记简单总结

目录 GD32F103C8T6核心板 设计流程 基础知识 部分原理图解析 排针连接 (H1 - PZ254V-12-8P): 晶振 封装 基础知识 C0603封装 C0805 F1210封装 保险丝 L0603 贴片电感 LED-0603 R0603 HDR-TH_8P-P2.54-V-M-R2-C4-S2.54 排针 按键&#xff08;SW-SMD-T6X…

解决Java使用Jsoup后台调用天地图地理编码接口的几个问题

目录 前言 一、天地图的地理编码接口 1、相关的API介绍 2、响应接口 二、使用JSOUP调用相应接口面对的问题及应对 1、第一关访问路径的问题 2、第二关UnsupportedMimeTypeException 3、可能的http获取403问题 三、总结 前言 如果你现在的项目中有如下的需求&#xff0c;…

在pytorch中TensorBoard的使用

from torch.utils.tensorboard import SummaryWriter# writer的使用 # 创建实例 writer SummaryWriter("logs") # 存储位置在logs # 使用如下的两种方法 # writer.add_image() # 标量for i in range(100):writer.add_scalar("y x", i, i)writer.close() …

力扣 | 最长公共子序列 | 动态规划 | 最长公共子序列长度、最长公共子序列

文章目录 一、1143. 最长公共子序列二、求最长公共子序列三、变式一、1035. 不相交的线二、1312. 让字符串成为回文串的最少插入次数 一、1143. 最长公共子序列 LeetCode&#xff1a;1143. 最长公共子序列 这是一道典型的二维动态规划问题&#xff0c;甚至面试都能被面到。 这…

机器人开发--Pure Pursuit纯追踪介绍

机器人开发--Pure Pursuit纯追踪介绍 1 介绍1.1 概述1.2 发展历史1.3 EKF vs MPC vs Pure Pursuit1.4 PP 前探距离的影响 2 理解普渡大学--control-algorithms/basic-pure-pursuit准备导入必要的库什么是 Pure Pursuit 控制器&#xff1f;限制如何工作线圆交点线圆交点与边界选…

JUC-Synchronized原理进阶

轻量级锁 轻量级锁的使用场景&#xff1a;如果一个对象虽然有多线程要加锁&#xff0c;但加锁的时间是错开的&#xff08;也就是没有竞争&#xff09;&#xff0c;那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的&#xff0c;即语法仍然是 synchronized 假设有两个方法同…

机器学习:opencv图像识别--图片专项

目录 前言 一、读取图片 1.安装opencv库 2.读取彩色图片 3.读取灰度图 二、RGB 1.RGB的概念 2.颜色通道&#xff1a; 3.图像表示 4.代码实现单通道图像 三、ROI 1.代码实现 四、图片打码 五、图片组合 六、图片缩放 总结 前言 OpenCV&#xff08;Open Source C…

Linux:Linux多线程

目录 线程概念 什么是线程 二级页表 线程的优点 线程的缺点 线程异常 线程用途 Linux进程VS线程 进程和线程 进程的多个线程共享 进程和线程的关系 Linux线程控制 POSIX线程库 线程创建 线程等待 线程终止 分离线程 线程ID及进程地址空间布局 线程概念 什么…

【CAN总线测试】——CAN数据链路层测试

从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者&#xff0c;时光不负有心人。 目录 2.1.位时间 2.2.采样点测试 2.3.CAN报文ID和DLC一致性检查 2.4.预期帧接收测试 2.5.非预期帧接收测试 2.6.总线负载率 1.位时间 用例编号 TG2_TC1 测试目…

android aar适配uniapp

最近有商户需要接入我们sdk&#xff0c;但是我们都是android或者ios原生的&#xff0c;直接用又不能用&#xff0c;需要做适配&#xff0c;本文就教你一步步实现android aar适配uniapp。 官方参考教程&#xff1a;开发者须知 | uni小程序SDK 但是官方写的比较繁琐&#xff0c;好…

计算机毕业设计选题推荐-Cosplay论坛系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

代码随想录训练营day27|455.分发饼干,376.摆动序列,53. 最大子序和

分发饼干 题目 思路&#xff1a;把最大的饼干分给胃口最大的人&#xff0c;所以可以先对两个数组进行排序&#xff0c;然后用双指针从后往前依次比较。如果饼干能成功头尾&#xff0c;就让饼干组的指针往前移 int biscs.size()-1; int ig.size()-1;//小孩组 for(;i>0;i--…

【摆脱被360安全卫士荼毒:使用这2个软件就够了】

保持电脑健康从拒绝使用360安全卫士开始 提示&#xff1a;不使用360安全卫士&#xff0c;电脑更健康 游戏本被360卫士荼毒的差点报废&#xff0c;感觉在使用360安全卫士后&#xff0c;笔记本的散热风扇很暴躁&#xff0c;笔记本经常高温不退&#xff0c;若你也有这样的烦恼&am…

单元格里显示曲线

想要实现的效果如下&#xff1a;表格每一行都有一个曲线 TreeList与GridControl的设置方法类似。 1、先创建控件的数据源&#xff0c;我使用的是DataTable /// <summary>/// 生成一个DataTable/// </summary>/// <returns></returns>public static Da…

【c++】强制类型转化

一、前言 在C语言中新增了四个关键字static_cast、const_cast、reinterpret_cast和dynamic_cast。这四个关键字都是用于强制类型转换的。 新类型的强制转换可以提供更好的控制强制转换过程&#xff0c;允许控制各种不同种类的强制转换。 C中风格是static_cast<type>(c…

进阶SpringBoot之 SpringSecurity(2)用户认证和授权

Spring Security 官网 Spring Security 是针对 Spring 项目的安全框架 也是 Spring Boot 底层安全模块默认的技术选型 它可以实现强大的 Web 安全控制 只需引入 spring-boot-starter-security 模块&#xff0c;进行少量配置&#xff0c;即可实现强大的安全管理 几个重要的…

首款国产“3A”游戏《黑神话:悟空》爆火,背后有哪些AI技术在助力?

近日&#xff0c;沉淀了4年的首款国产“3A”游戏《黑神话悟空》正式在各大游戏交易平台上线。 据市场研究公司VG Insights 周四晚间发布预估数据&#xff0c;《黑神话&#xff1a;悟空》自发售以来&#xff0c;三天内在 Steam 平台的销量已突破 840 万份&#xff0c;好评率超 …

速腾32线激光雷达使用方法

速腾32线激光雷达 12V电源 实体机ubuntu22.04 ROS2-humble 一、软件安装 mkdir robosense_ws cd robosense_wsmkdir src && cd src/ git clone https://github.com/RoboSense-LiDAR/rslidar_msg.git git clone https://github.com/RoboSense-LiDAR/rslidar_sdk.gi…

数学基础(六)

一、分布 正态分布 二项式分布 均匀分布 卡方分布 二、核函数 核函数的目的&#xff1a; 将低维数据转换为高维数据 线性核函数&#xff1a; Linear核函数对数据不做任何变换 当特征已经比较丰富了&#xff0c;样本数据量巨大&#xff0c;需要进行实时得出结果时进行使用…

【GH】【EXCEL】P3: Set Conditional Formatting To Excel Data By Gh

文章目录 conditional formattingdata sourceConditional ScaleConditional Scale Conditional PercentConditional Top Percent Conditional AverageConditional Average Multiple ConditionsConditional BarConditional Bar Conditional UniqueConditional Unique Conditiona…