第8步---MySQL的存储过程和触发器

第8步---MySQL的存储过程和触发器

 1.存储过程

5开始支持的

sql集,类似Java中的代码中的方法

实现对sql的封装和服用

有输入和输出

可以声明变量

可以实现一下复杂的控制语句

1.1入门案例

基本语法

 测试数据

-- 创建表的测试数据
create table dept(deptno int primary key,dname varchar(20),loc varchar(20)
);
insert into dept values(10, '教研部','北京'),
(20, '学工部','上海'),
(30, '销售部','广州'),
(40, '财务部','武汉');create table emp(empno int primary key,ename varchar(20),job varchar(20),mgr int,hiredate date,sal numeric(8,2),comm numeric(8, 2),deptno int,
-- 	FOREIGN KEY (mgr) REFERENCES emp(empno),FOREIGN KEY (deptno) REFERENCES dept(deptno) ON DELETE SET NULL ON UPDATE CASCADE
);
insert into emp values
(1001, '甘宁', '文员', 1013, '2000-12-17', 8000.00, null, 20),
(1002, '黛绮丝', '销售员', 1006, '2001-02-20', 16000.00, 3000.00, 30),
(1003, '殷天正', '销售员', 1006, '2001-02-22', 12500.00, 5000.00, 30),
(1004, '刘备', '经理', 1009, '2001-4-02', 29750.00, null, 20),
(1005, '谢逊', '销售员', 1006, '2001-9-28', 12500.00, 14000.00, 30),
(1006, '关羽', '经理', 1009, '2001-05-01', 28500.00, null, 30),
(1007, '张飞', '经理', 1009, '2001-09-01', 24500.00, null, 10),
(1008, '诸葛亮', '分析师', 1004, '2007-04-19', 30000.00, null, 20),
(1009, '曾阿牛', '董事长', null, '2001-11-17', 50000.00, null, 10),
(1010, '韦一笑', '销售员', 1006, '2001-09-08', 15000.00, 0.00, 30),
(1011, '周泰', '文员', 1008, '2007-05-23', 11000.00, null, 20),
(1012, '程普', '文员', 1006, '2001-12-03', 9500.00, null, 30),
(1013, '庞统', '分析师', 1004, '2001-12-03', 30000.00, null, 20),
(1014, '黄盖', '文员', 1007, '2002-01-23', 13000.00, null, 10);create table salgrade(grade int primary key,losal int,hisal int
);
insert into salgrade values
(1, 7000, 12000),
(2, 12010, 14000),
(3, 14010, 20000),
(4, 20010, 30000),
(5, 30010, 99990);

存储过程创建

-- =============================存储过程==================
-- 创建存储过程
delimiter $$
CREATE PROCEDURE  proc01()
BEGIN
SELECT empno,ename FROM emp;
END $$
delimiter ;-- 调用存储过程
call proc01();

 

 1.2局部变量

用户自定在beigin和end中是有效的

基本语法

DECLARE 变量名称 数据类型 DEFAULT '默认值';
DECLARE var_name01 VARCHAR(20) DEFAULT '默认值';

set方式赋值

-- 用户变量
delimiter $$
CREATE PROCEDURE  proc02()
BEGIN
DECLARE var_name01 VARCHAR(20) DEFAULT '默认值';
SET var_name01='张三';
SELECT var_name01;
END $$
delimiter ;-- 调用存储过程
call proc02();

 insert into的方式赋值

-- 采用insert into的方式赋值
delimiter $$
CREATE PROCEDURE  proc03()
BEGIN
DECLARE var_name01 VARCHAR(20) DEFAULT '默认值';
SELECT ename into var_name01 FROM emp WHERE empno='1001';
SELECT var_name01;END $$
delimiter ;-- 调用存储过程
call proc03();

 注意只能是一行的数据,要是多行的话就会出现错误了,要是那样的话就会出现错误.

 

1.3会话变量

