SQL知识汇总

news2024/9/30 1:29:34

什么时候用存储过程合适

  1. 当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时就要考虑用存储过程;
  2. 当在一个事务的完成需要很复杂的商业逻辑时(比如,对多个数据的操作,对多个状态的判断更改等)要考虑;
  3. 还有就是比较复杂的统计和汇总也要考虑。

使用存储过程的优缺点

优点

  1. 速度快。尤其对于较为复杂的逻辑,减少了网络流量之间的消耗。
  2. 写程序简单,采用存储过程调用类,调用任何存储过程都只要1-2行代码。
  3. 升级、维护方便。
  4. 调试其实也并不麻烦,可以用查询分析器。

缺点

  1. 可移植性差。
  2. 数据量大时会比较耗时。

on duplicate key update实现(批量)插入或更新操作

一. 背景

  1. 背景:业务上经常有这样的需求场景,如果之前有这条数据,就做更新;如果没有,就做新增。
  2. 常用的处理方案:通过主键id或者其他唯一键判断DB中是否有这条数据,再判断调用insert或update语句。这样做逻辑处理起来比较复杂,降低代码效率,而且如果并发量高,可能会存在数据问题。

二. on duplicate key update概述

  1. 为了应对这种业务场景,MySQL有一种专有语法(insert into ... on duplicate key update),一条SQL语句实现插入或更新,可单条可批量。
  2. 使用要点
    1. 表要求必须有主键或唯一索引才能起效果,否则insert或update无效。
    2. 该语法是根据主键或唯一键来判断是新增还是更新。
    3. VALUES() 后面应为需要更新的字段,不需要更新的字段不用罗列。
    4. 遇到已存在记录(根据唯一键或主键)时,自动更新已有的数据;如果表中有多个唯一键(可以是单列索引或复合索引),则任意一个唯一键冲突时,都会自动更新数据。
    5. 所有操作均由SQL处理,不需要额外程序代码分析,能够大幅提高程序执行效率。

三. on duplicate key update的使用

创建测试—book科目表