当连接的时候一直有效的变量


-- 会话变量
DROP PROCEDURE proc05;
delimiter $$
CREATE PROCEDURE  proc05()
BEGIN
set @var_name='张伞';
SELECT @var_name;
END $$
delimiter ;-- 调用存储过程
call proc05();
SELECT @var_name;

 

 会话变量不仅可以在函数中可以进行使用,也是可以在函数外边进行使用的.

 

1.4系统变量

my.ini中可以存储一些系统变化.

会话变量是建立连接的时候初始化的.

所有的系统变量都会有一份会话变量的拷贝的变量.

全局会影响到整个mysql,但是会话的话只能影响到当前的会话

系统变量


-- 查看全部的全局变量
SHOW GLOBAL VARIABLES;-- 查看某一个
SELECT @@global.auto_increment_increment  ;-- 修改全局变量的值
SELECT @@global.sort_buffer_size  ;set GLOBAL sort_buffer_size =262144;
set @@GLOBAL sort_buffer_size =262144;

会话变量

只需要将global改成session就可以了

-- 查看全部的会话变量
SHOW SESSION VARIABLES;-- 查看某一个
SELECT @@SESSION.auto_increment_increment  ;-- 修改会话变量的值
SELECT @@SESSION.sort_buffer_size  ;set SESSION sort_buffer_size =262145;

1.5in关键字

此处的in关键字是输入参数的含义不是子查询的关键字

可以给存储过程的方法进行传递参数

仅仅在函数的内部进行使用的

-- 传入员工编号查看员工的信息
DROP PROCEDURE IF EXISTS proc07;
delimiter $$
CREATE PROCEDURE proc07(IN param_eno INT)
BEGINSELECT * FROM emp WHERE empno=param_eno;END $$
delimiter ;CALL proc07(1002);

 

-- 传入部门名和薪资,查询指定部门并且薪资大于指定值的员工信息
DROP PROCEDURE IF EXISTS proc08;
delimiter $$
CREATE PROCEDURE proc08 (IN param_dname VARCHAR(20),IN param_salary DOUBLE)-- 传入部门名喝薪资,查询指定部门并且薪资大于指定值的员工信息(IN param_eno INT)
BEGINSELECT * FROM dept d  JOIN  emp e ON  d.deptno=e.deptno  and  d.dname= param_dname and  e.sal>param_salary ;END $$
delimiter ;CALL proc08('销售部',20000);

1.6out关键字

将里面值传出去

-- ======OUT关键字
-- 传入员工的编号返回员工的名字
DROP PROCEDURE IF EXISTS proc09;
delimiter $$
CREATE PROCEDURE proc09 (IN param_eno INT ,OUT out_name VARCHAR(20))
-- 传入部门名喝薪资,查询指定部门并且薪资大于指定值的员工信息(IN param_eno INT)
BEGINSELECT ename into out_name FROM emp  WHERE empno =param_eno ;
END $$
delimiter ;CALL proc09(1002,@o_name);SELECT @o_name;

 再查看一下员工的薪资

DROP PROCEDURE IF EXISTS proc09;
delimiter $$
CREATE PROCEDURE proc09 (IN param_eno INT ,OUT out_name VARCHAR(20),OUT out_salary DECIMAL(7,2))
-- 传入部门名喝薪资,查询指定部门并且薪资大于指定值的员工信息(IN param_eno INT)
BEGIN
SELECT ename ,sal INTO out_name ,out_salary FROM emp  WHERE empno =param_eno ;
END $$
delimiter ;CALL proc09(1002,@o_name,@o_salary);SELECT @o_name,@o_salary;

 

1.7inout关键字

可以传入也可以传出

-- 以10倍的输出
DROP PROCEDURE IF EXISTS proc10;
delimiter $$
CREATE PROCEDURE proc10 (INOUT param_eno INT )
BEGIN
SET param_eno=param_eno*10;
END $$
delimiter ;SET @nox=5;
CALL proc10(@nox);SELECT  @nox;

 


-- 传入员工名字,拼接部门号,传入薪资,求出年薪
DROP PROCEDURE IF EXISTS proc11;
delimiter $$
CREATE PROCEDURE proc11 (INOUT in_ename VARCHAR(20) ,INOUT sal DOUBLE )
BEGIN
SELECT CONCAT_WS('-',deptno,ename) INTO in_ename  FROM emp WHERE emp.ename=in_ename;
SET sal=sal*12;
END $$
delimiter ;set @e='周瑜',@s=1000;CALL proc11(@e,@s);SELECT @e,@s;

 

 

1.8存储过程流程控制语句

-- 传入员工名字,拼接部门号,传入薪资,求出年薪
DROP PROCEDURE IF EXISTS proc11;
delimiter $$
CREATE PROCEDURE proc11 (INOUT in_ename VARCHAR(20) ,INOUT sal DOUBLE )
BEGIN
SELECT CONCAT_WS('-',deptno,ename) INTO in_ename  FROM emp WHERE emp.ename=in_ename;
SET sal=sal*12;
END $$
delimiter ;set @e='周瑜',@s=1000;CALL proc11(@e,@s);SELECT @e,@s;-- 流程判断
-- 利用流程控制语句
DROP PROCEDURE IF EXISTS proc11;
delimiter $$
CREATE PROCEDURE proc11(IN socre INT)
BEGIN
IF socre<60 THENSELECT '不及格';
ELSEIF socre>=60 AND socre <80 THEN
SELECT '及格';ELSEIF socre>=80 AND socre <=100 THENSELECT '优秀';
ELSESELECT '天才';
END IF;
END $$
delimiter ;CALL proc11(75);-- 输入员工的名字,判断工资的情况
DROP PROCEDURE IF EXISTS proc12;
delimiter $$
CREATE PROCEDURE proc12(IN in_ename VARCHAR(20))
BEGIN
DECLARE in_salary DECIMAL(7,2); -- 定义一个薪资
SELECT sal into in_salary FROM emp WHERE ename=in_ename; -- 将指定员工的薪资查询出来
-- 下面进行薪资的判断
IF in_salary<10000 THENSELECT '1万元以下';
ELSEIF 	in_salary<20000  THENSELECT '2万元以下,1万元以上';
ELSESELECT '2万元以上';
END IF;END $$
delimiter ;CALL proc12('张飞');CALL proc12('甘宁');

1.9分支语句

case在存储过程中的使用

和if差不多,类似Java中的switch。

语法格式有两种

其中一种是数值的匹配,还有一种是单纯的进行表达式的判断的结构的。

 

-- =======case分支语句============================
DROP PROCEDURE IF EXISTS proc13;
delimiter $$
CREATE PROCEDURE proc13(IN pay_type int)
BEGIN
CASE pay_typeWHEN  1 THENSELECT '支付宝';WHEN  2 THENSELECT '微信支付';ELSESELECT '未知支付方式';
END CASE;
END $$
delimiter ;call proc13(1);

采用第二种语法格式实现的

DROP PROCEDURE IF EXISTS proc14;
delimiter $$
CREATE PROCEDURE proc14(IN pay_type int)
BEGIN
CASE WHEN  pay_type=1  THENSELECT '支付宝';WHEN  pay_type=2 THENSELECT '微信支付';ELSESELECT '未知支付方式';
END CASE;
END $$
delimiter ;call proc14(1);

 

1.10循环语句

MySQL中的循环的方式

MySQL中的循环的方式

while
repeat
loop
循环跳出
leave 类似break,跳出当前的循环
iterate 和continue,结束本次循环

1.11while循环

语法格式

 创建下面的表