CREATE TABLE `book` (
  `id` int NOT NULL AUTO_INCREMENT,
  `unique_code` varchar(30) NOT NULL,
  `book_name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_code` (`unique_code`) USING BTREE COMMENT 'book unique_code'
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

执行如下命令

insert into book(
            unique_code,
           book_name
      ) values (
            'zs-001',
            '中文'
      ) on duplicate key update book_name='数学';

成功插入一条数据
在这里插入图片描述

再次执行步骤一命令你会发现book_name值改变

在这里插入图片描述

Mysql中substring_index函数的使用

一、语法

substring_index(“待截取有用部分的字符串”,“截取数据依据的字符”,截取字符的位置N)

二、案例

SELECT SUBSTRING_INDEX(‘58.33.115.130’, ‘.’, 1); //结果是58

//以第一个句号为分割截取

SELECT SUBSTRING_INDEX(‘58.33.115.130’, ‘.’, -1); //结果是130

//从后面开始算第一个句号

SELECT SUBSTRING_INDEX(‘58.33.115.130’, ‘.’, 2); //结果是58.33

使用PREPARE 动态执行sql语句

PREPARE STMT FROM @sql_str; EXECUTE STMT; DEALLOCATE PREPARE STMT;

  1: DROP TABLE IF EXISTS alarm;
  2: CREATE TABLE alarm     ( id int(11) NOT NULL  auto_increment, name    varchar(255) default NULL,PRIMARY KEY (id));
  3:  
  4: INSERT INTO alarm (name) values('aa');
  5: INSERT INTO alarm (name) values('bb');
  6:  
  7: DROP procedure if exists statalarm;
  8: delimiter // 
  9: create procedure statalarm()
 10: begin
 11: SET @id  = '1,2';
 12: 
 13: SET @sql = 'select * from alarm where id IN (?)';
 14: PREPARE stmt FROM @sql;
 15: /* 
 16:  注意 EXECUTE 的最终语句是:select * from alarm where id IN ('1,2');
 17:  而不是 select * from alarm where id IN (1,2);
 18:  这是因为如果用户变量的值是字符串,在EXECUTE时 会自动的在变量的值前后加上引号
 19:  */
 20: EXECUTE stmt USING @id;
 21: DEALLOCATE PREPARE stmt;
 22: /*
 23:  如果想要 组成select * from alarm where id IN (1,2);可以使用下面的语句
 24: */
 25: SET @sql = concat('select * from alarm where id IN (',@id,')');
 26: PREPARE stmt FROM @sql;
 27: EXECUTE stmt ;
 28: DEALLOCATE PREPARE stmt;
 29:  
 30: end;//
 31: delimiter ;

DECLARE CONTINUE HANDLER FOR NOT FOUND 解释

在mysql的存储过程中经常会看到这句话:DECLARE CONTINUE HANDLER FOR NOT FOUND。

它的含义是:若没有数据返回,程序继续,并将变量IS_FOUND设为0 。

JAVA调用存储过程–MYSQL

业务代码

private void statFieldCollectByOpFlag(int opFlag){
        log.info("开始统计成果量opflag-{}", opFlag);

        try {
            Date date = new Date();
            String statDate = DateUtil.formatDate(date, "yyyy-MM-dd");
            // 如果当前时间在6点以前,则统计前一天的
            int hour = date.getHours();
            if (hour <= 6){
                statDate = DateUtil.formatDate(DateUtil.dateDiffer(date, "D",-1), "yyyy-MM-dd");
            }

            Map<String, Object> map = new HashMap<String, Object>();
            map.put("i_op_flag", opFlag);
            map.put("i_stat_date", statDate);
            map.put("o_err_no", 0);
            map.put("o_err_msg", "");
            try {
                statFruitRecordService.statFruitCountInfoByProc(map);

                BigDecimal bigDecimal= (BigDecimal)map.get("o_err_no");
                Integer errNo = bigDecimal.intValue();
                if ( !errNo.equals(0) ){
                    String errMsg = (String)map.get("o_err_msg");
                    log.error("统计成果量["+opFlag+"]异常["+errNo.toString()+"]"+errMsg);
                }
            } catch (Exception e) {
                log.error("统计成果量["+opFlag+"]异常", e);
            }
            log.info("结束统计成果量opflag-{}", opFlag);
        } catch (Exception e) {
            log.error("结束统计成果量["+opFlag+"]异常", e);
        }
    }

Mapper代码

<select id="statFruitCountInfo" parameterType="map" statementType="CALLABLE">
		{
			call sp_stat_fruit_record(
				#{map.i_op_flag			, mode=IN	, jdbcType=NUMERIC},
            	#{map.i_stat_date	    , mode=IN	, jdbcType=VARCHAR},
            	#{map.o_err_no		    , mode=OUT	, jdbcType=NUMERIC},
            	#{map.o_err_msg		    , mode=OUT	, jdbcType=VARCHAR}
          	)
        }
	</select>

存储过程

-- --------------------------------------------------------
-- 主机:                           xx.xx.xx.xx
-- 服务器版本:                     5.7.27-log - MySQL Community Server (GPL)
-- 服务器操作系统:                 linux-glibc2.12
-- HeidiSQL 版本:                 11.0.0.5919
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

-- 导出  存储过程 sp_stat_fruit_record 结构
DROP PROCEDURE IF EXISTS `sp_stat_fruit_record`;
DELIMITER //
CREATE PROCEDURE `sp_stat_fruit_record`(
	IN `i_op_flag` int,
	IN `i_stat_date` varchar(10),
	OUT `o_err_no` int,
	OUT `o_err_msg` varchar(128)
)
    COMMENT '[104]入库成果量统计'
update_proc:
BEGIN
	#Routine body goes here...
	DECLARE sp_code INT DEFAULT 104;
	-- START Declare Conditions
	DECLARE sql_err_code INT DEFAULT 0;
	DECLARE var_cnt INT DEFAULT 0;
	DECLARE var_size INT DEFAULT 0;
	DECLARE var_idx INT DEFAULT 0;
	DECLARE var_tail varchar(16) DEFAULT '';
	
	DECLARE CONTINUE HANDLER FOR 1054 SET sql_err_code = 1054;
	-- Unknown column
	DECLARE CONTINUE HANDLER FOR 1062 SET sql_err_code = 1062;
	-- Duplicate entry
	DECLARE CONTINUE HANDLER FOR 1329 SET sql_err_code = 0;
	-- No data - zero rows fetched, SELECT ed, or processed
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION set sql_err_code = 9999;
	-- END Declare Conditions
	-- check param
	-- START TRANSACTION;
	IF 1 != 1
		OR (i_op_flag IS NULL AND '' <> (@param_name := 'i_op_flag'))
		OR (i_stat_date IS NULL AND '' <> (@param_name := 'i_stat_date'))
	THEN
		SET o_err_no = fn_sp_errno(sql_err_code, sp_code, 1);
		SET o_err_msg = CONCAT('缺少参数', @param_name);
		LEAVE update_proc;
	END IF;

	SET @element_codes = 'aoi,building,aoi_gate,unit,poi,room,internal_road';
	-- i_stat_date格式 'YYYY-MM-DD'
	-- i_op_flag
	-- 1 转历史
	-- 2 截止昨日总量统计
	-- 3 当日审核入库统计
	-- 4 当日采集入库统计
	IF 1 = i_op_flag THEN
		# 保留1周的数据
		SET @del_date = CONCAT(DATE_SUB(i_stat_date, INTERVAL 1 WEEK), ' 00:00:00');
		
		SET var_size = LENGTH(@element_codes)- LENGTH(REPLACE(@element_codes,",","")) + 1;
		SET var_idx=1;
		WHILE var_idx <= var_size  DO
			SET var_tail = SUBSTRING_INDEX(SUBSTRING_INDEX(@element_codes,',',var_idx),',',-1);
			
			SET @sql_str = CONCAT('INSERT INTO his_fruit_', var_tail, ' SELECT * FROM t_fruit_', var_tail, ' WHERE update_time < "', @del_date, '"');
			PREPARE STMT FROM @sql_str;EXECUTE STMT;DEALLOCATE PREPARE STMT;
			IF 0 <> sql_err_code THEN
				SET o_err_no = fn_sp_errno(sql_err_code, sp_code, 11);
				SET o_err_msg = CONCAT('审核成果转历史失败', var_tail);
				LEAVE update_proc;
				LEAVE update_proc;
			END IF;
			
			SET @sql_str = CONCAT('DELETE FROM t_fruit_', var_tail, ' WHERE update_time < "', @del_date, '"');
			PREPARE STMT FROM @sql_str;EXECUTE STMT;DEALLOCATE PREPARE STMT;
			IF 0 <> sql_err_code THEN
				SET o_err_no = fn_sp_errno(sql_err_code, sp_code, 12);
				SET o_err_msg = CONCAT('审核成果转历史失败', var_tail);
				LEAVE update_proc;
			END IF;
			
			SET @sql_str = CONCAT('INSERT INTO his_collect_fruit_', var_tail, ' SELECT * FROM t_collect_fruit_', var_tail, ' WHERE update_time < "', @del_date, '"');
			PREPARE STMT FROM @sql_str;EXECUTE STMT;DEALLOCATE PREPARE STMT;
			IF 0 <> sql_err_code THEN
				SET o_err_no = fn_sp_errno(sql_err_code, sp_code, 13);
				SET o_err_msg = CONCAT('采集成果转历史失败', var_tail);
				LEAVE update_proc;
			END IF;
			
			SET @sql_str = CONCAT('DELETE FROM t_collect_fruit_', var_tail, ' WHERE update_time < "', @del_date, '"');
			PREPARE STMT FROM @sql_str;EXECUTE STMT;DEALLOCATE PREPARE STMT;
			IF 0 <> sql_err_code THEN
				SET o_err_no = fn_sp_errno(sql_err_code, sp_code, 14);
				SET o_err_msg = CONCAT('采集成果转历史失败', var_tail);
				LEAVE update_proc;
			END IF;
			
			SET var_idx = var_idx + 1;
		END WHILE;
	-- 2 截止昨日总量统计
	ELSEIF 2 = i_op_flag THEN
		SELECT COUNT(1) INTO var_cnt FROM t_stat_fruit_record WHERE stat_date = '0000-00-00';
		IF 0 <> sql_err_code THEN
			SET o_err_no = fn_sp_errno(sql_err_code, sp_code, 21);
			SET o_err_msg = '截止昨日总量统计失败';
			LEAVE update_proc;
		END IF;
		
		IF var_cnt = 0 THEN
			INSERT INTO t_stat_fruit_record
			SELECT '0000-00-00', sum(right_count), sum(error_count), 'ALL',sum(right_count), sum(error_count), now(), now() FROM t_stat_fruit_record;
			
			INSERT INTO t_stat_fruit_record
			SELECT '0000-00-00', sum(right_count), sum(error_count), element_code, sum(right_count), sum(error_count), now(), now() FROM t_stat_fruit_record
			WHERE element_code != 'ALL'
			GROUP BY element_code;
		ELSE
			UPDATE t_stat_fruit_record SET plan_project_id = right_count, plan_collect_id = error_count, update_time = now() WHERE stat_date = '0000-00-00';
		END IF;
		IF 0 <> sql_err_code THEN
			SET o_err_no = fn_sp_errno(sql_err_code, sp_code, 22);
			SET o_err_msg = '截止昨日总量统计失败';
			LEAVE update_proc;
		END IF;
	-- 3 当日审核入库统计
	ELSEIF 3 = i_op_flag THEN
		SET @start_date = CONCAT(i_stat_date, ' 00:00:00');
		SET @end_date = CONCAT(i_stat_date, ' 23:59:59');
		SET var_size = LENGTH(@element_codes)- LENGTH(REPLACE(@element_codes,",","")) + 1;
		SET var_idx=1;
		WHILE var_idx <= var_size  DO
			SET var_tail = SUBSTRING_INDEX(SUBSTRING_INDEX(@element_codes,',',var_idx),',',-1);
			
			SET @sql_str = CONCAT(' 
				INSERT INTO t_stat_fruit_record
				SELECT 
					"',i_stat_date,'", project_manage_id, plan_id, "', var_tail,'"
					, SUM(CASE WHEN result_type = 1 THEN 1 ELSE 0 END) AS  rightCount
					, SUM(CASE WHEN result_type = 2 THEN 1 ELSE 0 END) AS  errorCount
					, now(), now()
				FROM t_fruit_', var_tail, ' 
				WHERE update_time >= "', @start_date, '" AND update_time <= "', @end_date, '"
				GROUP BY project_manage_id, plan_id
				ON DUPLICATE KEY UPDATE
					right_count = VALUES(right_count)
					, error_count = VALUES(error_count)
					, update_time = VALUES(update_time) '
			);
			-- SELECT @sql_str;
			PREPARE STMT FROM @sql_str;EXECUTE STMT;DEALLOCATE PREPARE STMT;
			IF 0 <> sql_err_code THEN
				SET o_err_no = fn_sp_errno(sql_err_code, sp_code, 31);
				SET o_err_msg = CONCAT('截止昨日总量统计失败', var_tail);
				LEAVE update_proc;
			END IF;
			
			SET var_idx = var_idx + 1;
		END WHILE;
	-- 4 当日采集入库统计
	ELSEIF 4 = i_op_flag THEN
		SET @start_date = CONCAT(i_stat_date, ' 00:00:00');
		SET @end_date = CONCAT(i_stat_date, ' 23:59:59');
		SET var_size = LENGTH(@element_codes)- LENGTH(REPLACE(@element_codes,",","")) + 1;
		SET var_idx=1;
		WHILE var_idx <= var_size  DO
			SET var_tail = SUBSTRING_INDEX(SUBSTRING_INDEX(@element_codes,',',var_idx),',',-1);
			
			SET @sql_str = CONCAT(' 
				INSERT INTO t_stat_fruit_collect
				SELECT 
					"',i_stat_date,'", project_manage_id, plan_id, "', var_tail,'"
					, SUM(CASE WHEN result_type = 1 THEN 1 ELSE 0 END) AS  rightCount
					, SUM(CASE WHEN result_type = 2 THEN 1 ELSE 0 END) AS  errorCount
					, now(), now()
				FROM t_collect_fruit_', var_tail, ' 
				WHERE update_time >= "', @start_date, '" AND update_time <= "', @end_date, '"
				GROUP BY project_manage_id, plan_id
				ON DUPLICATE KEY UPDATE
					right_count = VALUES(right_count)
					, error_count = VALUES(error_count)
					, update_time = VALUES(update_time) '
			);
			-- SELECT @sql_str;
			PREPARE STMT FROM @sql_str;EXECUTE STMT;DEALLOCATE PREPARE STMT;
			IF 0 <> sql_err_code THEN
				SET o_err_no = fn_sp_errno(sql_err_code, sp_code, 41);
				SET o_err_msg = CONCAT('截止昨日总量统计失败', var_tail);
				LEAVE update_proc;
			END IF;
			
			SET var_idx = var_idx + 1;
		END WHILE;
	ELSE
		SET o_err_no = fn_sp_errno(sql_err_code, sp_code, 99);
		SET o_err_msg = '未支持的操作类型';
		LEAVE update_proc;
	END IF;

	-- ok
	-- COMMIT;
	-- ok
	SET o_err_no = 0;
END//
DELIMITER ;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

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

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

相关文章

05.rabbitMQ之搭建的各种坑

1.持久化需要重新设置队列 2.异步发布确认的坑, 生产者发消息太快只会确认最大的编号 1.消费者还是要确认消息 channel.basicAck(message.getEnvelope().getDeliveryTag(), false); 因为你发送的太快了&#xff0c;只会返回成功接收的最大的编号 3.消费者消息堆积(开启了消息手…

InnoDB 磁盘结构之数据字典和双写缓冲区

数据字典&#xff08;InnoDB Data Dictionary&#xff09; MySQL中&#xff0c;数据字典包括了: 表结构、数据库名或表名、字段的数据类型、视图、索引、表字段信息、MySQL版本信息、存储过程、触发器等内容 InnoDB数据字典由内部系统表组成&#xff0c;这些表包含用于查找表…

7万字水利数字孪生工程解决方案(word可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 1.1 系统开发方案 1.1.1 系统设计开发思路 &#xff08;1&#xff09;基于层次分解的设计 xxx水利数字孪生工程将采用基于层次分解的系统模型,系统采用这种方式进行层次划…

【P5】JMeter CSV Data Set Config(CSV 数据文件设置)

文章目录 一、测试计划演示二、CSV Data Set Config&#xff08;CSV 数据文件设置&#xff09;主要参数说明2.1、忽略首行&#xff1a;True2.2、是否允许带引号&#xff1f;&#xff1a;False2.3、遇到文件结束符再次循环&#xff1f;&#xff1a;False2.4、遇到文件结束符停止…

Apache 可能会出手接盘 Google Wave

尽管Google计划在明年终止Google Wave项目&#xff0c;但他们提供Wave in a Box开源项目允许你在自己的服务器上跑一个Google Wave服务玩。据The Register报道&#xff0c;Apache Software Group正在试图将Wave in a Box移植到目前的管理系统里。尽管目前还处于早期孵化阶段&am…

AI模型部署概述

心口如一&#xff0c;犹不失为光明磊落丈夫之行也。——梁启超 文章目录 :smirk:1. AI模型部署方法:blush:2. AI模型部署框架ONNXNCNNOpenVINOTensorRTMediapipe如何选择 :satisfied:3. AI模型部署平台 &#x1f60f;1. AI模型部署方法 在AI深度学习模型的训练中&#xff0c;…

链游“风暴之年”已来 一文解读Web3游戏的前生今世

链上世界进入游戏市场&#xff0c;让越来越多游戏厂商不由得感叹区块链游戏&#xff08;简称“链游”&#xff09;的风暴之年正在加速到来。如今&#xff0c;游戏活动转变了单一的休闲娱乐理念&#xff0c;逐渐走向Web3发展个性化、可定义的未来。 前不久&#xff0c;阿里云作为…

S3C6410 中的 irqdomain 之 gpio

文章目录 VIC domain 与 gpio domain 的硬件拓扑图描述linux cascaded irq domainlinux irq domain 实例VIC domain 与 gpio domain 的硬件拓扑语言描述VIC 与 INT_EINTx 的关系INT_EINTx 与 GPIO的关系INT_EINT0INT_EINT1INT_EINT2INT_EINT3INT_EINT4INT_EINT4 与 External in…

【Elasticsearch】DSL操作相关

文章目录 DSL操作索引操作新建索引查询索引查看所有索引删除索引 映射操作创建映射查看映射索引映射关联(同创建映射类似) 文档操作创建文档查询指定ID文档查询所有文档全局修改文档局部修改文档删除文档条件删除 数据搜索数据准备条件查询(match)多字段条件查询(multi_match)关…

VMware 虚拟机中 Linux 系统Centos7磁盘空间扩容(亲测)

1.修改虚拟机磁盘容量 例如之前虚拟机磁盘空间为30G&#xff0c;现要将磁盘容量设置为50G 打开虚拟机&#xff08;必须处于关机状态&#xff09;&#xff0c;点击【编辑虚拟机设置】&#xff0c;然后点击【磁盘】&#xff0c;接着点击【扩展】&#xff0c;输入修改后的最大磁盘…

LangChain入门(二)-通过 Google 搜索并返回答案

GitHub - liaokongVFX/LangChain-Chinese-Getting-Started-Guide: LangChain 的中文入门教程LangChain 的中文入门教程. Contribute to liaokongVFX/LangChain-Chinese-Getting-Started-Guide development by creating an account on GitHub.https://github.com/liaokongVFX/La…

js实现继承属性和方法

js实现继承属性和方法 1 使用extends实现继承2 原型链继承3 组合继承4 寄生组合继承5 实例继承6 拷贝继承7 扩展7.1 函数中方法定义在函数内部、函数外、prototype上的区别7.2 class创建实例与构造函数创建实例 首先定义一个父类 function Animal (name, age) {this.name nam…

Java Web案例:实现用户登录功能

文章目录 零、本节学习目标一、纯JSP方式实现用户登录功能&#xff08;一&#xff09;实现思路&#xff08;二&#xff09;实现步骤1、创建Web项目2、创建登录页面3、创建登录处理页面4、创建登录成功页面5、创建登录失败页面6、编辑项目首页 &#xff08;三&#xff09;测试结…

【JavaEE】CSS基础知识

文章目录 1.CSS概念1.1CSS是干啥的&#xff1f;1.2基础语法规范1.2基础语法规范1.3引入格式✨内部样式表✨行内样式表✨外部样式&#xff08;最常用的样式&#xff09; 1.4代码风格✨样式格式✨样式大小写 2.选择器2.1选择器的功能2.2基础选择器有哪些&#xff1f;&#x1f6e0…

GPT 告诉你请求到达 Tomcat 是怎么处理的

tomcat如何监听请求到达 没有SpringMVC,tomcat 如何处理请求 Tomcat 线程池的作用是什么 如何配置tomcat 线程池 tomcat 线程池的主要任务是处理连接请求 tomcat线程池是怎么实现的 到这里可以看出来&#xff0c;tomcat线程池的实现方式也是通过ThreadPoolExecutor 实现 如何根…

Git 使用教程整理

一、配置Git 编码为utf-8 设置登陆账号 使用Git GUI操作 二、获取远程仓库代码 推荐使用使用 git bash 命令&#xff1a;git clone xxx git clone https://github.com/jeromeetienne/jquery-qrcode.git 其他参考&#xff1a;使用Git获取最新版本到本地_gitgui 获取新版本_天…

【Java开发】Spring Cloud 11 :Gateway 配置 ssl 证书(https、http 访问)

最近研究给微服务项目配置 ssl 证书&#xff0c;如此才可以对接微信小程序&#xff08;需要使用 https 请求&#xff09;。传统单体项目来说&#xff0c;首先往项目中添加证书文件&#xff0c;然后在配置文件中配置 ssl 证书路径、密码等相关信息&#xff1b;那么微服务这么多项…

高性能定时器--时间轮/多级时间轮

运行原理 指针指向轮子上的一个槽&#xff0c;轮子以恒定的速度顺时针转动&#xff0c;每转动一步就指向下一个槽&#xff08;虚线指针指向的槽&#xff09;&#xff0c;每次转动称为一个tick&#xff0c;一个tick的时间称为时间轮的槽间隔slot interval&#xff0c;即心搏时间…

3。数据结构(2)

嵌入式软件开发第三部分&#xff0c;各类常用的数据结构及扩展&#xff0c;良好的数据结构选择是保证程序稳定运行的关键&#xff0c;&#xff08;1&#xff09;部分包括数组&#xff0c;链表&#xff0c;栈&#xff0c;队列。&#xff08;2&#xff09;部分包括树&#xff0c;…

JavaWeb_Web前端_Element组件库

JavaWeb_Web前端_Element组件库 快速入门安装ElementUI组件库引入ElementUI组件库添加组件并导入到根组件添加组件导入到根组件 Table 表格Pagination 分页Dialog对话框表单 案例Vue路由Vue类DeptView.vue动态视图组件请求链接组件 打包和部署打包打包按钮打包文件 部署部署静态…