CREATE TABLE `t_user` (`uid` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

循环插入line条数据

-- =================================循环语句============================
-- 循环插入line条数据
DROP PROCEDURE IF EXISTS proc15;
delimiter $$
CREATE PROCEDURE proc15( IN line INT )
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i<=line DOINSERT INTO t_user(name,password) VALUES (CONCAT('张',i),'123456');SET i=i+1;
END WHILE;
END $$
delimiter ;call proc15(5);

 加入对应的循环控制的操作

-- 加上基本的流程控制语句DROP PROCEDURE IF EXISTS proc15;
delimiter $$
CREATE PROCEDURE proc15( IN line INT )
BEGIN
DECLARE i INT DEFAULT 1;
label:WHILE i<=line DOINSERT INTO t_user(name,password) VALUES (CONCAT('张',i),'123456');IF i=5 THENLEAVE label;end IF;SET i=i+1;
END WHILE label;
END $$
delimiter ;call proc15(5);

 要是解决这个死循环的操作的话可以把+1的操作放在前面进行操作。这样就不吹出现死循环的操作了。

1.12repeat循环操作

-- repeat的操作
DROP PROCEDURE IF EXISTS proc16;
delimiter $$
CREATE PROCEDURE proc16( IN line INT )
BEGIN
DECLARE i INT DEFAULT 10;
label:REPEATINSERT INTO t_user(name,password) VALUES (CONCAT('张',i),'123456');SET i=i+1;UNTIL i>=line -- 跳出循环的操作
END REPEAT label;END $$
delimiter ;call proc16(15);

上面的操作会插入5条数据。

1.13loop循环


-- loop操作
DROP PROCEDURE IF EXISTS proc17;
delimiter $$
CREATE PROCEDURE proc17( IN line INT )
BEGIN
DECLARE i INT DEFAULT 1;
label:LOOPINSERT INTO t_user(name,password) VALUES (CONCAT('赵',i),'123456');SET i=i+1;if i>lineTHEN LEAVE label;END IF;-- 跳出循环的操作
END LOOP label;END $$
delimiter ;call proc17(5);

1.14游标

存储查询结果,对查询的结果进行额外的处理的,是相当于多行的数据的,不是单行的数据的。

下面不是完整的操作

  • 下面的操作只能获取一行的数据

OPEN my_cursor;-- 获取数据 执行一次获取一行的数据
FETCH my_cursor into  var_empno,var_empname,var_sal;
SELECT var_empno,var_empname,var_sal;-- 关闭游标
CLOSE my_cursor;

可以采用循环的操作实现游标数据的读取的操作

-- ===================游标操作====================
-- 输入部门名查询这个部门的员工的详细的信息
DROP PROCEDURE IF EXISTS proc18;
delimiter $$
CREATE PROCEDURE proc18( IN in_name VARCHAR(50) )
BEGIN-- 局部变量
DECLARE var_empno int;
DECLARE var_empname VARCHAR(50);
DECLARE var_sal DECIMAL(7,2);-- 声明游标
DECLARE my_cursor CURSOR FOR 
SELECT empno,ename,sal
FROM  emp e JOIN dept d ON d.deptno=e.deptno and  d.dname=in_name;-- 打开游标
OPEN my_cursor;
label:LOOP-- 获取数据 执行一次获取一行的数据
FETCH my_cursor into  var_empno,var_empname,var_sal;
SELECT var_empno,var_empname,var_sal;END LOOP label;-- 关闭游标
CLOSE my_cursor;END $$ ;
delimiter ;call proc18('销售部');

上面的代码是存在问题的,虽然可以实现展示全部的数据但是展示的全部的数据是有问题的,有些数据并不是我们想要展示的。存在错误。

1.15句柄操作

解决读取到最后一行数据的操作

其实就是类似一种异常操作的处理

有三种执行的方式

  • 继续执行

  • 停止执行

  • 不执行

出现错误有错误码。错误的名字等信息。

-- ===================游标操作====================
-- 输入部门名查询这个部门的员工的详细的信息
DROP PROCEDURE IF EXISTS proc18;
delimiter $$
CREATE PROCEDURE proc18( IN in_name VARCHAR(50) )
BEGIN-- 局部变量
DECLARE var_empno int;
DECLARE var_empname VARCHAR(50);
DECLARE var_sal DECIMAL(7,2);-- 声明游标
DECLARE my_cursor CURSOR FOR 
SELECT empno,ename,sal
FROM  emp e JOIN dept d ON d.deptno=e.deptno and  d.dname=in_name;-- 打开游标
OPEN my_cursor;
label:LOOP-- 获取数据 执行一次获取一行的数据
FETCH my_cursor into  var_empno,var_empname,var_sal;
SELECT var_empno,var_empname,var_sal;END LOOP label;-- 关闭游标
CLOSE my_cursor;END $$ ;
delimiter ;call proc18('销售部');-- 句柄操作
DROP PROCEDURE IF EXISTS proc18;
delimiter $$
CREATE PROCEDURE proc18( IN in_name VARCHAR(50) )
BEGIN-- 局部变量
DECLARE var_empno int;
DECLARE var_empname VARCHAR(50);
DECLARE var_sal DECIMAL(7,2);
DECLARE flag INT DEFAULT 1; -- 定义一个标志-- 声明游标
DECLARE my_cursor CURSOR FOR 
SELECT empno,ename,sal
FROM  emp e JOIN dept d ON d.deptno=e.deptno and  d.dname=in_name;-- 定义异常的处理的方式
-- 出现问题了该怎么做,是继续进行执行还是终止exit,还是undo不支持
-- 触发的条件
-- 异常出现之后执行什么东西 设置flag的值 到时候不进行执行DECLARE CONTINUE HANDLER FOR 1329  SET flag=0;-- 打开游标
OPEN my_cursor;
label:LOOP-- 获取数据 执行一次获取一行的数据
FETCH my_cursor into  var_empno,var_empname,var_sal;-- 判断flag 是0的话不进行执行
IF flag =1 THENSELECT var_empno,var_empname,var_sal;ELSELEAVE label;END IF;END LOOP label;-- 关闭游标
CLOSE my_cursor;END $$ ;
delimiter ;call proc18('销售部');

1329是一个错误代码找不到的错误的代码。当找不到数据的时候就进行捕获了,走我们原先定义号的操作。

1.16总结

特点:

  • 代码复用

  • 比正常写代码的时候是快的

变量的范围有好几种

  • 局部:select into

  • 全局:@@变量名称

  • 用户:@变量名称

会话变量直接进行select就可以创建。

系统变量可以设置在本地的my.ini文件中。

分支语句

  • 两种语法格式

循环

  • while

  • repeat+until

  • loop:本身是一个死循环,需要借助if设置条件

1.17创建存储函数

需要先执行set GLOBAL log_bin_trust_function_creators=true;

不然会出现安全认证的错误不能成功的执行我们的函数不然话没法执行成功的。

-- 允许创建函数权限信任
set GLOBAL log_bin_trust_function_creators=true;-- 创建存储函数
DROP FUNCTION IF EXISTS test;delimiter $$ 
CREATE FUNCTION test() RETURNS int 
BEGINDECLARE cnt INT DEFAULT 0;SELECT count(*) INTO cnt  FROM emp;
RETURN cnt;
END $$delimiter ;SELECT test();

下面执行实际的表的操作

-- 传入员工的名称返回员工的名字
DROP FUNCTION IF EXISTS test;delimiter $$ 
CREATE FUNCTION test(in_no int ) RETURNS VARCHAR(50) 
BEGINDECLARE out_name  VARCHAR(50) ;SELECT ename INTO out_name  FROM emp WHERE empno=in_no;
RETURN out_name;
END $$delimiter ;SELECT test('1001');

 和存储过程的操作是类似的,但是是基于select查询的操作进行执行的不是call执行的。

 2.触发器

实际上是表之间关系的一种操作

是自动执行的操作,只有增删改查的操作才会记录对应的日志的信息。

只能支持行的数据触发,只有行中的数据变化才能触发触发器

2.1基本操作

什么条件触发

什么时候触发

触发频率

定义在表上还是定义附属在表 上

-- ====================触发器===================================
-- 创建触发器CREATE TRIGGER  触发器名称 BEFORE |AFTER 触发事件
ON 表名 for each ROW
BEGIN
执行语句列表
END

创建测试的表

CREATE TABLE `s_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;CREATE TABLE `user_log` (`id` int(11) NOT NULL AUTO_INCREMENT,`time` datetime DEFAULT NULL,`log_text` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;-- 创建好两张测试的表
DROP TRIGGER IF EXISTS tri_1;
CREATE TRIGGER  tri_1 
AFTER INSERT
ON s_user
FOR EACH ROW
BEGIN
INSERT INTO user_log VALUES(NULL,NOW(),'添加新用户') ;
END;INSERT INTO `pz`.`s_user` (`id`, `name`, `password`) VALUES (1, '张伞', '123456');

 

-- 当数据被修改的时候也是会记录对应的修改的信息
DROP TRIGGER IF EXISTS tri_2;
CREATE TRIGGER  tri_2 
BEFORE UPDATE
ON s_user
FOR EACH ROW
BEGIN
INSERT INTO user_log VALUES(NULL,NOW(),'有用户被修改') ;
END;UPDATE `pz`.`s_user` SET `name` = '李四', `password` = '123456' WHERE `id` = 1;

 

 

2.2NEW和OLD

是触发器的两个关键字记录的是修改前和修改后的用户的数据的信息

 

  • 插入的时候只能获取new的数据

  • 修改可以获取old和new的数据

  • delete可以获取old的数据

获取的时候直接

  • old.列名

  • new.列名

-- 记录修改前和修改后的数据
DROP TRIGGER IF EXISTS tri_1;
CREATE TRIGGER  tri_1 
AFTER INSERT
ON s_user
FOR EACH ROW
BEGIN
INSERT INTO user_log VALUES(NULL,NOW(),CONCAT_WS('-','添加新用户','用户名',new.name,'密码',new.password)) ;
END;INSERT INTO `pz`.`s_user` (`id`, `name`, `password`) VALUES (NULL, '张伞', '123456');

 

-- 记录修改前和修改后的数据
-- 自增的数据也是可以获取的
DROP TRIGGER IF EXISTS tri_1;
CREATE TRIGGER  tri_1 
AFTER INSERT
ON s_user
FOR EACH ROW
BEGIN
INSERT INTO user_log VALUES(NULL,NOW(),CONCAT_WS('-','添加新用户','账号',new.id,'用户名',new.name,'密码',new.password)) ;
END;INSERT INTO `pz`.`s_user` (`id`, `name`, `password`) VALUES (NULL, '张伞', '123456');

-- 修改后的数据DROP TRIGGER IF EXISTS tri_1;
CREATE TRIGGER  tri_1 
BEFORE UPDATE
ON s_user
FOR EACH ROW
BEGIN
INSERT INTO user_log VALUES(NULL,NOW(),CONCAT_WS('-','修改前用户','账号',old.id,'用户名',old.name,'密码',old.password)) ;
INSERT INTO user_log VALUES(NULL,NOW(),CONCAT_WS('-','修改后用户','账号',new.id,'用户名',new.name,'密码',new.password)) ;
END;UPDATE `pz`.`s_user` SET `name` = '李四修改', `password` = '12345678' WHERE `id` = 1;

 

 

 

DROP TRIGGER IF EXISTS tri_1;
CREATE TRIGGER  tri_1 
AFTER DELETE
ON s_user
FOR EACH ROW
BEGIN
INSERT INTO user_log VALUES(NULL,NOW(),CONCAT_WS('-','删除前用户','账号',old.id,'用户名',old.name,'密码',old.password)) ;
END;DELETE FROM s_user WHERE `id` = 1;

 

 

 

2.3其他操作

-- 查看触发器
SHOW TRIGGERS;-- 删除触发器
DROP TRIGGER IF EXISTS tri_1;

 

2.4注意事项

不能对本表的数据进行增删改的操作,避免递归

消耗资源

可以转换成后台的代码,转化成代码的操作

维护是困难的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python土力学与基础工程计算.PDF-土的三项组成

5.3 Python求解 Python 求解代码如下&#xff1a; 1. # 定义已知参数 2. G_s 2.7 # 比重 3. w 0.2 # 含水量 4. e 0.6 # 孔隙比 5. gamma_w 9.81 # 水的重度 6. 7. # 根据公式计算饱和度 8. S_r G_s * w / e 9. print("饱和度为", S_r) 10. 11.…

JVM核心原理解读(一)---执行引擎

Java虚拟机规范制定了Java字节码执行引擎的概念模型,Java执行引擎作用概括起来就是执行编译产生的Java class文件,为用户提供了底层OS的调用,屏蔽了不同平台硬件和OS的差异性,使得编写的代码无差别的在各个平台运行; JVM运行时内存结构 运行时栈帧 局部变量表---方法的局部变…

创建git项目并提交

1.创建仓库 2.点击创建 3复制gitee码云的HttpS连接 4 提交上传 打开项目并点击菜单栏上的【CVS】–》【Import into version control】–》【Create Git Repository】创建本地仓库 在打开的【Create Git Repository】对话框内选择本地仓库的位置&#xff0c;这里我选择…

java八股文面试[数据结构]——Map有哪些子类

知识来源&#xff1a; 【23版面试突击】 用过哪些Map类&#xff0c;都有什么区别&#xff0c;HashMap是线程安全的吗&#xff1f;_哔哩哔哩_bilibili https://www.cnblogs.com/bubbleboom/p/12694013.html

RISC-V公测平台发布 · 数据库在RISC-V服务器上的适配评估

前言 上一期讲到YCSB在RISC-V服务器上对MySQL进行性能测试&#xff08;RISC-V公测平台发布 使用YCSB测试SG2042上的MySQL性能&#xff09;&#xff0c;在这一期文章中&#xff0c;我们继续深入讨论RISC-V数据库的应用。本期就继续利用HS-2平台来测试数据库软件在RISC-V服务器…

HarmonyOS ArkUI 属性动画入门详解

HarmonyOS ArkUI 属性动画入门详解 前言属性动画是什么&#xff1f;我们借助官方的话来说&#xff0c;我们自己简单归纳下 参数解释举个例子旋转动画 位移动画组合动画总结 前言 鸿蒙OS最近吹的很凶&#xff0c;赶紧卷一下。学习过程中发现很多人吐槽官方属性动画这一章比较敷…

CSS 盒子模型

前言 盒子模型-组成 CSS盒子模型是一种用来描述元素在页面布局中占据空间的模型。它将每个元素看作由内容区域、内边距、边框和外边距组成的一个矩形框。 盒子模型的组成部分包括&#xff1a; 内容区域&#xff08;Content&#xff09;&#xff1a;显示元素的实际内容&#xf…

商城的TPS与并发用户数是如何换算的?

商城的TPS与并发用户数的换算关系可以通过以下公式计算&#xff1a; TPS 并发用户数 / 平均事务响应时间 其中&#xff0c;平均事务响应时间是指系统处理一个事务所需的平均时间。 下面是商城性能测试的一些用例示例&#xff1a; 用户登录&#xff1a; 目标&#xff1a;测…

Docker的革命:容器技术如何重塑软件部署之路

引言 在过去的几年中&#xff0c;容器技术已经从一个小众的概念发展成为软件开发和部署的主流方法。Docker&#xff0c;作为这一变革的先驱&#xff0c;已经深深地影响了我们如何构建、部署和运行应用程序。本文将探讨容器技术的起源&#xff0c;Docker如何崛起并改变了软件部…

centos7安装MySQL8

Centos7安装MySQL8 MySQL版本&#xff1a;8.0.34 1.安装前准备 &#xff08;1&#xff09;查看是否安装mariadb [rootkb135 ~]# rpm -qa|grep mariadb &#xff08;2&#xff09;卸载mariadb并检查是否卸干净 [rootkb135 ~]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x8…

vue 简单实验 v-on html事件绑定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"event-handling"><p>{{ message }}</p><button v-on:click"reverseMessage">反转 Message</but…

Selenium环境+元素定位大法

selenium 与 webdriver Selenium 是一个用于 Web 测试的工具&#xff0c;测试运行在浏览器中&#xff0c;就像真正的用户在手工操作一样。支持所有主流浏览器 WebDriver 就是对浏览器提供的原生API进行封装&#xff0c;使其成为一套更加面向对象的Selenium WebDriver API。 使…

限制立方样条(RCS)中的P for overall和P for nonlinear的计算

最近不少人私信我&#xff0c;说有些SCI文章报了两个P值一个是P for overall,一个是P for nonlinear,就像下图这样&#xff0c;问我P for overall怎么计算。 P for overall我也不清楚是什么&#xff0c;有些博主说这个是总效应的P值&#xff0c;但是我没有找到相关出处。但是怎…

CnetSDK .NET OCR SDK Crack

CnetSDK .NET OCR SDK Crack CnetSDK.NET OCR库SDK是一款高度准确的.NET OCR扫描仪软件&#xff0c;用于使用手写、文本和其他符号等图像进行字符识别。它是一款.NET OCR库软件&#xff0c;使用Tesseract OCR引擎技术&#xff0c;可将字符识别准确率提高99%。通过将此.NET OCR扫…

CodeSite for .NET Crack

CodeSite for .NET Crack CodeSite for.NET与Visual Studio集成&#xff0c;通过实时查看器日志记录系统提供对代码执行的更深入了解&#xff0c;该系统有助于在本地或远程执行代码时快速查找问题。超越传统的断点调试&#xff0c;在应用程序继续运行时记录应用程序的执行&…

Java基础之IO流File类创建及删除

1.File类概述及构造方法 2.File类创建功能 文件创建成功&#xff01; 如果文件不存在&#xff0c;就创建文件&#xff0c;并返回true 如果文件存在&#xff0c;就不创建文件&#xff0c;并返回false 如果文件夹不存在&#xff0c;就创建文件夹&#xff0c;并返回true 如果文件…

python 开发环境(PyCharm)搭建指南

Python 的下载并安装 参考&#xff1a;Python基础教程——搭建Python编程环境 下载 Python Python 下载地址&#xff1a;官网 &#xff08;1&#xff09;点击【Downloads】>>>点击【Windows】>>>点击【Python 3.x.x】下载最新版 Python&#xff1b; Pyt…

【VS Code插件开发】消息通信(四)

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域优质作者、阿里云专家博主&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4e2; 资料领取&#xff1a;前端…

Sim/circuit10

通过观察可知&#xff0c;在a、b同时为0或1时&#xff0c;state的值改变 state的值可以改变q的输出&#xff0c;1为ab的同或&#xff0c;0为异或 利用assign q进行输出 module top_module (input clk,input a,input b,output q,output state );always(posedge clk)if(a&…

国标GB2818视频平台EasyGBS国标平台与车机设备连接显示未连接成功的问题解决方法

EasyGBS平台可提供流媒体接入、处理、转发等服务&#xff0c;支持内网、公网的监控设备通过国标GB/T28181协议进行视频监控直播。平台兼容性强&#xff0c;只要设备支持国标GB28181协议&#xff0c;均能快速接入EasyGBS&#xff0c;实现视频的监控直播、视频录像、语音对讲、云…